python的迭代器,生成器和裝飾器你了解嗎
python 迭代器與生成器,裝飾器
迭代器對象從集合的第一個元素開始訪問,直到所有的元素被訪問完結(jié)束。
迭代器有兩個基本的方法:iter() 和 next()。
字符串,列表或元組對象都可用于創(chuàng)建迭代器:
list1=[1,2,3] s=iter(list1) # 創(chuàng)建迭代器對象 print(next(s)) # 輸出迭代器的下一個元素 print(next(s)) print(next(s))

直到計算出最后一個元素,沒有更多的元素時,拋出StopIteration的錯誤

迭代器對象可以使用常規(guī)for語句進(jìn)行遍歷:
list2=[1,2,3,4,5]
s2 = iter(list2) # 創(chuàng)建迭代器對象
for h in s2:
print (h, end="-")

生成器
帶有 yield 的函數(shù)在 Python 中被稱之為 generator(生成器)(自己制作迭代器可以看做是生成器)
#注意括號
#列表生成式
lis = [x+x for x in range(5)]
print(lis)
#生成器
gen= (x+x for x in range(5))
print(gen)
# gen = (x+x for x in range(5))
# print(next(gen))
# print(next(gen))
# print(next(gen))
# print(next(gen))
# print(next(gen))
generator_ex = (x+x for x in range(5))
for i in generator_ex:
print(i)

自己產(chǎn)生一個支持小數(shù)的range生成器(即帶yield的迭代器)
你先把yield看做“return”,這個是直觀的,它首先是個return,普通的return是什么意思,就是在程序中返回某個值,返回之后程序就不再往下運(yùn)行了??醋鰎eturn之后再把它看做一個是生成器(generator)的一部分(帶yield的函數(shù)才是真正的迭代器),
def frange(star,stop,step):
x=star
while x<stop:
yield x
x+=step
for i in frange(10,20,0.5):
print(i)

下圖最直觀得可以看出yield的作用
把yield想想成return,return了一個4之后,程序停止,并沒有執(zhí)行賦值給res操作。
一個帶有 yield 的函數(shù)就是一個 generator,生成一個 generator 看起來像函數(shù)調(diào)用,但不會執(zhí)行任何函數(shù)代碼,直到對其調(diào)用 next()(在 for 循環(huán)中會自動調(diào)用 next())才開始執(zhí)行。雖然執(zhí)行流程仍按函數(shù)的流程執(zhí)行,但每執(zhí)行到一個 yield 語句就會中斷,并返回一個迭代值,下次執(zhí)行時從 yield 的下一個語句繼續(xù)執(zhí)行??雌饋砭秃孟褚粋€函數(shù)在正常執(zhí)行的過程中被 yield 中斷了數(shù)次,每次中斷都會通過 yield 返回當(dāng)前的迭代值。
def foo():
print("starting...")
while True:
print("yield前")
res = yield 4
print("yield后")
print("res:", res)
g = foo()
print(next(g))
print("*" * 20)
print(next(g))

在我們調(diào)用這個函數(shù)的時候,第一件事并不是執(zhí)行這個函數(shù),而是將這個函數(shù)做為參數(shù)傳入它頭頂上這頂帽子,這頂帽子我們稱之為裝飾函數(shù) 或 裝飾器。
裝飾器的使用方法很固定:
先定義一個裝飾函數(shù)(帽子)(也可以用類、偏函數(shù)實(shí)現(xiàn))
再定義你的業(yè)務(wù)函數(shù)、或者類(人)
最后把這頂帽子帶在這個人頭上
裝飾器的簡單的用法有很多,這里舉兩個常見的。
日志打印器
時間計時器
# 這是裝飾函數(shù)
def logger(func):
def wrapper(*args, **kw):
print('我準(zhǔn)備開始計算:{} 函數(shù)了:'.format(func.__name__))
# 真正執(zhí)行的是這行。
func(*args, **kw)
print('啊哈,我計算完啦。給自己加個雞腿!!')
return wrapper
@logger
def add(x, y):
print('{} + {} = {}'.format(x, y, x+y))
add(200, 50)

# 這是裝飾函數(shù)
def timer(func):
def wrapper(*args, **kw):
t1=time.time()
# 這是函數(shù)真正執(zhí)行的地方
func(*args, **kw)
t2=time.time()
# 計算下時長
cost_time = t2-t1
print("花費(fèi)時間:{}秒".format(cost_time))
return wrapper
import time
@timer
def want_sleep(sleep_time):
time.sleep(sleep_time)
want_sleep(10)

def american():
print("我來自中國。")
def chinese():
print("I am from America.")
def say_hello(contry):
def wrapper(func):
def deco(*args, **kwargs):
if contry == "china":
print("你好!")
elif contry == "america":
print('hello.')
else:
return
# 真正執(zhí)行函數(shù)的地方
func(*args, **kwargs)
return deco
return wrapper
@say_hello("china")
def american():
print("我來自中國。")
@say_hello("america")
def chinese():
print("I am from America.")

總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
python使用多線程查詢數(shù)據(jù)庫的實(shí)現(xiàn)示例
這篇文章主要介紹了python使用多線程查詢數(shù)據(jù)庫的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
詳解tensorflow訓(xùn)練自己的數(shù)據(jù)集實(shí)現(xiàn)CNN圖像分類
本篇文章了tensorflow訓(xùn)練自己的數(shù)據(jù)集實(shí)現(xiàn)CNN圖像分類,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-02-02
Pygame游戲開發(fā)之太空射擊實(shí)戰(zhàn)入門篇
相信大多數(shù)8090后都玩過太空射擊游戲,在過去游戲不多的年代太空射擊自然屬于經(jīng)典好玩的一款了,今天我們來自己動手實(shí)現(xiàn)它,在編寫學(xué)習(xí)中回顧過往展望未來,下面開始入門篇2022-08-08
python調(diào)用java的Webservice示例
這篇文章主要介紹了python調(diào)用java的Webservice具體方法,包含java端和python實(shí)現(xiàn)代碼,需要的朋友可以參考下2014-03-03
python爬蟲之爬取百度音樂的實(shí)現(xiàn)方法
今天小編就為大家分享一篇python爬蟲之爬取百度音樂的實(shí)現(xiàn)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-08-08
keras的backend 設(shè)置 tensorflow,theano操作
這篇文章主要介紹了keras的backend 設(shè)置 tensorflow,theano操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06
利用Python對中國500強(qiáng)排行榜數(shù)據(jù)進(jìn)行可視化分析
這篇文章主要介紹了利用Python對中國500強(qiáng)排行榜數(shù)據(jù)進(jìn)行可視化分析,從不同角度去對數(shù)據(jù)進(jìn)行統(tǒng)計分析,可視化展示,下文詳細(xì)內(nèi)容介紹需要的小伙伴可以參考一下2022-05-05
pytorch實(shí)現(xiàn)mnist手寫彩色數(shù)字識別
這篇文章主要介紹了pytorch-實(shí)現(xiàn)mnist手寫彩色數(shù)字識別,文章圍繞主題展開詳細(xì)的內(nèi)容姐介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-09-09

