作用域、局部和全局變量
前向引用:
def test(name,age=18,*args,**kwargs):
print(name)
print(age,args,kwargs)
school("Test") #程式執行從上到下的,這裡的school還沒定義,是以執行報錯。
test('alex',age=20,flag="F",water=1.5)
def school(source):
print(source)
運作結果:
報錯NameError: name 'school' is not defined
正确寫法:
def test(name,age=18,*args,**kwargs):
school("Test")
test('alex',age=20,flag="F",water=1.5)
alex
20 () {'flag': 'F', 'water': 1.5}
Test
局部變量(隻在函數裡生效,這個函數就是這個變量的作用域)
def logers(name):
print('before change:',name)
name='ALEX'
print('after change:',name)
age=23
name='alex'
logers(name)
print(name)
print(age) #這裡報錯,NameError: name 'age' is not defined,,age屬于局部變量,隻能在局部生效。
before change: alex
after change: ALEX
全局變量(在頂層,第一級定義的變量都是全局變量)
school='Oldboy' #頂層定義全局變量
school="Mage" #局部變量
print('before change:',name,school)
#print(age)
print(school)
before change: alex Mage #局部變量優先,雖然内部變了,但是全局變量還是沒變。
Oldboy #全局變量
改全局變量
不要這麼用1:
school='Oldboy'
global school #我要把函數的全局變量改了
school="Mage"
before change: alex Mage
Mage
總結:
局部變量的作用域隻在子程式(函數)中有效
2、全局變量的作用域在整個程式
3、全局變量配置在程式最頂層
4、需要把全局變量改為局部變量那就用global 變量名(不要那麼用)
不要這麼用2:(作死)
def student():
global name #這個作用是把 name定義為全局變量
name='alex'
student()
為啥:容易混亂程式(找bug找死你)
遞歸:(在函數内部可以調用自己)
1.必須要有明确的結束條件
2.每次進入更深一層的時候,問題規模應該比上一層要小
3.遞歸效率不高,遞歸層次過多會導緻棧溢出。(在計算機中,函數調用是通過棧(stack)這種資料結構實作的,每當進入一個函數調用,棧就會加一層棧幀,每當函數傳回,棧就會減少一層棧幀。由于棧的大小不是無限的,是以遞歸次數過多會導緻棧溢出。)
def calc(n): #程式開始,取calc實參
print(n) #列印判斷結果
if int(n/2) >0 :
return calc(int(n/2)) #遞歸
print('>>>',n)
calc(10)
10
5
2
1
>>> 1
函數式程式設計介紹:
函數式程式設計是一種抽象程度很高的程式設計範式,純粹的函數式程式設計語言的編寫沒有變量。是以,任意一個函數,隻要輸入确定的,輸出就是确定的,這種純函數我們稱之為沒有副作用。而允許使用變量的程式設計語言,由于函數内部的變量狀态不确定,同樣的輸入,可能得到不同的輸出,是以這種函數是有副作用的。
函數式程式設計的一個特點就是,允許把函數本身作為參數傳入另一個函數,還允許傳回一個函數。
Python對函數式程式設計提供部分支援,由于python允許使用變量,是以,python不是純函數式程式設計語言。
想學函數式程式設計可以學lisp、hashshell、erlang
高階函數:
變量可以指向函數,函數的參數能接收變量,那麼一個函數就可以接收另一個函數作為參數,這種函數就叫做高階函數。
def add(a,b,f):
return f(a)+f(b)
res=add(3,-6,abs) #abs 絕對值的意思
print(res)
結果:
9
<a href="http://down.51cto.com/data/2368749" target="_blank">附件:http://down.51cto.com/data/2368749</a>
本文轉自白羊IT51CTO部落格,原文連結:http://blog.51cto.com/000011211684/1983175,如需轉載請自行聯系原作者