Python_形式參數_實際參數_棧圖


一,形參與實參

形參和實參實際上是傳值方式的區別,

實際參數就是調用函數時候傳給他的那個參數;而形式參數可以理解為函數內部定義用的參數。

在函數里面,實際參數會被賦值給形式參數,如下就是一個使用單個實際參數的函數定義:

>>> 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

結束。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM