【Python系列】5. 函數(shù)與變量作用域
一、函數(shù)
函數(shù):有一定功能的代碼塊
函數(shù)作用:提高利用率(重復(fù)使用)、封裝(模塊化)
語法
? ? def 函數(shù)名(參數(shù)列表):
? ? ? ? ?函數(shù)體(代碼塊)
調(diào)用
? ? ?函數(shù)名(參數(shù))
分類
? ? ?有無參數(shù):有參函數(shù)、無參函數(shù)
? ? ?有無返回值:有返回值函數(shù)、 無返回值函數(shù)
參數(shù)
? ? ? ? 形參:定義函數(shù)時(shí)申明的參數(shù)
? ? ? ? 實(shí)參:調(diào)用函數(shù)時(shí)傳遞的參數(shù)
? ? ? ? 注:形參相當(dāng)于復(fù)制實(shí)參,引用類型的復(fù)制,形參改變了,實(shí)參也會(huì)變
? ? ? ? ?值類型的復(fù)制,形參不會(huì)改變實(shí)參
參數(shù)參型
默認(rèn)參數(shù)(形參后賦值,這個(gè)值稱為默認(rèn)值)
? ? ? ?默認(rèn)值,要在必須參數(shù)的后面
必須參數(shù)(沒有設(shè)置默認(rèn)值的就是必須參數(shù))
關(guān)鍵字參數(shù)(指定形參的名字來傳遞值)
student(age=18,name='doubleyong')
不定長參數(shù) (*變量名, *后面的變量是元組類型)
注:不定長的參數(shù)也必須放到參數(shù)的后面
def student(name, *info)? ? # 變量info 是元組類型
返回值
return 值
函數(shù)沒有return 時(shí), 返回None
注:return 可以返回多個(gè)值,并且將多個(gè)返回值,裝到一個(gè)元組中
? def add(num1,num2):
? ? ? return num1,num2,num1+num2
? result = add(5,3)
? print(result)? ? # result 為元組類型,結(jié)果為:(5,3,8)
二、變量作用域
Python 中,程序的變量并不是在哪個(gè)位置都可以訪問的,訪問權(quán)限決定于這個(gè)變量是在哪里賦值的。
變量的作用域決定了在哪一部分程序可以訪問哪個(gè)特定的變量名稱。Python的作用域一共有4種,分別是:
L (Local) 局部作用域
E (Enclosing) 閉包函數(shù)外的函數(shù)中
G (Global) 全局作用域
B (Built-in) 內(nèi)建作用域
以 L –> E –> G –>B 的規(guī)則查找,即:在局部找不到,便會(huì)去局部外的局部找(例如閉包),再找不到就會(huì)去全局找,再者去內(nèi)建中找。
全局變量? ?or? ?局部變量
python中,只有模塊(module)、類(class)、函數(shù)(def、lambda),會(huì)產(chǎn)生新的作用域
if(True):
? ? ?x = 5
print(x)
注:python中, 直接寫if結(jié)構(gòu)它是不會(huì)產(chǎn)生作用域的,所以x打印出來是5.
函數(shù)里定義的是局部變量,局部變量,當(dāng)前函數(shù)可以訪問
函數(shù)外定義是全局變量, 全局變量,所有的函數(shù)都可以訪問,不能修改,要修改,必須在前面加global
x = 5
def change():
? ? global x
? ? x=10
change()
print(x)
函數(shù)里,要修改全局變量,變量前加global
如果要修改不是自己的變量,加nonlocal,它是向上找,最先找到誰就是誰。
nonlocal, 不能找到全局的變量
y = 5
def a():
? ? y = 10
? ? def b():
? ? ? ? # y=11
? ? ? ? def c():
? ? ? ? ? ? nonlocal y
? ? ? ? ? ? y=18
? ? ? ? ? ? print('c函數(shù)中的y',y)
? ? ? ? c()
? ? ? ? print('b函數(shù)中的y',y)
? ? b()
? ? print('a函數(shù)中的y',y)
a()
print('全局中的',y)
注: nolocal會(huì)向上找,找到上級的變量后,進(jìn)行修改,但是不會(huì)找到全局變量,只限在def內(nèi)定義的變量