網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
python 迭代器與生成器,裝飾器
迭代器對(duì)象從集合的第一個(gè)元素開(kāi)始訪(fǎng)問(wèn),直到所有的元素被訪(fǎng)問(wèn)完結(jié)束。
迭代器有兩個(gè)基本的方法:iter() 和 next()。
字符串,列表或元組對(duì)象都可用于創(chuàng)建迭代器:
list1=[1,2,3] s=iter(list1) # 創(chuàng)建迭代器對(duì)象 print(next(s)) # 輸出迭代器的下一個(gè)元素 print(next(s)) print(next(s))
直到計(jì)算出最后一個(gè)元素,沒(méi)有更多的元素時(shí),拋出StopIteration的錯(cuò)誤
迭代器對(duì)象可以使用常規(guī)for語(yǔ)句進(jìn)行遍歷:
list2=[1,2,3,4,5] s2 = iter(list2) # 創(chuàng)建迭代器對(duì)象 for h in s2: print (h, end="-")
生成器
帶有 yield 的函數(shù)在 Python 中被稱(chēng)之為 generator(生成器)(自己制作迭代器可以看做是生成器)
#注意括號(hào) #列表生成式 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)生一個(gè)支持小數(shù)的range生成器(即帶yield的迭代器)
你先把yield看做“return”,這個(gè)是直觀的,它首先是個(gè)return,普通的return是什么意思,就是在程序中返回某個(gè)值,返回之后程序就不再往下運(yùn)行了。看做return之后再把它看做一個(gè)是生成器(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了一個(gè)4之后,程序停止,并沒(méi)有執(zhí)行賦值給res操作。
一個(gè)帶有 yield 的函數(shù)就是一個(gè) generator,生成一個(gè) generator 看起來(lái)像函數(shù)調(diào)用,但不會(huì)執(zhí)行任何函數(shù)代碼,直到對(duì)其調(diào)用 next()(在 for 循環(huán)中會(huì)自動(dòng)調(diào)用 next())才開(kāi)始執(zhí)行。雖然執(zhí)行流程仍按函數(shù)的流程執(zhí)行,但每執(zhí)行到一個(gè) yield 語(yǔ)句就會(huì)中斷,并返回一個(gè)迭代值,下次執(zhí)行時(shí)從 yield 的下一個(gè)語(yǔ)句繼續(xù)執(zhí)行。看起來(lái)就好像一個(gè)函數(shù)在正常執(zhí)行的過(guò)程中被 yield 中斷了數(shù)次,每次中斷都會(huì)通過(guò) 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)用這個(gè)函數(shù)的時(shí)候,第一件事并不是執(zhí)行這個(gè)函數(shù),而是將這個(gè)函數(shù)做為參數(shù)傳入它頭頂上這頂帽子,這頂帽子我們稱(chēng)之為裝飾函數(shù) 或 裝飾器。
裝飾器的使用方法很固定:
先定義一個(gè)裝飾函數(shù)(帽子)(也可以用類(lèi)、偏函數(shù)實(shí)現(xiàn))
再定義你的業(yè)務(wù)函數(shù)、或者類(lèi)(人)
最后把這頂帽子帶在這個(gè)人頭上
裝飾器的簡(jiǎn)單的用法有很多,這里舉兩個(gè)常見(jiàn)的。
日志打印器
時(shí)間計(jì)時(shí)器
# 這是裝飾函數(shù) def logger(func): def wrapper(*args, **kw): print('我準(zhǔn)備開(kāi)始計(jì)算:{} 函數(shù)了:'.format(func.__name__)) # 真正執(zhí)行的是這行。 func(*args, **kw) print('啊哈,我計(jì)算完啦。給自己加個(gè)雞腿!!') 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() # 計(jì)算下時(shí)長(zhǎng) cost_time = t2-t1 print("花費(fèi)時(shí)間:{}秒".format(cost_time)) return wrapper import time @timer def want_sleep(sleep_time): time.sleep(sleep_time) want_sleep(10)
def american(): print("我來(lái)自中國(guó)。") 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("我來(lái)自中國(guó)。") @say_hello("america") def chinese(): print("I am from America.")
總結(jié)
原文鏈接:https://blog.csdn.net/weixin_44740756/article/details/122844911
相關(guān)推薦
- 2022-09-01 C語(yǔ)言中static與sizeof查缺補(bǔ)漏篇_C 語(yǔ)言
- 2022-09-30 Centos7?Shell編程之正則表達(dá)式、文本處理工具詳解_正則表達(dá)式
- 2023-04-20 正則表達(dá)式:判斷是否符合USD格式
- 2022-02-24 forEach直接改變?cè)瓟?shù)組對(duì)象中的某一個(gè)屬性
- 2022-08-21 Mac包管理器Homebrew的安裝方法_其它綜合
- 2022-01-29 寶塔部署Yii框架多個(gè)商城項(xiàng)目,隊(duì)列問(wèn)題“服務(wù)測(cè)試失敗,請(qǐng)檢查服務(wù)是否正常運(yùn)行”
- 2022-12-02 Python?selenium?get_cookies獲取cookie不全的解決方案_python
- 2022-12-25 一文帶你熟悉Go語(yǔ)言中的for循環(huán)_Golang
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支