python3.7 迭代器和生成器

蒙古草原狼發表於2018-09-03
#!/usr/bin/env python
__author__ = "lrtao2010"

#python3.7 迭代器和生成器

#迭代器協議:
```
1、迭代器協議是指:物件必須提供一個next方法,執行該方法要麼返回迭代中的下一項,
要麼就引起一個StopIteration異常,已終止迭代,只能往後走,不能往前退.
2、可迭代物件:實現了迭代器協議的物件(物件內部定義一個__iter__()方法),節省記憶體
3、協議是一種約定,可迭代物件實現了迭代器協議,Python的內部工具(如for、sum、min、max等)
使用迭代器協議訪問物件。
```

#for 迴圈的強大功能
```
字串,列表,元祖,字典,集合。這些都不是可迭代物件(沒有next方法),在for 迴圈中,呼叫了他們的內部
__iter__方法,把他們變成了可迭代物件。
for迴圈呼叫可迭代物件的__next__方法去取值,並且for 迴圈可以捕捉StopIteration異常,終止迭代。

```
# l_test=[1,2,3]
# iter_l_test=l_test.__iter__()
# print(iter_l_test.__next__())
# print(iter_l_test.__next__())
# print(iter_l_test.__next__())
# print(iter_l_test.__next__())
# # 1
# # 2
# # 3
# # Traceback (most recent call last):
# #   File "D:/python3/app/Module_and_Functions/iterator_and_generator.py", line 28, in <module>
# #     print(iter_l_test.__next__())
# # StopIteration

#用whilex迴圈模擬for迴圈
# l_test=[1,2,3]
# iter_l_test=l_test.__iter__()
# while True:
#     try:
#         #print(iter_l_test.__next__())
#         print(next(iter_l_test))
#     except StopIteration:
#         #print(`end`)
#         break

#生成器
```
生成器也是一種資料型別,這種資料型別自動實現了“迭代器協議”,生成器是可迭代物件。

生成器分類:
1、生成器函式:常規函式定義,但是使用yield語句而不是return 語句返回結果,yield語句
一次返回一個結果,可以使用多次,在每個結果中間,掛起函式的狀態,以便下次從它離開的地方
繼續執行。

2、生成器表示式:類似列表推導式,生成器返回按需產生結果的一個物件,而不是一次構建
一個完整的結果列表

生成器優點:
在需要的時候才產生結果,不是立即產生結果
```

#生成器函式
# def g_test():
#     yield 1
#     yield 2
#     yield 3
# g_test1=g_test()
# print(g_test1)
# print(g_test1.__next__())
# print(g_test1.__next__())
# print(g_test1.__next__())
# # <generator object g_test at 0x0000000002163570>
# # 1
# # 2
# # 3

#生成器表示式,大資料不會佔用大記憶體
# l_g = (`%s` %i for i in range(10) if i%2 == 0)
# print(l_g)
# print(l_g.__next__())
# print(l_g.__next__())
#print(next(l_g))
# print(l_g.__next__())
# <generator object <genexpr> at 0x0000000002133570>
# 0
# 2
# 4
# 6


#三元表示式
# name = `test`
# res=`True` if name == `test` else `False`
# print(res)
# True

#列表解析,大資料佔用記憶體比較大
# l_test1=[`%s` %i for i in range(10)]
# l_test2=[`%s` %i for i in range(10) if i%2 == 0]
# print(l_test1)
# print(l_test2)
# [`0`, `1`, `2`, `3`, `4`, `5`, `6`, `7`, `8`, `9`]
# [`0`, `2`, `4`, `6`, `8`]

#生成器總結
```
1、節省記憶體
2、提高程式碼可讀性
3、只能遍歷一次,只能遍歷一次,只能遍歷一次
```

 

相關文章