Python学习-列表生成式
来源:互联网 发布:2015家电市场销售数据 编辑:程序博客网 时间:2024/05/16 11:10
#coding=UTF-8import os #要生成list [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]可以用list(range(1, 11)):L=list (range(1,11))print L#要生成[1x1, 2x2, 3x3, ..., 10x10]L2=[x*x for x in range(1, 11)]print L2#还可以使用两层循环,可以生成全排列:L3=[m + n for m in 'ABC' for n in 'XYZ']print L3# os.listdir可以列出文件和目录L4=[d for d in os.listdir('.')] print L4#把一个list中所有的字符串变成小写:L5 = ['Hello', 'World', 'IBM', 'Apple']L6=[s.lower() for s in L5]print L6
通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。
所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。
L7=[x*x for x in range(1,10)]print L7L8_generator=(x*x for x in range(1,10))print L8_generator.next()
函数是顺序执行,遇到return语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。
举个简单的例子,定义一个generator,依次返回数字1,3,5:
def odd(): print('step 1') yield 1 print('step 2') yield(3) print('step 3') yield(5)
调用该generator时,首先要生成一个generator对象,然后用next()函数不断获得下一个返回值:
>>> o = odd()>>> next(o)step 11>>> next(o)step 23>>> next(o)step 35>>> next(o)Traceback (most recent call last): File "<stdin>", line 1, in <module>StopIteration
阅读全文