כתיבת פונקציה חדשה (def)#

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

תחביר בסיסי - הגדרת פונקציה:#

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

הגדרת פונקציה נראית כך:

כל הגדרה מתחילה במילה השמורה def (קיצור של define).
לאחר מכן יגיע שם הפונקציה, שמומלץ שישקף מה שהפונקציה עושה.
אחר כך, בסוגריים, יופיעו שמות הקלטים (פרמטרים), מופרדים בפסיקים.
בסוף הסוגריים - נקודותיים, שמסמנות את תחילת תוכן הפונקציה.
כל הפקודות של הפונקציה כתובות עם כניסה פנימה (indentation, המקש tab במקלדת) - חובה בפייתון.
לבסוף תופיע הפקודה return - שמגדירה את ערך הפלט של הפונקציה.

  • אם יש פקודת return, הפונקציה מחזירה את הערך/ערכים שהוגדרו אחרי return.

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

קריאה לפונקציה:#

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

var1, var2, = function_name(val1, val2,...)

נחזור לדוגמה שלנו: חישוב היקף מלבנים#

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

הגדרת הפונקציה#

מה הפונקציה עושה? מקבלת שני פרמטרים בשם x ו-y המייצגים את האורך והרוחב של המלבן. הפונקציה מחשבת את ההיקף ומחזירה אותו על-ידי פקודת return.

def circumference(x,y):
    return 2*x + 2*y

שימוש בפונקציה (קריאה לה)#

עכשיו אנחנו רוצים לחשב את ההיקף של מלבן ספציפי - שאורכו 4 ורוחבו 6. נקרא לפונקציה באמצעות שמה, נכניס אליה את ערכי הפרמטרים הרצויים, ונשמור את הפלט במשתנה בשם a.

a = circumference(4,6)
print(a)
20

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

print(circumference(2,3))
10

אם היינו רוצים לבצע בהמשך פעולות נוספות על ההיקף המדובר, לדוגמה להכפיל אותו בחמש ואז להמיר אותו למחרוזת ולבדוק את האורך שלה. האם היינו יכולים להשתמש בו לאחר פקודת הprint?

פקודת return#

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

מעניין לדעת

כפי שאמרנו, פקודות לפונקציה שמופיעות אחרי return לא יתבצעו. פקודות אלו נקראות unreachable code - קוד שלא ניתן להגיע אליו.

איך להתחיל לכתוב פונקציה?#

כשאתם באים לכתוב פונקציה חדשה, כדאי לחשוב תחילה על הנקודות הבאות:

1. איזה שם נרצה לתת לפונקציה?

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

2. מהם הפרמטרים שהפונקציה צריכה לקבל? כמה כאלו יש ואילו שמות כדאי לתת להם?

גם כאן מומלץ לתת לפרמטרים שמות משמעותיים.

פונקציה להיפוך מחרוזת צריכה לקבל את המחרוזת שאותה רוצים להפוך. אם מדובר במחרוזת ללא הקשר ספציפי, נקרא לה פשוט s או st או string או text וכו’. אם מדובר למשל בשם של אדם אפשר לקרוא לה name, וכו’.

כדי לבדוק אם מספר הוא ראשוני הפונקציה צריכה לקבל מספר שלם. שמות מקובלים למספרים שלמים הם אותיות בודדות קטנות באנגלית, למשל a, b, c ולפעמים n, m. אם יש לנו יותר משלושה או ארבעה מספרים בקלט, נוח לקרוא להם למשל n1, n2, n3, …. גם כאן, אם המספר הוא בעל משמעות ספציפית יותר, כדאי שהשם יישקף זאת. למשל אם המספר הוא קוד סודי כלשהו או סיסמה, נקרא לו code או pass_num וכו’.

3. מה הפלט שהפונקציה אמורה להחזיר ומה הטיפוס שלו?

פונקציה להיפוך מחרוזת תחזיר את תמונת המראה של המחרוזת, כלומר ערך מטיפוס str. ואילו פונקציה לבדיקה האם מספר הוא ראשוני תחזיר True (אם הוא ראשוני) או False (אם הוא לא ראשוני), ובכל מקרה ערך מטיפוס בוליאני (bool).

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

דוגמא נוספת לבנית פונקציה חדשה: מי המחרוזת הארוכה ביותר?#

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

נבחן תחילה את 3 הנקודות שהזכרנו קודם.

  1. מכיוון שהפונקציה שאנחנו רוצים לכתוב אמורה להחזיר אם מחרוזת אחרת ארוכה יותר מהשנייה, הגיוני לקרוא לפונקציה is_first_longer. הפורמט של is_X מקובל כשמדובר בפונקציות שעונות על שאלה של כן ולא.

  2. הפונקציה תקבל כקלט שני ערכים – שתי מחרוזות. נקרא להן s1 ו- s2.

  3. הפונקציה מחזירה True אם s1 ארוכה מs2, וFalse אחרת. כלומר ערך ההחזרה יהיה בוליאני.

להלן דוגמא למימוש פונקציה כזו בפייתון:

def is_first_longer(s1, s2):
    return len(s1) > len(s2)

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

כעת נותר לרשום מה הפונקציה עושה. הפונקציה תחילה תחשב את אורכי שתי הרשימות - האורך של s1 והאורך של s2, ששניהם יהיו מסוג int. לאחר מכן הפונקציה תבצע את אופרטור אי השיוויון שמחזיר ערך בוליאני - True אם s1 גדול מs2 וFalse אם לא. לאחר שהערך הבוליאני הזה חושב, הוא מוזר על ידי פקודת return והפונקציה מסיימת את פעולתה.

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

res = is_first_longer("Hello", "Python")
print(res)
False

חשוב לדעת! המילה השמורה pass

בפייתון קיימת המילה השמורה pass, המשמשת כ”פקודת ריק”. המשמעות היא שכשמגיעים אליה – לא מתבצעת כל פעולה, אך הקוד ממשיך לרוץ בלי שגיאה. זה שימושי במיוחד כשאנחנו כותבים פונקציה שעדיין לא מימשנו, אבל רוצים שהקוד יהיה תקין מבחינת התחביר. כך ניתן לבנות “שלד” של פונקציות ולעבוד בהדרגה, בלי שהפייתון יתלונן על כך שהגוף של הפונקציה ריק.

אתם תראו זאת הרבה בתרגילים שיופיעו בקורס זה - עליכם למחוק את פקודת הpass ובמקומה לכתוב את הקוד שלכם!

כך זה ייראה:

def my_function():
    # Replace the pass with your code
    pass

בחנו את עצמכם

  1. לפניכם פונקציה קצרה בפייתון המקבלת מחרוזת לא ריקה המכילה ספרות בלבד.

def is_even(s):
    return int(s)%2 == 0
  1. זוכרים את הסטודנטית עדי בת ה23? כתבו פונקציה בשם introduce שמקבלת מחרוזת name ומספר age, ומחזירה מחרוזת לפי הפורמט:

"My name is <name> and I am <age> years old"

Hide code cell output

'My name is <name> and I am <age> years old'

כתבו את הקוד במשבצת הבאה, ולאחר מכן הריצו את הקוד במשבצת אחריו. הצלחתם במשימה אם המשבצת השנייה מציגה:
“FUNCTION OUTPUT: My name is Adi and I am 23 years old” בלבד.

# ### Write your code below ###
# def...
#
###############################

# Run this when you're done
introduction = introduce("Adi", 23)
print("FUNCTION OUTPUT:", introduction)