python高级特性:迭代器与生成器
生活随笔
收集整理的這篇文章主要介紹了
python高级特性:迭代器与生成器
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
前言
有一個列表
l = ['a','b','c','d','e'] 我想取列表中的內容,有幾種方式?# 1.最簡單的方法用for循環。 for i in l:print(i,end=" ") # 2.用列表內置的方法。 while 1:if l:print(l.pop(),end=" ")
這是用常見的方式取出列表中的數據。
而我們如果遍歷數字的話:
for i in 1234:print(i)# 則會報不可迭代的錯誤。
迭代和可迭代協議
因此,我們知道一種如果能以一種重復執行程序的方式取出數據,那么我們稱它為可迭代的。
?
常見的可迭代數據類型有哪些?
list、dict、set、tuple、字符串等。說白了就是我們常用循環取數據的那些數據類型。那么我們如何判斷一個數據類型是否可迭代呢? from collections import Iterable print(isinstance(l,Iterable)) # 返回True
可迭代協議
所謂協議,就是規則嘛。可迭代協議,說白了就說明可迭代是有一套設計好的規則的。如果我們自己寫了一個數據類型,希望它是可迭代的,那么我們必須遵守這規則。
可迭代協議就是內部實現了__iter__方法
我們可以用反射來判斷:
if hasattr(l,"iter"):print(True)由此以及我們所學所見可知,想要可迭代,內部有一個__iter__方法,那么__iter__方法搞了什么事情?
print(l.__iter__())<list_iterator object at 0x03BA43B0>
# 列表_迭代器對象
那么問題來了,什么叫迭代器?可迭代的對象就一定是迭代器嗎?
dir(l.__iter__())是列表迭代器實現的所有方法,那么dir(l)是列表實現的所有方法,此時我們可以用set作差,來看看iter()方法多了什么?
print(set(dir(l.__iter__()))-set(dir(l))) {'__length_hint__', '__next__', '__setstate__'} # 看來是這三個方法從中作祟。 iter_l = l.__iter__()print(iter_l.__length_hint__()) # 迭代器的長度
print('*',iter_l.__setstate__(3)) # 根據索引值指定從哪里開始迭代
print('**',iter_l.__next__()) # 一個一個的取值
print('***',iter_l.__next__())
由此可見,
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?轉載于:https://www.cnblogs.com/pbwzc/p/11123412.html
總結
以上是生活随笔為你收集整理的python高级特性:迭代器与生成器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 动态规划(0-1背包)--- 改变一组数
- 下一篇: python之pyqt5-第一个pyqt