פייתון

נושא

לכתוב פונקציות

def, return, טווח הכרה, וארגומנטים.

מגיע מיחידות: 5, 8

בעמוד הזההשלדprint או returnכמה ערכיםטווח הכרהפונקציה היא אובייקטאיפה זה תופס אתכםבדיקה עצמית

השלד

>>> def greet(name, greeting="Hello"):
...     """Builds a greeting.
...
...     :param name: who to greet
...     :type name: str
...     :param greeting: the opening word
...     :type greeting: str
...     :return: the full greeting
...     :rtype: str
...     """
...     return greeting + ", " + name
...
>>> greet("Noa")
'Hello, Noa'
>>> greet("Noa", "Hi")
'Hi, Noa'
>>> greet(greeting="Hey", name="Noa")
'Hey, Noa'
חלק מה זה
def greet(...): הגדרה. לא מריצה כלום
name פרמטר חובה
greeting="Hello" פרמטר עם ברירת מחדל. רק אחרי פרמטרי החובה
"""...""" docstring. help(greet) מציג אותו
return מה שהפונקציה מחזירה
greet("Noa") קריאה. "Noa" הוא הארגומנט
greeting="Hey" ארגומנט לפי שם. הסדר לא משנה
print return
מה קורה מוצג על המסך חוזר למי שקרא
אפשר לשמור במשתנה לא כן
מה הפונקציה מחזירה None את הערך
>>> def show(x):
...     print(x * 2)
...
>>> def give(x):
...     return x * 2
...
>>> a = show(5)
10
>>> b = give(5)
>>> print(a, b)
None 10

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

כמה ערכים

>>> def min_max(numbers):
...     return min(numbers), max(numbers)
...
>>> low, high = min_max([4, 9, 1])
>>> low, high
(1, 9)

חוזר טאפל, ופורקים אותו לכמה משתנים.

טווח הכרה

מוגדר מוכר
גלובלי מחוץ לפונקציות בכל מקום
לוקאלי בתוך פונקציה רק בתוכה
>>> x = "global"
>>> def f():
...     x = "local"
...     return x
...
>>> f()
'local'
>>> x
'global'

השמה בתוך פונקציה יוצרת משתנה לוקאלי חדש, גם אם יש גלובלי באותו שם. לוקאלי קודם לגלובלי. global x משנה את זה, וזה לא מומלץ.

פונקציה היא אובייקט

>>> double = give
>>> double(7)
14
>>> sorted(["ccc", "a", "bb"], key=len)
['a', 'bb', 'ccc']

שם בלי סוגריים הוא הפונקציה עצמה. כך מעבירים len ל-key.

איפה זה תופס אתכם

  • שכחתם סוגריים: greet לא מריץ כלום, ואין שגיאה
  • שכחתם ארגומנט: TypeError: ... missing 1 required positional argument
  • ברירת מחדל באמצע: def f(a=1, b): הוא SyntaxError
  • משתנה לוקאלי מבחוץ: NameError
  • print במקום return: הפונקציה מחזירה None, ומה שבא אחריה נשבר

בדיקה עצמית

  1. מה מחזירה def f(): pass?
  2. האם מותר def f(a, b=2, c=3):?
  3. עם greet מלמעלה: מה יחזיר greet("Dan", greeting="Yo")?
  4. def add(a, b): print(a + b), ואז total = add(1, 2) * 2. מה יקרה?

תשובות. 1: None. 2: כן. כל הפרמטרים עם ברירת המחדל בסוף. 3: 'Yo, Dan'. 4: יודפס 3, ואז TypeError, כי add מחזירה None, ואי אפשר להכפיל None.