一,形參與實參
形參和實參實際上是傳值方式的區別,
實際參數就是調用函數時候傳給他的那個參數;而形式參數可以理解為函數內部定義用的參數。
在函數里面,實際參數會被賦值給形式參數,如下就是一個使用單個實際參數的函數定義:
>>> def print_twice(bruce):
... print(bruce)
... print(bruce)
...
>>>
這個函數把傳來的實際參數的值賦給了一個名字叫做bruce的形式參數。當函數被調用的時,就會打印出形式參數的值兩次,無論形式參數是什么內容,即任何能打印的值都適用於這個函數。
>>> print_twice('World')
World
World
>>> print_twice(66)
66
66
>>> print_twice(math.pi)
3.141592653589793
3.141592653589793
適用於Python內置函數的組合規則對自定義的函數也是適用的,所以我們可以把表達式作為實際參數:
>>> print_twice('World' * 4)
WorldWorldWorldWorld
WorldWorldWorldWorld
>>> print_twice(math.cos(math.pi))
-1.0
-1.0
實際參數在函數被調用之前要先被運算一下,所以上面例子中作為實際參數的兩個表達式都是在print_twice函數調用之前僅計算了一次。當然,也可以用變量做實際參數:
>>> love = 'give me one kiss'
>>> print_twice(love)
give me one kiss
give me one kiss
上例傳遞給函數的這個實際參數是一個變量,這個變量名love和函數內部的形式參數bruce沒有任何關系。
在程序主體內部,參數傳過去就行了,參數名字對於函數內部沒有作用;比如在這個print_twice函數里面,任何傳來的值,在這個print_twice函數體內,都被叫做 bruce。
二,函數內部變量和形參的局部性
在函數內部建立一個變量,這個變量是僅在函數體內部才存在。例如:
>>> def cat_twice(part1, part2):
... cat = part1 + part2
... print_twice(cat)
...
>>>
這個函數得到兩個實參,把它們連接起來,然后調用print_twice函數來輸出結果兩次。
>>> part1 = 'I am part1'
>>> part2 = 'I am part2'
>>> cat_twice(part1,part2)
I am part1I am part2
I am part1I am part2
當cat_twice運行完畢了,這個名字叫做cat的變量就銷毀了。再嘗試着打印它一下,就會得到提示該變量沒有定義:
>>> print(cat)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'cat' is not defined
由此可以看出,函數內部的變量是局部性的。其實,形式參數也是局部起作用的。
例如上面實例中的函數print_twice(bruce),在這個函數之外,是不存在bruce這個變量的。
三,棧圖
要追蹤一個變量能在哪些位置使用,咱們就可以畫個圖表來實現,這種圖表叫做棧圖。
棧圖和狀態圖有些相似,也會表征每個變量的值,不同的是棧圖還會標識出每個變量所屬的函數。
>>> def cat_twice(part1, part2):
... cat = part1 + part2
... print_twice(cat)
...
>>> part1 = 'I am part1'
>>> part2 = 'I am part2'
>>> cat_twice(part1,part2)
I am part1I am part2
I am part1I am part2
一個棧中的這些框也表示了函數調用的關系。在上面這個例子中,printtwice被cattwice調用了兩次,而cattwice被_main_這個函數調用。
__main_這個函數很特殊,屬於最外層框架,也被叫做主函數。當你在所有函數之外建立一個變量的時候,這個變量就屬於主函數所有。
每個形式參數都保存了所對應的實際參數的值。因此part1的值和line1一樣,part2的值就和 line2一樣,同理可知bruce的值就和cat一樣了。
如果函數調用的時候出錯了,Python會打印出這個出錯函數的名字,調用這個出錯函數的函數名,以及是誰調用了這個出錯函數,其對應的函數名也會被打印出來,一直追溯到主函數。
例如,如果你想在print_twice這個函數中讀取cat的值,就會得到一個變量名沒有定義的錯誤:
>>> print_twice(cat)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'cat' is not defined
結束。