您的位置:首页 > 编程语言 > Python开发

Python学习:列表生成式和列表生成器

2017-11-30 19:25 288 查看
一、列表生成式

列表生成式:顾名思义就是python中生成列表的表达式。运用列表生成式可以快速的生成列表,代码却很简洁。

示例一:

如要生成 [1, 2, 3, 4, 5, 6, 7, 8, 9] 列表:

lb = [x for x in  range(1,10)]


输出结果:

[1, 2, 3, 4, 5, 6, 7, 8, 9]

示例二:

如要生成[1,4,9,16……]列表:

lb = [x * x for x in  range(1,10)]


输出结果:

[1, 4, 9, 16, 25, 36, 49, 64, 81]

示例三:

加入条件语句:

lb = [ x * x for x in  range(1,10) if x%2==0]


输出结果:

[4, 16, 36, 64]

二、列表生成器

通过列表生成式,可以直接创建一个列表。但是受内存限制,列表容量有限制,而且创建一个100万元素的的列表不仅占用很大的内存空间。如果我们只需要前几个元素,那后面的占用的内存就浪费了。

创建一个生成器(Generator)的方法:

1、最简单的办法:把原来的生成式的[]换成()就创建了一个生成器。

lg=(x for x in range(1,20) if x%2==0)

print(type(lg))

lg是一个generator,不可以直接获取值,需要使用next()函数获取generator的下一个返回值。

print(lg.next())

2、如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通的函数而是一个generator。

def fib(n):
sum = 0
i = 0
while (i < n):
sum = sum + i
i += 1
yield (sum)

for i in fib(10):
print(i)


执行结果和上面的是一样的,不同的地方是包含yield语句的函数会被特地编译成生成器,当函数被调用时,他会返回一个生成器对象,这个对象执行迭代器接口。每当遇到yield关键字时,可以理解为函数的return语句,yield后面的值就是返回值。但是不像一般的函数再return退出,生成器函数在生成值后会自动挂起并暂停他们的执行和状态。他的本地变量将保存状态信息,这些信息在函数恢复时将再度有效,下次yield下面的部分开始执行。

解释:

1、以上函数有关键字yield,所以是一个生成器函数。

2、通过for循环调用生成器,当执行到yield的时候,返回sum的值,sum为0,此时暂停并记录sum值。

3、打印sum的值,然后继续执行,此时跳入下一个循环while(1<10)

4、直到遇到yield的时候,返回sum的值。

5、反复执行3,4步,直到循环结束,程序退出。

三、生成式和生成器的区别

生成式直接返回一个结果列表,生成器则返回的是一个对象,此对象包含了对表达式的结果的计算引用,通过循环可以直接输出。

生成器不会一次性返回所有数据,当用的时候再列出来,更加节约内存的使用率。

生成式:一次性生成所有的数据,保存在内存中,适合小量数据。

生成器:返回一个可迭代的对象,必须通过next函数一一取出。

迭代器:

可迭代对象:可通过循环取出的就是可迭代对象。比如list() 、tuple[]、dict{}

迭代器:必须通过next()调用的,被next调用不断返回下一个值的对象称为迭代器。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: