迭代器和生成器
可迭代对象
具有__iter__
方法的对象,就是可迭代对象。
可迭代对象返回的值是一个具有__next__
方法的对象叫迭代器对象
In [2]: a = [1,2] In [3]: it = a.__iter__() In [4]: it Out[4]: <list_iterator at 0x1e69be013c8> In [5]: it.__next__() Out[5]: 1
可迭代对象有:str, list, tuple, dict, set, file
迭代器对象返回的还是迭代器对象,具有`__next__`方法 In [5]: it.__next__() Out[5]: 1 In [6]: it Out[6]: <list_iterator at 0x1e69be013c8> In [7]: for i in it: ...: print(i) ...: 2 In [8]: it2 = it.__iter__() In [9]: it2 Out[9]: <list_iterator at 0x1e69be013c8>
三元表达式
In [11]: print(1) if 1<2 else print(2) 1
列表推导式
In [15]: b = (i for i in range(8)) In [16]: b Out[16]: <generator object <genexpr> at 0x000001E69BE82CA8> In [20]: lst = list(b) In [21]: lst Out[21]: [0, 1, 2, 3, 4, 5, 6, 7]
字典生成式
In [23]: keys = ["a", "b", "c"] In [24]: values = (1,2,3) In [25]: d = dict(zip(keys, values)) In [26]: d Out[26]: {'a': 1, 'b': 2, 'c': 3} In [27]: z = zip(keys, values) In [28]: z Out[28]: <zip at 0x1e69bd30d88> In [29]: z.__iter__() Out[29]: <zip at 0x1e69bd30d88> In [30]: z.__next__() Out[30]: ('a', 1)
生成器
yield关键字
在函数中出现yield关键字,函数就会暂停执行,并返回一个值
In [31]: def func(): ...: yield 1 ...: yield 2 ...: In [32]: a = func() In [33]: a Out[33]: <generator object func at 0x000001E69BE82200> In [34]: a.__iter__() Out[34]: <generator object func at 0x000001E69BE82200> In [35]: a.__next__() Out[35]: 1
生成器是一种特殊的迭代器,生成器自动实现了“迭代器协议”(即__iter__和next方法),不需要再手动实现两方法
递归
一种特殊的嵌套调用,是指在调用一个函数的过程中,又直接或间接的调用了自身。
递归满足的特点:
- 问题规模会随着递归减小
- 递归函数要有出口
In [36]: lis = [1, [2, [3, [4, [5, [6, ]]]]]] ...: ...: ...: def tell(lis): ...: for i in lis: ...: if type(i) is list: ...: tell(i) ...: else: ...: print(i) ...: In [37]: tell(lis) 1 2 3 4 5 6