序列是有固定特徵集的可迭代對象。它們能夠從0開始索引,並以序列長度減1的值結束,它們有長度,能夠分割python
序列是一種很常見的可迭代對象。列表,元組和字符串都是序列。函數
可迭代對象是任何能夠用for循環遍歷的東西。可迭代對象能夠被for循環遍歷,任何能夠被for循環遍歷的東西都是可迭代對象。code
Python中的不少東西都是可迭代對象,但並不是全部的可迭代對象都是序列。集合,字典,文件和生成器都是可迭代對象,但這些都不是序列對象
生成器也是迭代器,這意味着你能夠在生成器上調用next函數來獲取它的下一個元素:
生成器是可迭代對象索引
下面的代碼是生成器的使用:字符串
s=(x**2 for x in [1,2,3])# 這裏是(),獲得生成器 print s print next(s) print next(s) print next(s) # print next(s)
輸出結果:get
<generator object <genexpr> at 0x10e1c2aa0> 1 4 9
若去掉上述代碼最後一行的註釋,再打印print next(s)時,則拋出錯誤:generator
<generator object <genexpr> at 0x105981aa0> Traceback (most recent call last): 1 4 9 File "/Users/ycsun/PycharmProjects/ptest/main.py", line 7, in <module> print next(s) StopIteration
以下,則返回一個列表:it
s=[x**2 for x in [1,2,3]] print s
結果:io
[1, 4, 9]
迭代器驅動for循環
若是你想從迭代器請求next元素,但已經沒有更多元素了,就會發生StopIteration異常:
迭代器是可迭代對象,全部迭代器都是它們本身的迭代器。
s=[1,2,3,4,5] l1=iter(s) l2=iter(l1) print l1 print l2
輸出結果:
<listiterator object at 0x10872efd0> <listiterator object at 0x10872efd0>
連接以下:
[](https://mp.weixin.qq.com/s/LP82EybDB6EN9hPauCSdGQ)
tuple()
s=(x**2 for x in [1,2,3])#生成器 print s print tuple(s)# 將生成器傳給構造器,輸出(1,4,9) print sum(s)#0
結果以下:
<generator object <genexpr> at 0x1050fbaa0> (1, 4, 9) 0
解包
``
s={'k1':2,'k2':543}
x,y=s
print x,y
獲得的是鍵,
k2 k1
## for 循環 > python 沒有傳統意義的帶索引的for循環,而是底層用的生成器 + Python的for循環不使用索引 + 迭代器驅動for循環 + 因此咱們已經看到Python的for循環在底層不使用索引。Python的for循環使用迭代器。 + 迭代器驅動可迭代對象。你能夠從任何可迭代對象中得到一個迭代器。你可使用迭代器手動循環遍歷可迭代對象。 > 咱們來看看它是如何工做的。 + 咱們可使用Python的內置iter函數向每一個可迭代對象要一個迭代器。將一個可迭代對象傳遞給iter函數就返回一個迭代器,不管咱們操做什麼類型的可迭代對象。 下面是三個可迭代對象:
s={1,2,3,4,5}
m=(4,5,6)
n='hello,world'
print iter(s)
print iter(m)
print iter(n)
輸出結果:
<setiterator object at 0x10d36ba50>
<tupleiterator object at 0x10d3f6fd0>
<iterator object at 0x10d3f6fd0>
```
這些語句反過來也是正確的::
任何能夠傳遞給iter函數且返回自身的東西都是迭代器
這就是Python中的迭代器協議。