פוסט

מה זה Python, ולמה כדאי להשתמש בו?

מה זה Python, למה הוא טוב, ובמה הוא שונה משפות כמו C ו-Java: מתורגמת בזמן ריצה, טיפוסים דינמיים, הזחה כחלק מהתחביר וספרייה סטנדרטית עשירה.

Python היא שפת תכנות עילית וכללית. התיעוד הרשמי מתאר אותה כשפה “מתורגמת, אינטראקטיבית ומונחית עצמים” שתומכת גם בסגנון פרוצדורלי ופונקציונלי. היא רצה על Windows, macOS ו-Linux, ומשתמשים בה לשרתי רשת, לסקריפטים של אוטומציה, לניתוח נתונים, למשחקים, ללימוד ועוד.

כל דוגמת קוד בסדרה הורצה בפועל, והטענות נבדקו מול התיעוד הרשמי.

קצת היסטוריה

Guido van Rossum התחיל לכתוב את Python בחגי חג המולד של 1989 ופרסם אותה ב-USENET בפברואר 1991. השם בא מתוכנית הטלוויזיה של ה-BBC Monty Python’s Flying Circus, ולא מהנחש.

השימוש בשפה חופשי, גם מסחרית. Python 2 כבר לא מתוחזקת, ולכן כל מה שכתוב כאן ובהמשך הסדרה הוא Python 3.

איך Python נראית

התוכנית הראשונה הקלאסית היא שורה אחת:

print("Hello, world!")
Hello, world!

אין פונקציית main, אין מחלקה, אין נקודה-פסיק ואין שלב קומפילציה. שומרים כ-hello.py ומריצים python3 hello.py.

במה היא שונה משפות אחרות

1. היא מתורגמת בזמן הריצה

ב-C או ב-Java קודם מקמפלים ואז מריצים. ב-Python מריצים את קוד המקור ישירות. התיעוד אומר שזה חוסך “זמן רב בפיתוח, כי אין צורך בקומפילציה ובקישור”.

יש גם מצב אינטראקטיבי: מקלידים python3 ומקבלים שורת פקודה שבה כל שורה רצה מיד. זה מקום טוב לנסות רעיונות קטנים.

שתי הסתייגויות. ההבחנה מטושטשת: המימוש הרגיל (CPython) מקמפל את הקוד ל-bytecode מאחורי הקלעים ושומר אותו בקבצי .pyc. וחוץ מזה, תוכניות מתורגמות רצות בדרך כלל לאט יותר מתוכניות מקומפלות, וזה המחיר של מחזור קצר של כתיבה והרצה.

2. ההזחה היא חלק מהתחביר

שפות אחרות מסמנות בלוקים בסוגריים מסולסלים. ב-Python מסמנים בהזחה: “קיבוץ הפקודות נעשה בהזחה ולא בסוגריים פותחים וסוגרים”.

words = ["python", "is", "readable"]
lengths = {w: len(w) for w in words}
print(lengths)
for word, n in lengths.items():
    if n > 2:
        print(word, "is longer than 2")
    else:
        print(word, "is short")
{'python': 6, 'is': 2, 'readable': 8}
python is longer than 2
is is short
readable is longer than 2

זה הקוד שהיינו כותבים בכל מקרה כדי שיהיה קריא, רק שכאן זה נאכף. הזחה בטעות היא שגיאה ולא שינוי שקט במשמעות (פוסט על הזחה).

3. אין הצהרות על טיפוסים, אבל טיפוסים קיימים

לא מצהירים על טיפוס של משתנה: “אין צורך בהצהרות על משתנים או על ארגומנטים”. שם יכול להצביע על מספר עכשיו ועל מחרוזת אחר כך:

x = 5
print(x, type(x))
x = "five"
print(x, type(x))
5 <class 'int'>
five <class 'str'>

Python היא שפה עם טיפוסים דינמיים (הטיפוס שייך לערך ונבדק בזמן הריצה), אבל לא שפה “רופפת”: ‏"5" + 1 מעלה TypeError ולא הופך את המחרוזת למספר בשקט.

Python מסתכלת על מה שאובייקט יודע לעשות ולא על השם שלו, ולכן הקוד עובד עם כל מה שמתאים. בתיעוד זה נקרא duck typing: “אם זה נראה כמו ברווז ומגעגע כמו ברווז, זה כנראה ברווז.”

def total(items):
    return sum(items)

print(total([1, 2, 3]))
print(total((1.5, 2.5)))
print(total({10, 20}))
6
4.0
30

אם רוצים, אפשר להוסיף type hints (def total(items: list[int]) -> int:), אבל הם אופציונליים ו-Python לא אוכפת אותם. הם נועדו לעורכי קוד ולכלים כמו mypy.

4. טיפוסי נתונים גדולים מובנים בשפה

רשימות ומילונים הם חלק מהשפה, ולכן פעולות מורכבות נכנסות בפקודה אחת. גם למספרים שלמים אין גודל קבוע, כך שבקוד יומיומי אין גלישה:

print(10 ** 30)
1000000000000000000000000000000

5. הזיכרון מנוהל אוטומטית

לא משחררים זיכרון ידנית. CPython משתמשת בספירת הפניות ובאספן זבל מחזורי כדי לנקות אובייקטים שאף אחד לא משתמש בהם.

6. “סוללות כלולות”

Python “מגיעה עם אוסף גדול של מודולים סטנדרטיים” לקבצים, לקריאות מערכת, ל-sockets ועוד. מעבר לזה, אינדקס החבילות Python Package Index (pypi.org) מחזיק חבילות של צד שלישי שמתקינים עם pip. הקוד מתחלק למודולים, ולכן קל להשתמש בו שוב.

אז למה היא טובה?

לפי המדריך הרשמי, תוכניות Python בדרך כלל קצרות בהרבה מתוכניות מקבילות ב-C, ב-C++ או ב-Java, והיא “ישימה לתחום בעיות רחב בהרבה מ-Awk ואפילו מ-Perl”. היא מתאימה כש:

  • רוצים להגיע מהר למשהו שעובד (סקריפטים, אוטומציה, אב-טיפוסים);
  • הקריאות חשובה יותר ממהירות גולמית;
  • צריך ספרייה שכבר קיימת, וזה קורה הרבה.

היא פחות מתאימה כשכל מיקרו-שנייה קובעת, כמו ליבות של מערכות הפעלה או מנועי משחק צמודים. גם שם Python משמשת לרוב כדבק: התיעוד מציין שאפשר לכתוב פעולות קריטיות ב-C ולקרוא להן מ-Python.

טעויות נפוצות של מתחילים

  • ערבוב טאבים ורווחים. ‏Python 3 דוחה אותו עם TabError. התיקון נמצא בפוסט על הזחה.
  • להקליד python ולקבל גרסה אחרת. בהרבה מערכות הפקודה היא python3. בודקים עם python3 --version.

מה הלאה

בפוסט הבא: print(), הפונקציה שמציגה פלט.