前言
變量作用域通孽,全局變量锭吨,局部變量,函數(shù)作為參數(shù)辛孵,匿名函數(shù)厨疙,遞歸函數(shù),生成器函數(shù)轩娶。
變量作用域
1>變量的作用域就是定義的變量可以使用的代碼范圍
2>全局變量 是可以被所有的函數(shù)訪問的,除非被刪除掉儿奶,否則一直存活到腳本運(yùn)行結(jié)束。
3>局部變量只能在函數(shù)或代碼塊內(nèi)部被調(diào)用,一旦函數(shù)或代碼塊執(zhí)行完成鳄抒,數(shù)據(jù)就會(huì)釋放闯捎。引用比全局變量速度快,應(yīng)優(yōu)先考慮使用许溅。
變量的作用域
1>當(dāng)程序運(yùn)行時(shí)瓤鼻,python先從局部作用域開始搜索變量,如果局部沒有則從全局中找贤重,找不到會(huì)拋出NameError茬祷,如果全局變量與局部變量重名,則內(nèi)部訪問則是局部變量并蝗,外部是全局變量祭犯。
2>在函數(shù)中想要對(duì)全局變量進(jìn)行修改,要用到關(guān)鍵字global借卧。
匿名函數(shù)
1>lambda? 參數(shù)1盹憎,參數(shù)2… : 返回值。
2>print((lambda x,y,z:x+y+z)(1,2,3))铐刘。
遞歸函數(shù)
程序調(diào)用自身的編程技巧稱為遞歸(recursion)陪每。
# 使用遞歸方法實(shí)現(xiàn)5!
```def func(n):
????if n == 1 or n == 0:
????????????return 1
????????else:
????????????return n * func(n-1)
print(func(5))```
遞歸函數(shù)優(yōu)缺點(diǎn)
1>遞歸函數(shù)的優(yōu)點(diǎn)就是定義簡(jiǎn)單,邏輯清楚镰吵。
2>缺點(diǎn)是遞歸效率不高檩禾,因?yàn)槊恳淮握{(diào)用都有相應(yīng)的數(shù)值存放在棧,而棧的空間是有限的
3>此在寫函數(shù)時(shí)候要注意不可無(wú)限遞歸或者遞歸次數(shù)非常大
遞歸函數(shù)
要求輸入一個(gè)數(shù)字表示是第幾個(gè)數(shù)字疤祭,正確輸出第n個(gè)斐波那契數(shù)
def fun(n):
????if n < 0:
????????print('輸入有誤盼产!')
????elif n == 1 or n == 2:
????????return 1
????else:
????????return fun(n-1) + fun(n-2)
print(fun(6))
生成器函數(shù)
我們之前學(xué)過(guò)元組生成器.(i for i in range(10))。
yield語(yǔ)句的函數(shù)也可以用來(lái)創(chuàng)建生成器對(duì)象勺馆。
每次執(zhí)行到y(tǒng)ield語(yǔ)句并返回一個(gè)值之后會(huì)暫拖肥郏或掛起后面代碼的執(zhí)行。
下次通過(guò)生成器對(duì)象的__next__()方法草穆、內(nèi)置函數(shù)next()灌灾、for循環(huán)遍歷生成器對(duì)象元素或其他方式顯式“索要”數(shù)據(jù)時(shí)恢復(fù)執(zhí)行。
生成器--斐波那契
def f():
? a, b =1, 1? ? ? ? ? ?
? while True:
????yield a?????? # 暫停執(zhí)行悲柱,需要時(shí)再產(chǎn)生一個(gè)新元素
????a, b = b, a+b??? # 繼續(xù)生成新元素
a= f()
fori in range(10):
print(next(a), end='?')