פונקציות מובנות

פונקציות מובנות#

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

ראינו למשל את הפונקציה המובנית len. פונקציה זו כאמור מקבלת מחרוזת, ומחזירה לנו את האורך שלה – כלומר מספר התווים במחרוזת. למעשה, הפונקציה הזו יכולה לקבל עוד כמה טיפוסי נתונים בפייתון שנפגוש בהמשך, כמו רשימה (list), מילון (dict) ועוד, אך לא נעסוק בזה כרגע.

השימוש בפונקציה len כבר הודגם. למשל אם נכתוב את הפקודות:

n = len("This is a string")
print(n)
16

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

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

יכולנו גם לוותר על המשתנה n ולכתוב את שתי הפקודות כך:

print(len("This is a string"))
16

התוצאה זהה. ההבדל הוא שבמקום לשמור את הפלט של len במשתנה ואז להעביר אותו לפונקציה print, עשינו זאת בבת אחת. את הפקודה הזו צריך לקרוא “מבפנים החוצה” – קודם קוראים ל-len, ואת מה שהיא מחזירה (16 בדוגמה הזו) מעבירים מיד ל-print לצורך הדפסה.

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

s = "this is a string".upper()
print("The letter T appears", s.count("T"), "times in:", s)
The letter T appears 2 times in: THIS IS A STRING

בדוגמה הזו, אילו לא שמרנו את אורך המחרוזת במשתנה, היה עלינו לקרוא לפונקציה upper פעמיים:

print("The letter T appears",  "this is a string".upper().count("T"), "times in:",  "this is a string".upper())
The letter T appears 2 times in: THIS IS A STRING

הקוד, כמובן, יותר קשה לקריאה, וגם ארוך יותר. בנוסף, אם פתאום נחליט לשנות את המחרוזת מ- this is a string למשהו אחר, למשל This is THE string, ניאלץ לשנות זאת בשני מקומות! מעבר לכך, אם הפונקציה ששכפלנו הייתה פונקציה ארוכה וקשה (לדוגמה פונקציה שעושה חישוב מסובך וארוך, ולא כמו פה - עריכה של מחרוזת קצרה), קריאה חוזרת לפונקציה הייתה מאריכה את זמן הריצה של התוכנית.

לסיכום -#

קלט לא חוקי#

ראינו שיש פונקציות שעובדות על סוגים מסוימים. מה קורה אם ננסה לתת לפונקציה קלט שלא מתאים לה? לדוגמה, מה זה אומר לעשות len על מספר?

len(5.5)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Cell In[8], line 1
----> 1 len(5.5)

TypeError: object of type 'float' has no len()

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

מהו הפלט של print?#

נחזור עכשיו לשאלה שדחינו - מהו הפלט של הפונקציה print?

שימו לב לפקודות הבאות:

result = print(1+2)
print(result)
3
None

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

print(type(result))
<class 'NoneType'>

אז כתשובה לשאלה - מה הפלט של הפונקציה print? היא למעשה לא מחזירה שום פלט (או ליתר דיוק יש לה פלט ריק).

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

print(3)+print(4)
3
4
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Cell In[11], line 1
----> 1 print(3)+print(4)

TypeError: unsupported operand type(s) for +: 'NoneType' and 'NoneType'

לאחר הדפסת הערך 3 ואז הערך 4, נעשה נסיון לחבר את הערכים שהקריאות ל-print החזירו. למעשה ביקשנו מפייתון לחבר “כלום” עם “כלום” (שימו לב – לא 0 עם 0!), ולכן נקבל הודעת שגיאה, כי הפעולה + לא מוגדרת על ערכי None.

פונקציות מובנות נוספות ניתן למצוא כאן