迭代器,生成器和递归

迭代器和生成器

可迭代对象

具有__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

你可能感兴趣的:(迭代器,生成器和递归)