第十二章:函式進階
關于python的函式,我想分兩章來完成,原因就是不管是哪門語言,函式都是一個內容相當多的一個機制;上一章我們講了函式的創建、呼叫、各類引數及回傳值,那本章我們再講一下難度相對進階的關于函式的知識,
12.1函式變數的作用域
在講函式變數作用域時我們需要借助兩種變數—區域變數和全域變數的對比來進行學習,在幾乎所有編程語言中都有區域變數(Local Variable)和全域變數(Global Veritable)的概念;我們先借助一段代碼來區分一下哪些是區域變數?哪些是全域變數?
以下為實作加法功能的函式及代碼:
def sum(num1,num2):
sum_num = num1 + num2
return sum_num
a = int(input("請輸入第一個數字:"))
b = int(input("請輸入第二個數字:"))
c = sum(a,b)
print("加法結果為:",c)
結果:
請輸入第一個數字:3
請輸入第二個數字:4
加法結果為: 7
我們分析以上代碼,可以找到,整個代碼中:num1、num2以及sum_num是這個代碼中的區域變數而其余的a、b、c為代碼中的全域變數,那這兩種變數之間有什么區別呢?在代碼中兩種變數的位置我們可以發現區別之一:區域變數只定義在函式體之內,而全域變數則定義在函式之外,
另外一個區別則是:我們可以在函式中訪問定義在函式之外的全域變數,但是在函式之外無法訪問到定義在函式中的區域變數,如果這句話沒有理解,那我們再看下面的代碼來進行分析:
def sum(num1,num2):
print(a)
print(b)
sum_num = num1 + num2
return sum_num
a = int(input("請輸入第一個數字:"))
b = int(input("請輸入第二個數字:"))
c = sum(a,b)
print("加法結果為:",c)
結果:
請輸入第一個數字:3
請輸入第二個數字:4
3
4
加法結果為: 7
同樣是求和的函式,我們在函式體內通過print來輸出定義在函式體之外的“a”和“b”,可以看到結果,這樣是可行的,確實輸出了我們鍵入的3和4,然后輸出了加法后的結果,這可以表明:全域變數可以在函式體內進行訪問,那接下來我們再通過另外一塊代碼來分析能否實作在函式體外呼叫定義在函式內的區域變數:
def sum(num1,num2):
sum_num = num1 + num2
return sum_num
a = int(input("請輸入第一個數字:"))
b = int(input("請輸入第二個數字:"))
c = sum(a,b)
print("加法結果為:",c)
print(num1)
結果:
Traceback (most recent call last):
File "/Users/lihongbo/Documents/Python Program/python_work/test2.py", line 10, in <module>
print(num1)
NameError: name 'num1' is not defined
我們發現程式中出現了報錯,“name ‘num1’ is not defined”,意思是“名稱為‘name1’的變數并沒有被定義”,這也就表明,作為一個區域變數,是不能夠在函式外進行訪問的,
既然以及證實我們無法在函式外訪問區域變數,那也可以理解我們無法在函式外對區域變數進行更改;那此時我們不妨產生了一個疑問:能否實作在函式內對函式外的全域變數進行更改呢?我們再分析一下下面的代碼:
def sum(num1,num2):
a = 5
print(a)
sum_num = num1 + num2
return sum_num
a = int(input("請輸入第一個數字:"))
b = int(input("請輸入第二個數字:"))
c = sum(a,b)
print("加法結果為:",c)
print(a)
結果:
請輸入第一個數字:3
請輸入第二個數字:4
5
加法結果為: 7
3
結果可能會讓我們產生疑問,我們能看出來,我們在函式內對“a”進行了更改以及輸出,當我們給a通過輸入賦值3后,確實在函式內使用print可以輸出一個5,但是我們最終在函式外又一次對“a”進行輸出發現,它依舊是3,這是什么原因呢?其實,在函式內對全域變數進行更改的行為我們是強烈不建議的,因為當我們在函式內對“a”進行所謂更改的程序其實是又在函式內定義了一個同名的區域變數,這樣并不會起到修改全域變數的目的,所以一定一定要避免這種操作方式,
那如果我堅持要有一個可以在函式內修改全域變數的功能,這樣可以實作嗎?其實是可以的,我們看接下來的一個知識點,
12.2 global關鍵字
我們通過global關鍵字將上述程式進行修改:
def sum(num1,num2):
global a
a = 5
print(a)
sum_num = num1 + num2
return sum_num
a = int(input("請輸入第一個數字:"))
b = int(input("請輸入第二個數字:"))
c = sum(a,b)
print("加法結果為:",c)
print(a)
結果:
請輸入第一個數字:3
請輸入第二個數字:4
5
加法結果為: 7
5
變化很明顯,我們在函式內使用global重新定義了a,從而使得在函式內對變數a進行修改,也影響到了函式之外的a,所以在函式內通過global來定義全域變數是可以解決我們上述問題的,
12.3 內嵌函式
回憶我們之前學過的串列,我們清楚串列的元素可以也是一個串列,也可以理解為串列的嵌套,那作為一個功能強大的函式,它也是可以實作嵌套的,這種函式叫做內嵌函式,我們下面舉例說明:
def out_func():
print("當前處于外層函式")
def in_func():
print("當前處于內層函式")
out_func()
結果:
當前處于外層函式
如上述代碼,我們在out_func()函式的內部定一個一個名為in_func的函式,這個函式就是out_func()的內嵌函式,當我們在函式外呼叫out_func()函式時,發現結果只輸出了外層函式體中的內容“當前處于外層函式”,但并沒有輸出內層函數中的內容,那我們再分析下面的代碼,直接呼叫內層函式會得到怎樣的結果,
def out_func():
print("當前處于外層函式")
def in_func():
print("當前處于內層函式")
in_func()
結果:
Traceback (most recent call last):
File "test2.py", line 8, in <module>
in_func()
NameError: name 'in_func' is not defined
當我們運行程式后發現報出如下錯誤:“名為‘in_func’的函式并未定義”,這個問題就出現在,我們在函式內定義的內嵌函式,是無法在函式體外進行呼叫的,內嵌函式只能在外層函式體中進行使用,所以我們把代碼稍作修改:
def out_func():
print("當前處于外層函式")
def in_func():
print("當前處于內層函式")
in_func()
out_func()
結果:
當前處于外層函式
當前處于內層函式
修改后的區別就在于,我們在out_func函式內直接呼叫了定義好的內嵌函式,然后在外層在對out_func進行呼叫時,外層函式同時也會呼叫內嵌函式in_func;所以關于內嵌函式,我們當前只需要掌握–內嵌函式只能在相鄰外層函式體內進行呼叫,
關于python中函式的相關知識我們先講這么兩個章節,如果之后的撰寫中想起來有用的知識還會再稍作補充,掌握這些知識是已經足夠入門python編程了,后面的困難還有很多,可謂任重而道遠!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/205959.html
標籤:其他
下一篇:小趙講堂系列1-特征工程這件小事
