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.0001358985900880X02 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如果这篇文章对你有帮助,可以请我喝杯咖啡 ☕
评论