2019-08-02 day-10總結(jié)

函數(shù)

一.匿名函數(shù)

1.匿名函數(shù)
匿名函數(shù)就是沒(méi)有函數(shù)名的函數(shù);匿名函數(shù)可以看成是類型是function的值。
注意:匿名函數(shù)本質(zhì)還是函數(shù),函數(shù)中除了聲明語(yǔ)法之外,其他的都適用于匿名函數(shù)。(格式)

1)語(yǔ)法
lambda 參數(shù)列表:返回值

2)說(shuō)明
lambda ?- ? 關(guān)鍵字
參數(shù)列表 ?- ? 參數(shù)名1,參數(shù)名2,....
: ?- ?固定
返回值 ?- ? 任何有結(jié)果的表達(dá)式都可以;它是匿名函數(shù)的函數(shù)體,相當(dāng)于普通函數(shù)中的return語(yǔ)句

調(diào)用匿名函數(shù):保存匿名函數(shù)值的變量(實(shí)參列表)

3)參數(shù)
普通函數(shù)中除了用'參數(shù)名:類型'的形式來(lái)指定參數(shù)類型以外,其他的語(yǔ)法匿名函數(shù)都支持

二.變量的作用域

1.變量的作用域:變量在程序中能夠使用的范圍

2.全局變量和局部變量

1)全局變量:沒(méi)有聲明在函數(shù)里面或者類里面的變量就是全局變量
作用域:從聲明開(kāi)始到文件結(jié)束的任何位置

for x in range(5):       # x是全局變量
    print(x)

2)局部變量:聲明函數(shù)中的變量就是局部變量(函數(shù)的參數(shù)相當(dāng)于聲明在函數(shù)中的變量)
作用域:從聲明開(kāi)始到函數(shù)結(jié)束的任何位置

函數(shù)調(diào)用過(guò)程(內(nèi)存):壓棧
當(dāng)調(diào)用函數(shù)的時(shí)候,系統(tǒng)會(huì)自動(dòng)在內(nèi)存的棧區(qū)間為這個(gè)函數(shù)開(kāi)辟一個(gè)獨(dú)立的內(nèi)存區(qū)域,用來(lái)保存在函數(shù)中聲明的變量。
當(dāng)函數(shù)調(diào)用結(jié)束,這個(gè)區(qū)域會(huì)自動(dòng)釋放。

3.global 和 nonlocal是函數(shù)中的關(guān)鍵字,和return一樣只能在函數(shù)體中使用。

1)global : 在函數(shù)中聲明一個(gè)全局變量
global 變量
變量 = 值

2)nonlocal:在局部的局部中去修改局部變量的值。
nolocal 變量
變量 = 值

三.遞歸

1.什么是遞歸函數(shù)

自己調(diào)自己的函數(shù)(函數(shù)體中調(diào)用當(dāng)前函數(shù))
循環(huán)能做的事,遞歸都可以做

注意:能用循環(huán)解決的問(wèn)題就不要用遞歸

2.怎么寫(xiě)遞歸函數(shù)

第一步:找臨界值(循環(huán)結(jié)束的條件),在這兒需要結(jié)束函數(shù)
第二步:找關(guān)系 找f(n)和f(n-1)的關(guān)系(找當(dāng)次循環(huán)和上次循環(huán)的關(guān)系)
第三步:假設(shè)函數(shù)的功能已經(jīng)實(shí)現(xiàn),根據(jù)關(guān)系用f(n-1)去實(shí)現(xiàn)f(n)的功能

# 練習(xí),遞歸實(shí)現(xiàn)以下功能
def _print(n):
    if n == 1:
        return '*'+'\n'
    else:
        return _print(n-1) + '*' * n + '\n'

print(_print(7))

四.迭代器

1.迭代器(iter)
迭代器作為容器可以保存多個(gè)數(shù)據(jù);數(shù)據(jù)的來(lái)源:1)將其它序列轉(zhuǎn)換成迭代器 2)生成器

1)將其他序列轉(zhuǎn)換成迭代器

iter1 = iter('abc')
print(iter1,type(iter1))       #迭代器不能直接取出來(lái)

2.獲取元素
不管用哪種方式獲取了元素的值,那么這個(gè)元素在迭代器中就不存在了

1)獲取單個(gè)元素:next(迭代器)、迭代器.next() -> 獲取迭代器的第一個(gè)元素
如果迭代器為空,用next獲取元素的時(shí)候會(huì)報(bào)錯(cuò)StopIteration

2)遍歷
for 變量 in 迭代器:
pass

五.生成器

1.什么是生成器
1)生成器就是迭代器的一種
2)調(diào)用一個(gè)帶有yield的關(guān)鍵字就可以得到一個(gè)生成器

如果一個(gè)函數(shù)中有yiel關(guān)鍵字:
a.調(diào)用函數(shù)不會(huì)執(zhí)行函數(shù)體
b.函數(shù)調(diào)用表達(dá)式的值不是函數(shù)的返回值,而是一個(gè)生成器對(duì)象

1.怎么創(chuàng)建一個(gè)生成器

def func1():
    print('=====')
    yield
    return  100

gen1 = func1()
print(gen1)

當(dāng)生成器函數(shù)中含有return時(shí),return不會(huì)返回任何值,會(huì)直接終止當(dāng)前生成器,對(duì)yield的作用沒(méi)有影響,當(dāng)函數(shù)執(zhí)行到return時(shí)候,調(diào)用next()來(lái)執(zhí)行生成器則會(huì)報(bào)錯(cuò),如果使用for循環(huán)遍歷,for循環(huán)會(huì)自動(dòng)捕獲該異常,直接停止遍歷

2.生成器產(chǎn)生數(shù)據(jù)的原理

1)一個(gè)生成器能產(chǎn)生多少個(gè)數(shù)據(jù),就看執(zhí)行完生成器對(duì)應(yīng)的函數(shù)的函數(shù)體會(huì)遇到幾次yield
yield后面的值就是生成器能產(chǎn)生的數(shù)據(jù)

2)每次獲取生成器中的元素的時(shí)候,都是先去執(zhí)行函數(shù)體,直到遇到y(tǒng)ield,并且將yield后面的值作為獲取元素的結(jié)果。
并且保留結(jié)束的位置,下次獲取下一個(gè)值的時(shí)候,從上次結(jié)束的位置接著執(zhí)行函數(shù)體,直到遇到y(tǒng)ield...
如果從開(kāi)始執(zhí)行到函數(shù)結(jié)束都沒(méi)有遇到y(tǒng)ield,就會(huì)報(bào)StopIteration的錯(cuò)誤

def func2():
    print('+++++')
    yield
    print('----')
    yield 100

gen2 = func2()
print(next(gen2))
print(next(gen2))
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容