【12】Python函数学习(中)
作用域、局部和全局變量
?
?
前向引用:
def test(name,age=18,*args,**kwargs):??
????print(name)
????print(age,args,kwargs)
????school("Test")???#程序執(zhí)行從上到下的,這里的school還沒(méi)定義,所以執(zhí)行報(bào)錯(cuò)。
test('alex',age=20,flag="F",water=1.5)???
def school(source):
????print(source)
運(yùn)行結(jié)果:
報(bào)錯(cuò)NameError: name 'school' is not defined
?
正確寫法:
def test(name,age=18,*args,**kwargs):
????print(name)
????print(age,args,kwargs)
????school("Test")
def school(source):
????print(source)
test('alex',age=20,flag="F",water=1.5)
運(yùn)行結(jié)果:
alex
20 () {'flag': 'F', 'water': 1.5}
Test
?
?
局部變量(只在函數(shù)里生效,這個(gè)函數(shù)就是這個(gè)變量的作用域)
def logers(name):
????print('before change:',name)
????name='ALEX'
????print('after change:',name)
????age=23
name='alex'
logers(name)
print(name)
print(age) ?#這里報(bào)錯(cuò),NameError: name 'age' is not defined,,age屬于局部變量,只能在局部生效。
運(yùn)行結(jié)果:
before change: alex
after change: ALEX
alex
?
?
全局變量(在頂層,第一級(jí)定義的變量都是全局變量)
school='Oldboy'???#頂層定義全局變量
def logers(name):
????school="Mage"??#局部變量
????print('before change:',name,school)
????name='ALEX'
????print('after change:',name)
????age=23
name='alex'
logers(name)
print(name)
#print(age)
print(school)
運(yùn)行結(jié)果:
before change: alex Mage ?#局部變量?jī)?yōu)先,雖然內(nèi)部變了,但是全局變量還是沒(méi)變。
after change: ALEX
alex
Oldboy ?#全局變量
?
改全局變量
不要這么用1:
school='Oldboy'
def logers(name):
????global school??#我要把函數(shù)的全局變量改了
????school="Mage"
????print('before change:',name,school)
????name='ALEX'
????print('after change:',name)
????age=23
name='alex'
logers(name)
print(name)
#print(age)
print(school)
運(yùn)行結(jié)果:
before change: alex Mage
after change: ALEX
alex
Mage
?
總結(jié):
局部變量的作用域只在子程序(函數(shù))中有效
2、全局變量的作用域在整個(gè)程序
3、全局變量配置在程序最頂層
4、需要把全局變量改為局部變量那就用global 變量名(不要那么用)
?
不要這么用2:(作死)
def student():
????global name??#這個(gè)作用是把 name定義為全局變量
????name='alex'
student()
print(name)
?
為啥:容易混亂程序(找bug找死你)
?
?
遞歸:(在函數(shù)內(nèi)部可以調(diào)用自己)
1.必須要有明確的結(jié)束條件
2.每次進(jìn)入更深一層的時(shí)候,問(wèn)題規(guī)模應(yīng)該比上一層要小
3.遞歸效率不高,遞歸層次過(guò)多會(huì)導(dǎo)致棧溢出。(在計(jì)算機(jī)中,函數(shù)調(diào)用是通過(guò)棧(stack)這種數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)的,每當(dāng)進(jìn)入一個(gè)函數(shù)調(diào)用,棧就會(huì)加一層棧幀,每當(dāng)函數(shù)返回,棧就會(huì)減少一層棧幀。由于棧的大小不是無(wú)限的,所以遞歸次數(shù)過(guò)多會(huì)導(dǎo)致棧溢出。)
?
def calc(n):???#程序開(kāi)始,取calc實(shí)參
????print(n)??#打印判斷結(jié)果
????if int(n/2) >0 :?
????????return calc(int(n/2))?#遞歸
????print('>>>',n)
calc(10)
運(yùn)行結(jié)果:
10
5
2
1
>>> 1
?
?
函數(shù)式編程介紹:
函數(shù)式編程是一種抽象程度很高的編程范式,純粹的函數(shù)式編程語(yǔ)言的編寫沒(méi)有變量。因此,任意一個(gè)函數(shù),只要輸入確定的,輸出就是確定的,這種純函數(shù)我們稱之為沒(méi)有副作用。而允許使用變量的程序設(shè)計(jì)語(yǔ)言,由于函數(shù)內(nèi)部的變量狀態(tài)不確定,同樣的輸入,可能得到不同的輸出,因此這種函數(shù)是有副作用的。
函數(shù)式編程的一個(gè)特點(diǎn)就是,允許把函數(shù)本身作為參數(shù)傳入另一個(gè)函數(shù),還允許返回一個(gè)函數(shù)。
Python對(duì)函數(shù)式編程提供部分支持,由于python允許使用變量,因此,python不是純函數(shù)式編程語(yǔ)言。
想學(xué)函數(shù)式編程可以學(xué)lisp、hashshell、erlang
?
?
高階函數(shù):
變量可以指向函數(shù),函數(shù)的參數(shù)能接收變量,那么一個(gè)函數(shù)就可以接收另一個(gè)函數(shù)作為參數(shù),這種函數(shù)就叫做高階函數(shù)。
def add(a,b,f):
????return f(a)+f(b)
res=add(3,-6,abs) ?#abs 絕對(duì)值的意思
print(res)
結(jié)果:
9
轉(zhuǎn)載于:https://blog.51cto.com/000011211684/1983175
總結(jié)
以上是生活随笔為你收集整理的【12】Python函数学习(中)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 基础才是重中之重~通过人类的生活来学习D
- 下一篇: DoTween NGUI bug