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__方法的可迭代对象叫迭代器。
- 迭代是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方法一个一个调用出来。