# python基础列表生成式，迭代器

`1 >>> L = [x * x for x in range(10)]`
```2 >>> L
3 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
4 >>> g = (x * x for x in range(10))
5 >>> g
6 <generator object <genexpr> at 0x1022ef630>```

```>>> g = (x * x for x in range(10))
>>> for n in g:
...     print(n)
...
0
1
4
9
16
25
36
49
64
81```

generator非常强大。如果推算的算法比较复杂，用类似列表生成式的`for`循环无法实现的时候，还可以用函数来实现。

1, 1, 2, 3, 5, 8, 13, 21, 34, ...

``` 1 def fib(max):
2     n, a, b = 0, 0, 1
3     while n < max:
4         print(b)
5         a, b = b, a + b
6         n = n + 1
7     return ‘done‘
8 >>> fib(10)
9 1
10 1
11 2
12 3
13 5
14 8
15 13
16 21
17 34
18 55
19 done```

``` 1 >>> g = fib(6)
2 >>> while True:
3 ...     try:
4 ...         x = next(g)
5 ...         print(‘g:‘, x)
6 ...     except StopIteration as e:
7 ...         print(‘Generator return value:‘, e.value)
8 ...         break
9 ...
10 g: 1
11 g: 1
12 g: 2
13 g: 3
14 g: 5
15 g: 8
16 Generator return value: done```

``` 1 #_*_coding:utf-8_*_
2 __author__ = ‘Alex Li‘
3
4 import time
5 def consumer(name):
6     print("%s 准备吃包子啦!" %name)
7     while True:
8        baozi = yield
9
10        print("包子[%s]来了,被[%s]吃了!" %(baozi,name))
11
12
13 def producer(name):
14     c = consumer(‘A‘)
15     c2 = consumer(‘B‘)
16     c.__next__()
17     c2.__next__()
18     print("老子开始准备做包子啦!")
19     for i in range(10):
20         time.sleep(1)
21         print("做了2个包子!")
22         c.send(i)
23         c2.send(i)
24
25 producer("alex")```

1.直接作用于for循环的数据类型有以下几种：一是集合数据类型，如`list``tuple``dict``set``str`等；二是是`generator`，包括生成器和带`yield`的generator function。

2.Iterable可迭代对象：可以直接作用于for循环的对象。`isinstance()`判断一个对象是否是`Iterable`对象

``` 1 >>> from collections import Iterable
2 >>> isinstance([], Iterable)
3 True
4 >>> isinstance({}, Iterable)
5 True
6 >>> isinstance(‘abc‘, Iterable)
7 True
8 >>> isinstance((x for x in range(10)), Iterable)
9 True
10 >>> isinstance(100, Iterable)
11 False```

3.迭代器`Iterator`*可以被`next()`函数调用并不断返回下一个值的对象称为迭代器。可以使用`isinstance()`判断一个对象是否是`Iterator`对象。

```1 >>> isinstance(iter([]), Iterator)
2 True
3 >>> isinstance(iter(‘abc‘), Iterator)
4 True```

Python的`for`循环本质上就是通过不断调用`next()`函数实现的，例如：

```for x in [1, 2, 3, 4, 5]:
pass

#等价于

# 首先获得Iterator对象:
it = iter([1, 2, 3, 4, 5])
# 循环:
while True:
try:
# 获得下一个值:
x = next(it)
except StopIteration:
# 遇到StopIteration就退出循环
break```

python基础列表生成式，迭代器

(0)
(0)

0条