迭代器和生成器
可迭代对象
具有__iter__
方法的对象,就是可迭代对象。
可迭代对象返回的值是一个具有__next__
方法的对象叫迭代器对象
In [2]: a = [1,2]
In [3]: it = a.__iter__()
In [4]: it
Out[4]:
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]:
In [7]: for i in it:
...: print(i)
...:
2
In [8]: it2 = it.__iter__()
In [9]: it2
Out[9]:
三元表达式
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]: 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]:
In [29]: z.__iter__()
Out[29]:
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]:
In [34]: a.__iter__()
Out[34]:
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