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

פונקציות

הפקולטה לפיזיקה, הטכניון. חורף 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

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

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

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

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

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

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

תרגילון

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

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

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