Shawn's Blog
目录 · 3 节

Python 中的迭代、生成和 yield 关键字

0X00 可迭代对象

Python中的列表,元组,字典,文件都是可迭代对。可迭代对象简单地说就是可以用for i in xxx:来遍历的对象。

python
1my_list = [1, 2, 3, 4, 5, 6, 7]
2for i in my_llist:
3    print i
4
5my_dict = {
6    'a': u'苟利国家生死以',
7    'b': u'岂因祸福避趋之'
8}
9for i in my_dict:
10    print i

不过如果数据量非常非常庞大的时候,会很影响程序的性能。这种时候就可以使用生成器来解决这个问题。

0X01 生成器

生成器的用法和普通的可迭代对象差不多,最大的特点就是:“用的时候才去计算”。这里写一个简单的例子,演示一下情况。第一种生成超大列表的方式要逐项计算完才算弄出来了这个10000长的列表,而后者是生成器,只是声明了怎么算,并没有真的去算,所以在速度上才是完全不能比的。

python
1#!/usr/bin/env python
2# coding=utf-8
3
4import time
5
6if __name__ == '__main__':
7    start = time.time()
8    [x**x for x in range(10000)]    # 这里生成的是一个超大的列表
9    end = time.time()
10    print end - start
11
12    start = time.time()
13    (x**x for x in range(10000))    # 这里生成一个超大的生成器(注意看,括号不一样)
14    end = time.time()
15    print end - start

运行结果如下:

1shawn in ~ λ python hello.py
26.76475715637
30.000135898590088

0X02 yield关键字

那是时候自己生成弄一个生成器出来了,Python中提供的yield关键字就是用来干这个的,通过这个关键字可以创造自己的生成器。 还是上面同样的例子,稍加改动

python
1#!/usr/bin/env python
2# coding=utf-8
3
4import time
5
6def create_list():
7    # 创建一个普通的列表
8    my_list = []
9    for x in range(10000):
10        my_list.append(x**x)
11    return my_list
12
13def test_yield():
14    # 使用yield
15    for x in range(10000):
16        yield x**x
17
18if __name__ == '__main__':
19    start = time.time()
20    a = create_list()
21    end = time.time()
22    print end - start
23
24    start = time.time()
25    a = test_yield()
26    end = time.time()
27    print end - start

运行起来看到的时间差距和刚刚演示的也差不多

1shawn in ~ λ python hello.py
26.45007514954
30.0080668926239
本文标题
Python 中的迭代、生成和 yield 关键字
文章作者
Shawn
版权声明
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。

如果这篇文章对你有帮助,可以请我喝杯咖啡 ☕

评论