【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):
    print(name)
    print(age,args,kwargs)
    school("Test")


def school(source):
    print(source)

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

alex

 

 

全局變量(在頂層,第一級定義的變量都是全局變量)

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)

運行結果:

before change: alex Mage  #局部變量優先,雖然內部變了,但是全局變量還是沒變。

after change: ALEX

alex

Oldboy  #全局變量

 

改全局變量

不要這麼用1

school='Oldboy'
def logers(name):
    global school  #我要把函數的全局變量改了
    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)

運行結果:

before change: alex Mage

after change: ALEX

alex

Mage

 

總結:

  1. 局部變量的作用域只在子程序(函數)中有效

    2、全局變量的作用域在整個程序

    3、全局變量配置在程序最頂層

    4、需要把全局變量改爲局部變量那就用global 變量名(不要那麼用)

     

    不要這麼用2:(作死)

def student():
    global name  #這個作用是把 name定義爲全局變量
    name='alex'

student()
print(name)

 

爲啥:容易混亂程序(找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不是純函數式編程語言。

想學函數式編程可以學lisphashshellerlang

 

 

高階函數:

變量可以指向函數,函數的參數能接收變量,那麼一個函數就可以接收另一個函數作爲參數,這種函數就叫做高階函數。

def add(a,b,f):
    return f(a)+f(b)

res=add(3,-6,abs)  #abs 絕對值的意思
print(res)

結果:

9


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章