天天看點

【12】Python函數學習(中)

作用域、局部和全局變量

前向引用:

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,如需轉載請自行聯系原作者