迭代器

生成器,迭代器,可迭代對象,序列

1. 序列

  • 序列是有固定特徵集的可迭代對象。它們能夠從0開始索引,並以序列長度減1的值結束,它們有長度,能夠分割python

    序列是一種很常見的可迭代對象。列表,元組和字符串都是序列。函數

2. 可迭代對象

可迭代對象是任何能夠用for循環遍歷的東西。可迭代對象能夠被for循環遍歷,任何能夠被for循環遍歷的東西都是可迭代對象。code

Python中的不少東西都是可迭代對象,但並不是全部的可迭代對象都是序列。集合,字典,文件和生成器都是可迭代對象,但這些都不是序列對象

3. 生成器

生成器也是迭代器,這意味着你能夠在生成器上調用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]

4. 迭代器

迭代器驅動for循環

  • 迭代器驅動可迭代對象。你能夠從任何可迭代對象中得到一個迭代器。你可使用迭代器手動循環遍歷可迭代對象。
  • 咱們可使用Python的內置iter函數向每一個可迭代對象要一個迭代器。將一個可迭代對象傳遞給iter函數就返回一個迭代器,不管咱們操做什麼類型的可迭代對象。
  • 一旦咱們有了迭代器,咱們就能夠用內置的next函數來獲取它的下一個元素。
  • 迭代器是有狀態的,這意味着一旦你使用了一個元素,它就消失了。
  • 若是你想從迭代器請求next元素,但已經沒有更多元素了,就會發生StopIteration異常:

  • 因此你能夠從每一個可迭代對象中得到一個迭代器。迭代器惟一能作的事情就是使用next函數獲取它的下一個元素。若是使用next函數可是沒有下一個元素,則會拋出StopIteration異常。
  • 由於迭代器也是可迭代對象,因此你可使用內置的iter函數從迭代器中獲取迭代器:
  • 當在可迭代對象上調用iter函數時,會返回迭代器。
  • 迭代器是可迭代對象,全部迭代器都是它們本身的迭代器。

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
  • 第二次使用生成器,sum(s)爲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>
```

  • 一旦咱們有了迭代器,咱們就能夠用內置的next函數來獲取它的下一個元素。

迭代器協議

  • Python中全部形式的迭代都是由迭代器協議驅動的。
  • 可迭代對象能夠被傳遞給iter函數以獲取它們的迭代器。
    迭代器:
  • 能夠傳遞給next函數,返回下一個元素,若是沒有更多元素,拋出StopIteration異常
  • 能夠傳遞給iter函數並返回自身

這些語句反過來也是正確的::

  • 任何能夠在不引起TypeError異常的狀況下傳遞給iter函數的東西都是可迭代對象
  • 任何能夠在不引起TypeError異常的狀況下傳遞給next函數的東西都是一個迭代器
  • 任何能夠傳遞給iter函數且返回自身的東西都是迭代器

這就是Python中的迭代器協議。

相關文章
相關標籤/搜索