遞歸函數(shù)
1.遞歸函數(shù):在函數(shù)中調(diào)用函數(shù)就是遞歸函數(shù)
2.方法步驟
第一步:聲明函數(shù)(和普通函數(shù)一樣)
第二步:找臨界值(函數(shù)結(jié)束的條件)
第三步:找關(guān)系
假設(shè)函數(shù)的功能已經(jīng)實(shí)現(xiàn)了僵娃,找f(n)與f(n—1)的關(guān)系
第四步:使用f(n-1)去實(shí)現(xiàn)f(n)的功能
例:用遞歸實(shí)現(xiàn):1+2+3+...+N
def print_star(n):
if n == 1:
return '*'
print(n*'*')
print_star(n-1)
print_star(7)
匿名函數(shù)
1.語法:lambda 參數(shù)列表:返回值
2.說明
lambda - 關(guān)鍵字,固定寫法
參數(shù)列表 - 形參列表舵匾,以‘參數(shù)名1锉罐,參數(shù)名2,...’
: - 固定寫法
返回值 - 寫任何有結(jié)果的表達(dá)式都可以
注意:匿名函數(shù)的函數(shù)體内列,只有一條語句纽哥,而且這條語句的結(jié)果就是函數(shù)的返回值(不需要return)
3.使用條件
a.函數(shù)的功能一行代碼就可以實(shí)現(xiàn)
b.函數(shù)的功能不會(huì)重復(fù)使用
例:求兩個(gè)數(shù)的和
sum1 = lambda num1, num2: num1 + num2
print(type(sum1))
print(sum1(10, 20))
補(bǔ)充:Python中的三目運(yùn)算符
C語言 : 條件語句?值1:值2 —— 如果條件語句的結(jié)果為True代箭,整個(gè)表達(dá)式的結(jié)果是值1否則是值2
Python:值1 if 條件語句 else 值2 —— 如果條件語句的結(jié)果是True墩划,整個(gè)表達(dá)式的結(jié)果是值1否則是值2
例:寫一個(gè)匿名函數(shù),求兩個(gè)數(shù)的最大值
max_value = lambda num1,num2: num1 if num1>num2 else num2
print(max_value(10,2))
實(shí)參高階函數(shù)
概念:一個(gè)函數(shù)可以作為另一個(gè)函數(shù)的參數(shù)梢卸,如果一個(gè)函數(shù)的參數(shù)也是函數(shù)走诞,那么這種函數(shù)叫實(shí)參高階函數(shù)。
返回值高階函數(shù)
概念:一個(gè)函數(shù)的返回值如果也是一個(gè)函數(shù)蛤高,那么這個(gè)函數(shù)就是 返回值高階函數(shù)
迭代器
1.什么是迭代器
a.迭代器是容器型數(shù)據(jù)類型(序列)蚣旱,可變(不支持增刪改),有序(不支持下標(biāo)操作)
b.保存在迭代器中的元素戴陡,只能取塞绿,并且取出后迭代器中就不再保存,也不可以再往迭代器中添加元素
c.迭代器沒有對(duì)應(yīng)格式的數(shù)據(jù)恤批,迭代器只能通過將其他的序列轉(zhuǎn)換成迭代器异吻,或者是生成器
2.獲取迭代器中的元素(不管用什么樣的方式去獲取迭代器中的元素,獲取一個(gè)就會(huì)少一個(gè))
a.獲取單個(gè)元素:next(迭代器) - 獲取迭代器頂部的元素(最上層/第一個(gè)元素)
b.遍歷 (for)
生成器
1.什么是生成器
a.生成器就是迭代器 - 獲取元素和迭代器一樣(只能單個(gè)單個(gè)取喜庞,且取一個(gè)少一個(gè))
b.調(diào)用函數(shù)體中有yield關(guān)鍵字的函數(shù)诀浪,就可以得到一個(gè)生成器
2.yield
a. yield只能出現(xiàn)在函數(shù)體中
b.調(diào)用有yield關(guān)鍵字的函數(shù),不會(huì)執(zhí)行函數(shù)體延都,也不會(huì)獲取返回值雷猪,而是得到一個(gè)生成器
例:
def func1():
print('我是一個(gè)函數(shù)')
yield
return 100
print(func1())
3.生成器怎么產(chǎn)生數(shù)據(jù)
a.看一個(gè)生成器能夠產(chǎn)生幾個(gè)數(shù)據(jù),看執(zhí)行完生成器對(duì)應(yīng)的函數(shù)會(huì)遇到幾次yield晰房;yield后面的值就是生成器能產(chǎn)生數(shù)據(jù)
def func2():
yield 'abc'
yield 'd' 'c'
gen1 = func2()
print(gen1)
print(next(gen1))
print(next(gen1))
4.生成器生成數(shù)據(jù)的原理
生成器不會(huì)同時(shí)去將所有的元素保存起來求摇,而是需要數(shù)據(jù)時(shí)產(chǎn)生數(shù)據(jù)
獲取生成器元素的時(shí)候,就去執(zhí)行生成器對(duì)應(yīng)的函數(shù)的函數(shù)體殊者,從前往后執(zhí)行与境,
直到遇到y(tǒng)ield為止,并且將yield后面的值作為結(jié)果猖吴,同時(shí)保存結(jié)果位置摔刁;
下次獲取下一個(gè)元素的時(shí)候,接著上次結(jié)束的位置往后執(zhí)行海蔽,直到遇到下一個(gè)yield簸搞;
以此類推...
如果執(zhí)行到函數(shù)結(jié)束都沒有遇到y(tǒng)ield扁位,next函數(shù)會(huì)報(bào)StopIteration錯(cuò)誤
def func3():
print('======第一個(gè)數(shù)據(jù)=======')
yield 1
print('======第二個(gè)數(shù)據(jù)=======')
yield 2
print('======第三個(gè)數(shù)據(jù)=======')
yield 3
print('end')
gen2 = func3()
print(next(gen2))
print(next(gen2))
print(next(gen2))
生成式
1.生成式本質(zhì)就是生成器
2.語法1
(表達(dá)式 for 變量 in 序列) - 創(chuàng)建一個(gè)生成器
def func1():
for 變量 in 序列:
yield 表達(dá)式
[表達(dá)式 for 變量 in 序列] - 將生成式對(duì)應(yīng)的生成器轉(zhuǎn)換成列表
語法2
(表達(dá)式 for 變量 in 序列 if 條件語句) - 創(chuàng)建一個(gè)生成器
ef func2():
for 變量 in 序列:
if 條件
yield 變量