09-03可迭代對象與迭代器

可迭代對象與迭代器

可迭代對象

1、什麼是可迭代對象

  • 有__iter__方法的叫可迭代對象
  • 可以在for .. in ..語句出現的對象
例:有__iter__方法的叫可迭代對象
    In [10]: r = range(5)

    In [11]: r.__iter__   # 有__iter__方法的都叫可迭代對象

例:可以在for .. in ..語句出現的語句

    In [11]: for x in range(5):   # 可以在for...in...語句出現
        ...:     pass
        ...: 

    因爲for in語句要求一個可迭代對象

2、我們前面學過的可迭代對象

我們學過的7種數據結構和range, dict_keys, dict_values, dict_itemas都是可迭代對象。
7種常用數據結構都是可迭代對象:列表、元組、字符串、bytes、bytearray、字典、集合

迭代器

1、什麼是迭代器

總結:有__next__方法的可迭代對象叫迭代器。

Python3 迭代器與生成器

  • 迭代是Python最強大的功能之一,是訪問集合元素的一種方式。
  • 迭代器是一個可以記住遍歷的位置的對象。
  • 迭代器對象從集合的第一個元素開始訪問,直到所有的元素被訪問完結束。迭代器只能往前不會後退。
  • 迭代器有兩個基本的方法:iter() 和 next()。
  • 字符串,列表或元組對象都可用於創建迭代器:
例:
    In [12]: it = iter(range(5))

    In [13]: it.__next__()   # 迭代器都有next方法
    Out[13]: 0

總結:有__next__方法的可迭代對象叫迭代器。

2、可迭代對象與迭代器關係

  • 可迭代對象可以轉換爲迭代器。(可迭代對象不是迭代器,但可以轉換)
    • iter函數可以把一個可迭代對象轉換爲迭代器。
  • next函數可以從迭代器裏取出下一個元素。

迭代器原理:

迭代器會保存一個指針, 指向可迭代對象的當前元素。
調用next函數的時候, 會返回當前元素, 並且把指針指向下一個元素。
當沒有下一個元素時, 會拋出stopiteration異常。

例:可迭代對象不是迭代器
In [5]: next(range(5))
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-5-77906a45c21a> in <module>()
----> 1 next(range(5))

TypeError: 'range' object is not an iterator

In [14]: next(iter(range(5)))   # 需要使用iter方法轉換爲迭代器才能使用next方法
Out[14]: 0

迭代器會保存一個指針, 指向可迭代對象的當前元素。
調用next函數的時候, 會返回當前元素, 並且把指針指向下一個元素。
當沒有下一個元素時, 會拋出stopiteration異常。

3、迭代器的用法

  • 需要用next方法把值取出來使用
方法1:
In [16]: lst = [['m', 1, 2, 3, 4], ['age', 0, 1, 2, 3]]

In [17]: for x in lst:
    ...:     key = x[0]
    ...:     for v in x[1:]:
    ...:         print()
    ...:

方法2:
In [18]: for x in lst:
    ...:     it = iter(x)
    ...:     key = next(it)
    ...:     for v in it:
    ...:         print()
    ...:

4、for循環的底層實現

  • for in 循環對於可迭代對象:首先調用iter方法轉換爲迭代器, 然後不斷的調用next方法, 直到拋出Stopiteration異常。
In [19]: it = iter(itratable)
    ...: while True:
    ...:     try:
    ...:         next(it)
    ...:     except StopIteration:
    ...:         return

每週總結

內置數據結構:
    七種內置數據結構:
        列表
        元組
        類字符串:操作幾乎相同
            字符串
            bytes
            bytearray
        集合
        字典

        線性結構:特點就是切片操作
            列表
            元組
            類字符串:操作幾乎相同
                字符串
                bytes
                bytearray
        解構與封裝

    成員運算:
        set:O(1)
        dict:
            O(1) with key
            O(n) with value
        其他:
            O(n)

    解析式:
        列表
        生成器解析
        集合解析
        字典解析

    可迭代對象與迭代器:
        可迭代對象:
            具有__iter__方法
        迭代器:
            需是可迭代對象
            具有__next__方法

        可迭代對象可以使用iter轉換爲迭代器。
        迭代器可以使用next方法一個一個調用出來。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章