2.14. הגדרת פונקציות

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

מילת המפתח היא def:

def greet(name):
    print("hello,", name)

greet("Alice")
greet("Bob")

פלט:

hello, Alice
hello, Bob

השורה שמתחילה ב-def היא ההגדרה – היא יוצרת את הפונקציה אך אינה מריצה את הגוף. קריאה ל-greet("Alice") היא מה שמריץ את הבלוק המוזח.

2.14.1. פרמטרים וארגומנטים

השמות שבסוגריים בשורת ה-def הם פרמטרים – מצייני-מקום לערכים שהקורא יספק. הערכים בפועל המועברים פנימה הם ארגומנטים. פונקציה יכולה לקבל אפס או יותר פרמטרים:

def square(x):
    return x * x

def add(a, b):
    return a + b

def is_even(n):
    return n % 2 == 0

קריאה עם מספר שגוי של ארגומנטים מעלה TypeError מיד.

2.14.2. return

פקודת return מסיימת את הפונקציה מיד ומחזירה ערך לקורא:

def absolute(x):
    if x < 0:
        return -x
    return x

פונקציה שלעולם אינה מגיעה ל-return (או שיש לה return עירום ללא ערך) מחזירה None:

>>> def shout(text):
...     print(text.upper())
...
>>> result = shout("hi")
HI
>>> print(result)
None

לפונקציה יכולות להיות כמה פקודות return; הראשונה שאליה מגיעים מנצחת, ושאר הגוף מדולג.

2.14.2.1. החזרת ערכים מרובים

Python מחזירה אובייקט אחד לכל קריאה, אך אותו אובייקט יכול להיות tuple – והקורא יכול לפרק אותו במקום:

def minmax(values):
    return (min(values), max(values))

lo, hi = minmax([3, 1, 4, 1, 5, 9])

הסוגריים סביב ערך ההחזרה אופציונליים; return a, b ו-return (a, b) הם זהים.

2.14.3. Docstrings

ליטרל מחרוזת הממוקם כפקודה הראשונה בגוף הפונקציה הוא docstring. הוא נשמר על אובייקט הפונקציה והוא מה ש-help() מציג:

def scale(value, factor):
    """Multiply ``value`` by ``factor`` and return the result."""
    return value * factor

ה-IDE מציג docstrings בחלוניות הסבר כאשר הסמן מרחף מעל שם הפונקציה, ולכן אפילו סיכום בשורה אחת משתלם. מחרוזות במרכאות משולשות מאפשרות ל-docstring להשתרע על פני שורות מרובות כשפירוט נוסף שימושי.

2.14.4. מוסכמות שמות

שמות פונקציות משתמשים ב-snake_case – מילים באותיות קטנות המופרדות בקווים תחתונים. השם צריך לתאר את מה שהפונקציה עושה:

  • טוב: read_temperature, parse_header, is_valid.

  • להימנע: do_stuff, handle1, temp_func.

קו תחתון מוביל (_helper) מסמן פונקציה כפנימית למודול שלה. המוסכמה מכובדת באופן נרחב אך אינה נאכפת על ידי Python.