目錄:
一、函式和過程
二、再談談返回值
三、函式變數的作用域
四、課時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課後習題及答案
*******************************