課時19:函式:我的地盤聽我的

那是個好男孩發表於2018-08-13

目錄:

  一、函式和過程

  二、再談談返回值

  三、函式變數的作用域

  四、課時19課後習題及答案

 

******************

一、函式和過程

******************

Python嚴格來說,只有函式,沒有過程。此話怎講?

>>> def hello():
    print("DC love ZWW")

    
>>> hello()
DC love ZWW
>>> temp = hello()
DC love ZWW
>>> temp
>>> print(temp)
None
>>> print(hello())
DC love ZWW
None
>>> type(temp)
<class 'NoneType'>
>>> type(hello())
DC love ZWW
<class 'NoneType'>

呼叫print(hello())之後列印了兩行字,第一行,我們知道時hello()函式執行的,第二行的None是怎麼回事呢?當不寫return語句的時候,預設Python會認為函式是return None的。所以說Python所有的函式都有返回值。

 

*********************

二、再談談返回值

*********************

在許多程式語言中,我們說一個函式是整型,其實我們的意思是指這個函式會返回一個整型的返回值。而Python不這麼幹,Python可以動態確定函式的型別,而且函式還能返回不同型別的值。還記得“Python只有變數,沒有名字”這句話嗎?只需知道Python會返回一個東西,然後拿來用就可以了。另外,Python似乎還可以同時返回多個值。

>>> def test():
    return [1,'小甲魚',3.14]

>>> test()
[1, '小甲魚', 3.14]

Python可以利用列表打包多種型別的值一次性返回。當然,也可以直接用元組的形式返回多個值:

>>> def test():
    return 1,'小甲魚',3.14

>>> test()
(1, '小甲魚', 3.14)

 

**************************

三、函式變數的作用域

**************************

 變數的作用域也就是平常所說的變數可見性,一般的程式語言都有區域性變數和全域性變數之分。分析以下程式碼:

def discounts(price, rate):
    final_price = price * rate
    return final_price

old_price = float(input('請輸入原價:'))
rate = float(input('請輸入折扣率:'))
new_price = discounts(old_price, rate)
print('打折後價格是:', new_price)

程式的執行結果如下:

請輸入原價:80
請輸入折扣率:0.75
打折後價格是: 60.0

來分析一下程式碼:在函式discounts()中,兩個引數是price和rate,還有一個是final_price,它們都是discounts()函式中的區域性變數。為什麼稱之為區域性變數呢?不妨修改下程式碼:

def discounts(price, rate):
    final_price = price * rate
    return final_price

old_price = float(input('請輸入原價:'))
rate = float(input('請輸入折扣率:'))
new_price = discounts(old_price, rate)
print('打折後價格是:', new_price)
print('這裡試圖列印區域性變數final_price的值:',final_price)

 程式走起,報錯....

請輸入原價:80
請輸入折扣率:0.75
打折後價格是: 60.0
Traceback (most recent call last):
  File "C:\Users\14158\Desktop\lalallalalal.py", line 12, in <module>
    print('這裡試圖列印區域性變數final_price的值:',final_price)
NameError: name 'final_price' is not defined

 錯誤原因:final_price沒有被定義過,也就是說,python找不到final_price這個變數。這是因為final_price只是一個區域性變數,它的作用範圍只在它的地盤上----discounts()函式的定義範圍內-----有效,出了這個範圍,就不再屬於它的地盤了,它將什麼都不是。

總結一下:在函式裡邊定義的引數以及變數,都稱為區域性變數,出了這個函式,這些變數都是無效的。事實上的原理是,Python在執行函式的時候,這裡在呼叫這個函式的時候,利用棧進行儲存,把函式裡的變數程式碼都扔到棧裡面去,當執行完該函式後,函式中的所有資料都會被自動刪除。所以在函式外邊是無法訪問到函式內部的區域性變數的。

與區域性變數相對的全域性變數,程式中old_price、new_price、rate都是在函式外邊定義的,它們都是全域性變數,全域性變數擁有更大的作用域,例如,我們可以在函式中訪問到它們:

def discounts(price, rate):
    final_price = price * rate
    print('這裡試圖列印全域性變數old_price的值:',old_price)
    return final_price

old_price = float(input('請輸入原價:'))
rate = float(input('請輸入折扣率:'))
new_price = discounts(old_price, rate)
print('打折後價格是:', new_price)

程式執行的結果如下:

請輸入原價:80
請輸入折扣率:0.75
這裡試圖列印全域性變數old_price的值: 80.0
打折後價格是: 60.0

但是在使用全域性變數時,要小心,注意一點:在Python中,你可以在函式中肆無忌憚地訪問一個全域性變數,但如果你試圖去修改它,就會有奇怪的事情發生。分析以下的程式碼:

def discounts(price, rate):
    final_price = price * rate
    old_price = 50 #這裡試圖修改全域性變數
    print('這裡試圖列印全域性變數old_price的值:',old_price)
    return final_price

old_price = float(input('請輸入原價:'))
rate = float(input('請輸入折扣率:'))
new_price = discounts(old_price, rate)
print('全域性變數old_price現在的值是:', old_price)
print('打折後價格是:', new_price)

程式執行結果如下:

請輸入原價:80
請輸入折扣率:0.75
這裡試圖列印全域性變數old_price的值: 50
全域性變數old_price現在的值是: 80.0
打折後價格是: 60.0

如果在函式內部試圖修改全域性變數,那麼Python會建立一個新的區域性變數代替(名字跟全域性變數相同),但真正的全域性變數是紋絲不動的,所以實現的結果和大家的預期不同。

關於全域性變數,來進行下總結:全域性變數在整個程式碼段中都是可以訪問到的,但是不要試圖在函式內部去修改全域性變數的值,因為那樣Python會自動在函式的內部建立一個名字一樣的區域性變數代替。

 

*******************************

四、課時19課後習題及答案

*******************************

 

相關文章