בסיסי > פונקציות > שימוש בפונקציות

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

מהן הסיבות לכתיבת פונקציות? ישנן שתי סיבות עיקריות לכתיבת פונקציות:

1 - קיבוץ מספר שורות קוד בפונקציה אחת הופכת את הקוד שקורא לפונקציה לקריא (קל לקריאה) יותר. קריאה לפונקציה "מחביאה" מימושים מסובכים של אלגוריתמים בתוך הפונקציה ומפשטת את הקוד שקורא לה (כמובן שיש לדאוג לכך שגם הקוד של הפונקציה עצמה יהיה קריא – זאת ניתן לעשות על-ידי "שבירת" הפונקציה לתת-פונקציות ולקריאה להן בתוך גוף הפונקציה – וכן הלאה וכן הלאה).

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

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

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

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

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

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

>>> three_hello()
hello world

hello world

hello world

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

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

>>> printTwice('Spam')
Spam Spam

>>> printTwice(5)

5 5

>>> printTwice(3.14159)

3.14159 3.14159

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

>>> printTwice('Spam'*4)
SpamSpamSpamSpam SpamSpamSpamSpam

>>> printTwice(math.cos(math.pi))

-1.0 -1.0

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