סדנאת פייתון לפיזיקאים

פונקציות

הפקולטה לפיזיקה, הטכניון. חורף 2013

מרצה: רונן אברבנאל

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

פונקציות ב-C:

float location(int time, float x0, float v0, float a)
{
    return x0 + v0*t + a*a*t/2;
}

בפייתון, כמו בפייתון, אין צורך להצהיר על טיפוסי פרמטרים ועל ערך החזרה.

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

In [1]:
def test():
    print "in test function"

test()  
in test function

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

החזרת ערך

מתבצעת באמצעות return. אין צורך להצהיר על טיפוס הנתונים המוחזר.

In []:
def disk_area(radius):
    return 3.14 * radius * radius

disk_area(1.5)
In [1]:
def disk_area(radius):
    return 3.14 * radius * radius

** הגדרת פונקציה מורכבת ממספר חלקים **

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

העברת פרמטרים לפונקציה

פרמטרים הכרחיים מועברים לפונקציה לפי הסדר

In [2]:
def double_it(x):
    return x*2
double_it(3)
Out[2]:
6

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

In [3]:
double_it()
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-3-51cdedbb81b0> in <module>()
----> 1 double_it()

TypeError: double_it() takes exactly 1 argument (0 given)

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

In [5]:
def double_it(x=2):
    return x*2
double_it()
Out[5]:
4
In [6]:
double_it(3)
Out[6]:
6

פרמטרים אופציונאליים חייבים לבוא אחרונים (אלא אם כן קוראים בשמם)

In [3]:
def location(t, x0=0, v0=0, a=9.8):
    return x0 + v0*t + (a*t**2)/2
location(5)
Out[3]:
122.50000000000001
In [4]:
 location(5, 0,0, 42)
Out[4]:
525

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

In [5]:
a = 10
location(5, a=a)
Out[5]:
125
In [6]:
location(5, a=42, x0=-1)
Out[6]:
524

משתנים גלובאליים

למשתנים המוגדרים מחוץ לפונקציה, ניתן להתייחס בתוך הפונקציה:

In [13]:
x = 5
def addx(y):
    return x+y
addx(10)
Out[13]:
15

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

הדוגמה הבאה אינה עובדת:

In [16]:
x=5
def setx(y):
    x = y
    print "x is now %d" % x
setx(10)
print x
x is now 10
5

אם נשתמש במילה השמורה global...

In [18]:
x=5
def setx(y):
    global x
    x = y
    print "x is now %d, for real" % x

setx(10)
print x
x is now 10, for real
10

על מה לא דיברנו?

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

  • כתיבת תיעוד בתוך קוד הפונקציה, docstring
  • שינוי ערכים של פרמטרים בתוך פונקציה
  • העברת מספר לא ידוע של פרמטרים לפונקציה: *args, **kwargs
  • שימוש בפונקציות בתור "משתנה"

תרגילון

ניתן לבצע את התרגילים הן במפענח והן בקובץ נפרד

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

ניתן לכתוב פונקציות עזר. מומלץ להשתמש בלולאה.