目錄: 一、函數和過程 二、再談談返回值 三、函數變數的作用域 四、課時19課後習題及答案 ****************** 一、函數和過程 ****************** Python嚴格來說,只有函數,沒有過程。此話怎講? 調用print(hello())之後列印了兩行字,第一行,我們 ...
目錄:
一、函數和過程
二、再談談返回值
三、函數變數的作用域
四、課時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課後習題及答案
*******************************