函數(shù)就是一種特殊的類型。聲明函數(shù)的時(shí)候勃救,其實(shí)就是聲明一個(gè)類型為function的變量迂尝,所以變量能做的事情,函數(shù)都能做剪芥。
一、回調(diào)函數(shù)
1琴许、函數(shù)作為函數(shù)的參數(shù)
ef clean_floor(time):
print('%s,做地板清潔服務(wù)'%time)
print('收費(fèi)100')
return 100
def clean_kitchen(time):
print('%s,做廚房清潔服務(wù)'%time)
print('收費(fèi)200')
return 200
def call_service(time:str,service):
service(time)
#將函數(shù)作為參數(shù)税肪,傳給其他函數(shù)
call_service('上午十點(diǎn)',clean_floor)
call_service('下午五點(diǎn)',clean_kitchen)
結(jié)果:
上午十點(diǎn),做地板清潔服務(wù)
收費(fèi)100
下午五點(diǎn),做廚房清潔服務(wù)
收費(fèi)200
2、函數(shù)作為函數(shù)的返回值
def operation(operator:str):
if operator == '+':
def my_sum(*nums):
sum = 0
for num in nums:
sum += num
print(sum)
elif operator == '*':
def my_sum(*nums):
sum1 = 1
for num in nums:
sum1 *= num
print(sum1)
#將函數(shù)返回
return my_sum #返回內(nèi)部函數(shù)作為外部函數(shù)的返回值
operation('+')(1,2)
operation('*')(2,3,4)
結(jié)果:
3
24
二榜田、生成器和迭代器
生成器就是來生成迭代器益兄,可以把迭代器看成一個(gè)容器,類似列表箭券。
生成式--產(chǎn)生一個(gè)迭代器的表達(dá)式(下面等號(hào)右邊的式子)
通過將生成式產(chǎn)生的迭代器轉(zhuǎn)換成了一個(gè)列表
a = (x for x in range(10))
說明:把等號(hào)右邊全部保存給 a 净捅,每次調(diào)用next(a)取一個(gè)值,并且保存已經(jīng)調(diào)用的位置辩块,下次調(diào)用next(a)時(shí)繼續(xù)調(diào)用后面的值蛔六。
生成器和迭代器都是通過 next()來獲取里面的數(shù)據(jù)荆永。不管通過什么方式取出數(shù)據(jù),取出數(shù)據(jù)的位置不會(huì)返回国章。
print(next(a))
1具钥、把生成式的結(jié)果轉(zhuǎn)換成一個(gè)列表([生成式]):
a = [x for x in range(10)]
print(a)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
2、把生成式的結(jié)果轉(zhuǎn)換成一個(gè)字典:
條件:生成式生成的結(jié)果是一個(gè)元組液兽,并且元組的元素個(gè)數(shù)必須是 2
dict1 = dict((x,x*2) for x in range(10))
print(dict1)
{0: 0, 1: 2, 2: 4, 3: 6, 4: 8, 5: 10, 6: 12, 7: 14, 8: 16, 9: 18}
#用生成式交換字典key和value
dict1 = dict((value,key) for key,value in {'a':1,'b':2}.items())
print(dict1)
{1: 'a', 2: 'b'}
三骂删、生成器
yield 關(guān)鍵字
只要函數(shù)中有 yield 關(guān)鍵字,不管執(zhí)行yield語(yǔ)句與否四啰,這個(gè)函數(shù)都會(huì)變成一個(gè)生成器宁玫。
a、有 yield 的函數(shù)柑晒,在調(diào)用函數(shù)的時(shí)候不再是獲取返回值欧瘪,而是產(chǎn)生一個(gè)生成器對(duì)象,生成器對(duì)象中保留的是函數(shù)體敦迄。
b恋追、當(dāng)通過 next 獲取生成器中的數(shù)據(jù)的時(shí)候,才會(huì)去執(zhí)行函數(shù)體罚屋,執(zhí)行到 yield 為止苦囱,并且將 yiled 后面的結(jié)果作為生成的數(shù)據(jù)返回,同時(shí)記錄結(jié)束的位置脾猛,下次再調(diào)用 next 的時(shí)候撕彤,從上次結(jié)束的位置接著往后執(zhí)行。
練習(xí):寫一個(gè)生成器猛拴,可以產(chǎn)生一個(gè)斐波那契數(shù)列
# 練習(xí):
def fib():
yield 1
yield 1
x = 1
y = 1
while True:
x,y = x+y,x
yield x
n = fib() #必須保存一下羹铅,不然直接next會(huì)產(chǎn)生多個(gè)生成器,每次取第一個(gè)值愉昆,結(jié)果全為 1
print(next(n),end=' ')
print(next(n),end=' ')
print(next(n),end=' ')
print(next(n),end=' ')
print(next(n),end=' ')
print(next(n),end=' ')
結(jié)果:
1 1 2 3 5 8
四职员、迭代器 -- iter
生成器和生成式產(chǎn)生的對(duì)象就是迭代器。
將列表轉(zhuǎn)換成迭代器對(duì)象
iter1 = iter([1, 2, 3, 4])
print(iter1)
print(next(iter1))
print(next(iter1))
print(next(iter1))
1
2
3
利用 iter 把其他類型轉(zhuǎn)換成迭代器跛溉,取出時(shí)候都是用 next 取出焊切,和生成器一樣,只是產(chǎn)生方式不同芳室。