<python全栈开发基础>学习过程笔记【17d】生成器

本文介绍 Python 中的列表生成式及其与生成器的区别。通过实例讲解了列表生成式的简洁语法,并探讨了生成器如何节省内存空间。此外还介绍了生成器的两种创建方式及可迭代对象的概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.列表生成式

1
2
>>> [i**2 for in range(10)]
[0149162536496481]

这个过程是从range(10)列表中依次取元素,计算元素的平方,再放到另一个列表中

 

2.可以把【1】中的代码写成这种形式

>>> def f(x):
    return x**2

>>> [f(i) for i in range(10)]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

 

3.元组(列表)内元素个数为n,用元组(列表)给n个变量赋值

复制代码
>>> a=(1,2,3)
>>> x,y,z=a
>>> x
1
>>> y
2
>>> z
3
复制代码
复制代码
>>> b=[1,2,3]
>>> x1,y1,z1=b
>>> x1
1
>>> y1
2
>>> z1
3
复制代码

 

4.生成器有两种创建方式

方法一:

1
2
>>> ( i**2 for in range(10))
<generator object <genexpr> at 0x03B21480>

 generator就是生成器

    这里我们生成了一个生成器对象,为什么我们要生成这样一个对象,而不是列表?因为列表是把值存在列表中...当数据很多时,非常消耗内存。

    生成器对象中什么都没存...但它什么都能搞到。用生成器省了空间。

 

生成器中的值只能一个一个的取

复制代码
>>> g=( i**2 for i in range(10))
>>> next(g)   
0
>>> next(g)
1
>>> next(g)
4
>>> next(g)
9
>>> next(g)
16
>>> next(g)
25
>>> next(g)
36
>>> next(g)
49
>>> next(g)
64
>>> next(g)
81
>>> next(g)    #越界
Traceback (most recent call last):
  File "<pyshell#34>", line 1, in <module>
    next(g)
StopIteration
复制代码

生成器是一个可迭代对象,所以上面的代码可以简写为:

复制代码
>>> s=(i**2 for i in range(10))
>>> for i in s:   #内部:for in循环自动调用next,得到一个值,用i取这个值,使用之后,这个值被垃圾回收机制删除...所以很节省空间
    print(i)

    
0
1
4
9
16
25
36
49
64
81
复制代码

 

 

方法二:

使用关键字yield

生成器的本质是一个带yield关键字的函数

复制代码
>>> def a():
    print("ok1")
    yield 1   #yield返回一个值
    print("ok2")
    yield 2

    
>>> next(a())    #a()就是一个生成器,每一次next()都会运行到返回一个值为止
ok1
1
>>> next(a())
ok1
1
复制代码

当然还有下面的写法:

复制代码
>>> for i in a():   #i每次存一个yield返回的值
    print(i)

    
ok1
1
ok2
2
复制代码

 

 

5..什么是可迭代对象?可迭代对象可以使用for in

内部有iter方法的对象就是可迭代对象

可迭代对象有:列表,元组,字符串,字典,生成器对象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值