python二十二:迭代,三元表达式,列表解析
? 迭代器協(xié)議:對象必須提供一個next方法,執(zhí)行該方法要么返回迭代中的下一項,要么就引起一個StopIteration異常,以終止迭代(只能往后走,不能往前退)
? 可迭代對象:實現(xiàn)了迭代器協(xié)議的對象(如何實現(xiàn):對象內(nèi)部定義一個_iter_()方法)
? 協(xié)議是一種約定,可迭代對象實現(xiàn)了迭代器協(xié)議,python的內(nèi)部工具(如for循環(huán),sum,min,max函數(shù)等)使用迭代器協(xié)議訪問對象
? python中強大的for循環(huán)機制
? ? ? ? ? ? ?for循環(huán)本質(zhì):循環(huán)所有對象,全都是使用迭代器協(xié)議.
lt = ['l', 'i', 'u'] # 下標訪問方式 lt[0] lt[1] lt[2] # lt[3] # 超出邊界報錯# 遵循迭代器協(xié)議訪問方式 iter_test = lt.__iter__() iter_test.__next__() iter_test.__next__() iter_test.__next__() # iter_test.__next__()# 超出邊界報錯# for 循環(huán)訪問方式 # for 循環(huán)的本質(zhì)就是遵循迭代器協(xié)議的方式,先調(diào)用iter_test = lt.__iter__() # 再調(diào)用iter_test.__next__(),直到for循環(huán)捕捉到StopIteration終止循環(huán) # for 循環(huán)所有對象的本質(zhì)都是一樣的道理 for i in lt:print(i)# while模仿for循環(huán) iter_test = lt.__iter__() while True:try:print(iter_test.__next__())except StopIteration:print("迭代完畢,循環(huán)終止了...")break生成器初步探索
? 生成器:可以理解為一種數(shù)據(jù)類型,這種數(shù)據(jù)類型自動實現(xiàn)了迭代器協(xié)議(其他的數(shù)據(jù)類型需要調(diào)用自己內(nèi)置的__iter__()方法).所以生成器就是可迭代對象.
? 生成器分類及在python中的表現(xiàn)形式:1.生成器函數(shù):常規(guī)函數(shù)定義,但是使用yield而不是return返回結(jié)果.yield一次返回一個結(jié)果,在每個結(jié)果中間,掛起函數(shù)的狀態(tài),以便下次重它離開的地方繼續(xù)執(zhí)行.
? ? ? ?2. 生成器表達式:類似于列表推導(dǎo),但是生成器返回按需產(chǎn)生結(jié)果的一個對象,而不是一次構(gòu)建一個結(jié)果列表.
? ? ? python使用生長器對延遲操作提供了支持.所謂延遲操作,是指在需要的時候產(chǎn)生結(jié)果,而不是立刻產(chǎn)生結(jié)果.這也是生成器的主要好處.
name="劉備" # 三元表達式 res = "厲害了" if name=="劉備" else "不行"列表解析:語法:[expression for iter_val in iterable][expression for iter_val in iterable if cond_expr]lt = [i+2 for i in range(10) ]lt = [i+2 for i in range(10) if i>6]生成器:1.來自函數(shù)(生成器函數(shù),可以保存函數(shù)的運行狀態(tài))def gene():yield 6yield 7yield 8v = gene()print(v.__next__())# 可以在之間加上代碼代碼print(v.__next__())2. 來自列表解析 v = (i for i in range(10)) print(v.__next__()) # 生成器本身就有 __next__()生成器特性:
? ?1. 語法上和函數(shù)類似. 只是生成器函數(shù)使用yield返回一個值
? ?2. 自動實現(xiàn)迭代器協(xié)議,可以直接__next__()
? ?3. 狀態(tài)掛起:生成器使用yield語句返回一個值.
?生成器優(yōu)點: 1.延遲計算,一次返回一個結(jié)果.并不會一次產(chǎn)生全部結(jié)果,這樣不僅節(jié)省內(nèi)存,而且這種機制非常適合處理大數(shù)據(jù).
三國人物.txt文件內(nèi)容{"name":"劉備", "age":"25"}{"name":"關(guān)羽", "age":"24"}{"name":"張飛", "age":"23"}{"name":"曹操", "age":"24"}{"name":"郭嘉", "age":"23"}{"name":"曹丕", "age":"5"}def getPeople():with open("三國人物", "r", encoding="utf-8") as f:for i in f:yield igene = getPeople() # for g in gene: # print(eval(g)["age"]) # 使用三元表達式求和 res = sum(int(eval(g)["age"]) for g in gene) print(res)?
總結(jié)
以上是生活随笔為你收集整理的python二十二:迭代,三元表达式,列表解析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python二十一:文件操作
- 下一篇: linux 安装centos