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