פונקציה היא בלוק של צעדים עם שם
בכל פעם שאתם מוצאים את עצמכם כותבים את אותן כמה שורות יותר מפעם אחת, או רוצים לתת שם לחתיכה קטנה של לוגיקה, אתם מוכנים לכתוב פונקציה. פונקציות הן הכלי האמיתי הראשון לניהול מורכבות בתוכנית Python.
הצורה הבסיסית:
נפרק את זה:
defהיא המילה השמורה שפותחת הגדרת פונקציה.greetהוא שם הפונקציה.(name)היא רשימת הפרמטרים: הקלטים שהפונקציה מקבלת.- הנקודתיים מסיימות את הכותרת; הבלוק המוזח שמתחת הוא הגוף.
greet("Ada")היא קריאה. Python מריצה את הגוף כש-nameקשור ל-"Ada".
פונקציות רדומות עד שקוראים להן. הגדרה של פונקציה לא מריצה אותה. קריאה לה עם greet("Ada") כן.
פרמטרים וארגומנטים
המילה פרמטר היא השם בתוך הגדרת הפונקציה. המילה ארגומנט היא הערך שמועבר כשקוראים לה. בשיחה יומיומית זה לא עניין גדול, אבל ההבחנה עוזרת כשקוראים הודעות שגיאה.
כאן base ו-exponent הם פרמטרים. 2 ו-10 הם ארגומנטים. Python קושרת אותם לפי הסדר: הארגומנט הראשון לפרמטר הראשון, וכן הלאה.
return: שליחת ערך בחזרה
print כותבת למסך. return מחזירה ערך לקורא כדי שיוכל להשתמש בו:
בלי return, פונקציה מחזירה None כברירת מחדל:
return גם יוצאת מהפונקציה מיד. תראו הרבה פעמים החזרות מוקדמות שמשמשות כדי לצאת ממקרי קצה לפני הלוגיקה המרכזית:
החזרות מוקדמות מונעות מהגוף המרכזי להיות מקונן עמוק בתוך if/else.
ארגומנטים עם ברירת מחדל
לפרמטר יכול להיות ערך ברירת מחדל, שמשמש כשהקורא לא מספק ערך:
כל הפרמטרים עם ברירת מחדל חייבים לבוא אחרי הפרמטרים בלי ברירת מחדל. def f(a, b=1, c): היא שגיאת תחביר.
מלכודת ברירת המחדל המשתנה
זו המלכודת המפורסמת ביותר ב-Python. תסתכלו:
הייתם מצפים שכל קריאה תתחיל עם רשימה ריקה. במקום זה, רשימת ברירת המחדל משותפת לכל הקריאות, והפריטים מצטברים. Python מחשבת את ברירת המחדל פעם אחת, כשהפונקציה מוגדרת, ומשתמשת שוב באותה רשימה יחידה לתמיד.
הדפוס הבטוח הוא להשתמש ב-None כברירת מחדל וליצור את הרשימה בתוך הפונקציה:
עכשיו כל קריאה שלא מעבירה items מקבלת רשימה חדשה. הכלל הזה חל על רשימות, dicts, sets: כל דבר שניתן לשינוי.
ארגומנטים בעלי שם
אפשר להעביר ארגומנטים לפי שם במקום לפי מיקום. זה מאפשר לדלג על פרמטרים באמצע ולהפוך קריאות ארוכות לקריאות יותר:
אפשר לערבב ארגומנטים פוזיציונליים וארגומנטים בעלי שם, אבל הפוזיציונליים חייבים לבוא קודם:
ברגע שלפונקציה יש יותר משלושה או ארבעה פרמטרים, העדפה של ארגומנטים בעלי שם הופכת את הקריאות להרבה יותר קלות לקריאה.
פרמטרים רק לפי מיקום ורק לפי שם
Python מאפשרת לסמן חלק מהפרמטרים כאלה שמעבירים רק לפי מיקום (עם /) או רק לפי שם (עם *):
לא צריך את אלה ביום הראשון. הם הופכים לשימושיים כשמעצבים APIs ורוצים לנעול את הדרך שבה קוראים משתמשים בפונקציה שלכם.
Docstrings ושמות
השורה הראשונה בתוך פונקציה יכולה להיות docstring: מחרוזת במירכאות משולשות ש-Python מתייחסת אליה כתיעוד:
כלים כמו help(), חלוניות רמז ב-IDE ומחוללי תיעוד קוראים את ה-docstring אוטומטית. שורה אחת עדיפה בהרבה על כלום.
ובבקשה, תחשבו על שמות:
- שמות של פונקציות צריכים להיות פעלים:
fetch_profile,compute_total,is_valid. - השתמשו ב-
lower_snake_case. - פונקציות שמחזירות בוליאני מתחילות הרבה פעמים ב-
is_,has_אוcan_.
שם טוב הופך את נקודת הקריאה למובנת מאליה בלי צורך בהערה.
קל יותר לחשוב על פונקציות טהורות
פונקציה טהורה (pure) מחזירה את אותו פלט עבור אותו קלט ואין לה תופעות לוואי: היא לא משנה מצב גלובלי, לא מדפיסה ל-stdout (חוץ מלצורכי דיבוג) ולא כותבת לקבצים.
לשתיהן יש מקום, אבל בקוד שרוצים לעשות בו שימוש חוזר ולבדוק אותו, שאפו לפונקציות טהורות ככל האפשר.
דוגמה קטנה שעובדת
פונקציה קצרה שמשלבת ברירות מחדל, ארגומנטים בעלי שם ו-return:
הבא בתור: רשימות ארגומנטים גמישות
לפעמים לא יודעים עם כמה ארגומנטים יקראו לפונקציה, או שרוצים להעביר את כל הארגומנטים שמגיעים לפונקציה אחרת. *args ו-**kwargs מטפלים בזה. זה העמוד הבא.
שאלות נפוצות
איך מגדירים פונקציה ב-Python?
השתמשו במילה השמורה def, ואחריה שם הפונקציה, סוגריים לפרמטרים ונקודתיים. הבלוק המוזח שמתחת הוא גוף הפונקציה. לדוגמה: def greet(name): print(f'Hi, {name}').
מה return עושה ב-Python?
return שולחת ערך בחזרה למי שקרא לפונקציה. פונקציה בלי return מפורש מחזירה None אוטומטית. ברגע ש-return רצה, הפונקציה יוצאת מיד: כל קוד שבא אחריה באותו בלוק מדולג.
מה הם ארגומנטים עם ברירת מחדל ב-Python?
ארגומנטים עם ברירת מחדל מאפשרים לפרמטר לקבל ערך מוגדר מראש שמשמש אם הקורא לא מספק ערך. def greet(name='friend'): אומר ש-greet() בלי ארגומנטים משתמשת ב-'friend'. לעולם אל תשתמשו בברירות מחדל שניתנות לשינוי כמו []: ראו בהמשך את הדפוס הבטוח יותר.