我們先后講了匿名函數(shù)儡率、變量的作用域挂据、函數(shù)遞歸、迭代器儿普、和生成器
匿名函數(shù)
沒有函數(shù)名的函數(shù)(注意:匿名函數(shù)本質(zhì)還是函數(shù)崎逃,函數(shù)中除了聲明語法以外其他的都使用匿名函數(shù)
它的語法是:
lambda 參數(shù)列表:返回值
參數(shù)列表:- 參數(shù)1,參數(shù)2眉孩,个绍。。浪汪。
:- 固定
返回值 - 任何有結(jié)果的表達(dá)式:它是匿名函數(shù)的函數(shù)體巴柿,相當(dāng)于普通函數(shù)的return
調(diào)用匿名函數(shù):保存匿名函數(shù)值的變量(實參列表)
參數(shù)
普通函數(shù)中除了用'參數(shù)名:類型’的形式來指定參數(shù)類型以為,其他的語法匿名函數(shù)都支持
變量的作用域
變量的作用域:變量在程序中能夠使用的范圍
全局變量
沒有聲明在函數(shù)或者類里面的變量就是全局變量
作用域:從聲明開始到文件結(jié)束
局部變量
聲明在函數(shù)中的變量就是局部變量(函數(shù)的參數(shù)就相當(dāng)于聲明在函數(shù)中的變量)
作用域:從聲明開始到函數(shù)結(jié)束
函數(shù)調(diào)用過程:壓棧
當(dāng)調(diào)用函數(shù)時死遭,系統(tǒng)會自動在內(nèi)存的棧區(qū)間為這個函數(shù)開辟一個獨立的內(nèi)存區(qū)域
用來保存在函數(shù)聲明的變量广恢。當(dāng)函數(shù)調(diào)用結(jié)束這個內(nèi)存區(qū)域會自動釋放。
global和nonlocal函數(shù)中的關(guān)鍵字 只能在函數(shù)體中使用
global - 在函數(shù)中聲明一個全局變量
global 變量
變量 = 值
nonlocal
在局部的局部中去修改局部變量的值
變量 = 值
遞歸函數(shù)
什么是遞歸函數(shù)
自己調(diào)自己的函數(shù)(函數(shù)體中調(diào)用當(dāng)前函數(shù))
循環(huán)能做的事情殃姓,遞歸都可以做
怎么寫遞歸函數(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)實現(xiàn)袁波,根據(jù)關(guān)系用f(n-1)1去實現(xiàn)f(n)的功能
注意:能用循環(huán)解決的問題就不要用遞歸
迭代器
1.迭代器(iter)
迭代器作為容器可以保存多個數(shù)據(jù):數(shù)據(jù)的來源:將其他序列轉(zhuǎn)換成迭代器;生成器
將其他序列轉(zhuǎn)換成迭代器
2.獲取元素
不管用哪種方式去獲取元素的值蜗侈,那么這個元素在迭代器中就不存在了
1)獲取單個元素 next(迭代器)篷牌、迭代器.next() - 獲取迭代器中的第一個元素
如果迭代為空,用next獲取元素時會報錯
2)遍歷
生成器
什么是生成器
生成器就是迭代器的一種
調(diào)用一個帶有yield關(guān)鍵字的函數(shù)就可以得到一個生成器
如果一個函數(shù)中有y
生成器產(chǎn)生數(shù)據(jù)的原理
1)一個生成器能夠產(chǎn)生多少數(shù)據(jù),就看執(zhí)行完生成器對應(yīng)的函數(shù)的函數(shù)體會遇到幾次yield
yield后面的值就是生成器能夠產(chǎn)生的數(shù)據(jù)
2)每次獲取生成器中的元素的時候,都是先去執(zhí)行函數(shù)體,直到遇到y(tǒng)ield,并且將yield后面的值作為獲取元素的結(jié)果
并且保留結(jié)束的位置踏幻,下次獲取下一個值的時候枷颊,從上次結(jié)束的位置接著執(zhí)行函數(shù)體,直到遇到y(tǒng)ield...
如果從開始執(zhí)行到函數(shù)結(jié)束都沒有遇到y(tǒng)ield,就會報StopIteration錯誤