python二十二:迭代,三元表达式,列表解析
? 迭代器協議:對象必須提供一個next方法,執行該方法要么返回迭代中的下一項,要么就引起一個StopIteration異常,以終止迭代(只能往后走,不能往前退)
? 可迭代對象:實現了迭代器協議的對象(如何實現:對象內部定義一個_iter_()方法)
? 協議是一種約定,可迭代對象實現了迭代器協議,python的內部工具(如for循環,sum,min,max函數等)使用迭代器協議訪問對象
? python中強大的for循環機制
? ? ? ? ? ? ?for循環本質:循環所有對象,全都是使用迭代器協議.
lt = ['l', 'i', 'u'] # 下標訪問方式 lt[0] lt[1] lt[2] # lt[3] # 超出邊界報錯# 遵循迭代器協議訪問方式 iter_test = lt.__iter__() iter_test.__next__() iter_test.__next__() iter_test.__next__() # iter_test.__next__()# 超出邊界報錯# for 循環訪問方式 # for 循環的本質就是遵循迭代器協議的方式,先調用iter_test = lt.__iter__() # 再調用iter_test.__next__(),直到for循環捕捉到StopIteration終止循環 # for 循環所有對象的本質都是一樣的道理 for i in lt:print(i)# while模仿for循環 iter_test = lt.__iter__() while True:try:print(iter_test.__next__())except StopIteration:print("迭代完畢,循環終止了...")break生成器初步探索
? 生成器:可以理解為一種數據類型,這種數據類型自動實現了迭代器協議(其他的數據類型需要調用自己內置的__iter__()方法).所以生成器就是可迭代對象.
? 生成器分類及在python中的表現形式:1.生成器函數:常規函數定義,但是使用yield而不是return返回結果.yield一次返回一個結果,在每個結果中間,掛起函數的狀態,以便下次重它離開的地方繼續執行.
? ? ? ?2. 生成器表達式:類似于列表推導,但是生成器返回按需產生結果的一個對象,而不是一次構建一個結果列表.
? ? ? python使用生長器對延遲操作提供了支持.所謂延遲操作,是指在需要的時候產生結果,而不是立刻產生結果.這也是生成器的主要好處.
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.來自函數(生成器函數,可以保存函數的運行狀態)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. 語法上和函數類似. 只是生成器函數使用yield返回一個值
? ?2. 自動實現迭代器協議,可以直接__next__()
? ?3. 狀態掛起:生成器使用yield語句返回一個值.
?生成器優點: 1.延遲計算,一次返回一個結果.并不會一次產生全部結果,這樣不僅節省內存,而且這種機制非常適合處理大數據.
三國人物.txt文件內容{"name":"劉備", "age":"25"}{"name":"關羽", "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)?
總結
以上是生活随笔為你收集整理的python二十二:迭代,三元表达式,列表解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python二十一:文件操作
- 下一篇: linux 安装centos