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

一、列表生成式
列表生成式:顾名思义就是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调用不断返回下一个值的对象称为迭代器。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值