Python迭代器與生成器

迭代器

  迭代器協議是指:對象必須提供一個next方法,執行該方法要麼返回迭代中的下一項,要麼就引發一個Stoplteration異常,以終止迭代(只能日後走不能往前退)javascript

  實現了迭代器協議的對象(對象內部定義了一個__iter__()方法)java

  python中的內部工具(如for循環,sum,min,max函數等)基於迭代器協議訪問對象。python

 1 #基於迭代器協議
 2 li = [1,2,3]
 3 diedai_l = li.__iter__()
 4 print(diedai_l.__next__())
 5 print(diedai_l.__next__())
 6 print(diedai_l.__next__())
 7 # print(diedai_l.__next__())  # 超出邊界報錯
 8 
 9 #下標
10 print(li[0])
11 print(li[1])
12 print(li[2])
13 # print(li[3]) # 超出邊境報錯
14 
15 # 用while循環模擬for循環機制
16 diedai_l = li.__iter__()
17 while True:
18     try:
19         print(diedai_l.__next__())
20     except StopIteration:
21         print("迭代完畢,循環終止")
22         break
23 
24 # for循環訪問方式
25 # for循環本質就是遵循迭代器協議的訪問方式,先調用diedai_l=li.__iter__方法
26 # 或者直接diedai_l=iter(l),而後依次執行diedai_l.__next__(),直到捕捉到
27 # StopItearation終止循環
28 # for循環全部的對象的本質都是同樣的原理
迭代器協議的原理方法

生成器

  能夠理解爲一種數據類型,自動實現迭代器協議ide

  在調用生成器運行的過程當中,每次遇到yield時函數會暫停並保存當前全部的運行信息,返回yield的值。並在下一次執行next()方法時從當前位置繼續運行函數

  表現形式工具

    一、生成器函數  帶yield的函數(一、返回值 二、保留函數的運行狀態)    post

      next(t)  t.__next__  t.send(能夠給上一層的yield傳值)this

複製代碼
# 用生成器函數
# yield 至關於return控制的是函數的返回值
# x=yield的另一個特性,接收send傳過來的值,賦值給x
def test():
    print("開始啦")
    first = yield # return 1   first = None
    print("第一次",first)
    yield 2
    print("第二次")
t = test()
print(test().__next__())
res = t.__next__() # next(t)
print(res)
res = t.send("函數停留在first那個位置,我就是給first賦值的")
print(res)

輸出結果
開始啦
None
開始啦
None
第一次 函數停留在first那個位置,我就是給first賦值的
2
複製代碼

    二、生成器表達式  spa

print(sum(i for i in range(10000)))       # 表達式通常用for循環 (i for i in range(10000))
 
  
# 做用 節省內存,在內部已經實現了__iter__的方法

列表解析(生成了一個列表)

1 print([i for i in range(10)])  # 生成一個列表

三元表達式(沒有四元表達式,能夠有二元)

?
1
2
3
4
5
6
7
name = "alex"
print ( "sb" if name = = "alex" else "帥哥" )
 
# if name == "alex"爲一元 "sb" 爲二元 else "帥哥"爲三元
 
輸出
sb
相關文章
相關標籤/搜索