可迭代對象與迭代器
可迭代對象
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__方法的可迭代對象叫迭代器。
- 迭代是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方法一個一個調用出來。