day14_生成器表达式和列表推导式

本文探讨了Python中列表推导式与生成器表达式的主要区别,强调了生成器在内存占用上的优势以及其懒惰求值的特性。通过示例展示了各种推导式,包括列表、字典、集合和生成器推导式,并解释了为何无法直接使用小括号进行元组推导的原因。

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

# 生成器表达式
#生成器表达式英语列表推导式唯一的区别就是括号
g = (i for i in range(10))  #这里的generator是生成器
print(g)
for i  in g:
    print(i)
<generator object <genexpr> at 0x000001833D4742C8>
0
1
2
3
4
5
6
7
8
9
# 列表生推导式
ago_lis = ['西红柿%s' %i for i in range(10)]  #生成一个列表,结构是把for前面的部分输出到列表中
print((ago_lis))
ago_lis= []
for i in range(10):
      ago_lis.append('西红柿%s'%i)
print(ago_lis)



print([i*i for i in range(10)])#把for前面的部分输出到列表中
['西红柿0', '西红柿1', '西红柿2', '西红柿3', '西红柿4', '西红柿5', '西红柿6', '西红柿7', '西红柿8', '西红柿9']
['西红柿0', '西红柿1', '西红柿2', '西红柿3', '西红柿4', '西红柿5', '西红柿6', '西红柿7', '西红柿8', '西红柿9']
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

列表推导式和生成器表达式最大的区别就是,括号不一样,返回值不一样,

列表推导式占内存,而生成器表达式几乎不占用内存,但是不直观。

a =['哆啦A梦%s' %i for i in range(10)]
print((a))

['哆啦A梦0', '哆啦A梦1', '哆啦A梦2', '哆啦A梦3', '哆啦A梦4', '哆啦A梦5', '哆啦A梦6', '哆啦A梦7', '哆啦A梦8', '哆啦A梦9']
# 生成器
老母鸡 = ('鸡蛋%s' %i for i in range(10))   #这个例子我没看懂老师是啥意思(滑稽)
print(老母鸡)
forin 老母鸡:
    print()

# 这个例子,其实就是想说明,生成器就像我拿到一只老母鸡而不是一堆蛋,
# 在我需要的时候就让他下蛋就可以了,这样不占用内存
<generator object <genexpr> at 0x000001833D4F4148>
鸡蛋0
鸡蛋1
鸡蛋2
鸡蛋3
鸡蛋4
鸡蛋5
鸡蛋6
鸡蛋7
鸡蛋8
鸡蛋9
#自我练习
num = ('i*i%s' %i for i in range(10))  # 得到生成器,和函数一样,生成器一句话都还没执行,直到我调用
print(num)
for i in num:
    print(i)


<generator object <genexpr> at 0x000001833D4F42C8>
i*i0
i*i1
i*i2
i*i3
i*i4
i*i5
i*i6
i*i7
i*i8
i*i9

各种推导式

[‘每个元素或者是和元素相关的操作%s’ %i for i in 可迭代数据类型]

# 列表推导式公式: ['每个元素或者是和元素相关的操作%s' %i for i in 可迭代数据类型]

# 完整的推导式(其他推导式没有if):[满足条件的元素相关的操作 for 元素 in 可迭代数据类型 if 元素相关条件(注:满足才会触发大括号)] 类似于是一个是一个筛选

#30以内 能被3整除的数
ast = [ i for i in range(31) if i % 3 == 0]  # 完整的列表推导式
print(ast)
[0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30]
#列表推导式
#30以内 能被3整除的数的平方
asf =[i * i for i in range(31) if i % 3 == 0]
print(asf)
[0, 9, 36, 81, 144, 225, 324, 441, 576, 729, 900]
# 生成器表达式
asf =(i * i for i in range(31) if i % 3 == 0)
print(asf)
for i in asf:
    print(i)
<generator object <genexpr> at 0x000001833D42DCC8>
0
9
36
81
144
225
324
441
576
729
900

字典推导式

# 将Key和Value对调
mask = {'a':12,'b':26}
#要完成的任务就是{12;'a',26:'b'}
mask_frequency = {mask[k]:k for k in mask}
print(mask_frequency)
{12: 'a', 26: 'b'}
#合并大小写对应的Value值,将K统一成小写
mask = {'a':12,'b':26,'B':4,'M':93}
#要实现的是{'b':26+ 4,'a':12,'M':93}
mask_frequency ={k.lower():mask.get(k.lower(),0) + mask.get(k.upper(),0) for k in mask}
print(mask_frequency)
{'a': 12, 'b': 30, 'm': 93}

集合推导式

#计算劣币哦中每个数的平方
akl = {x**2 for x in [1,-1,2,3,5]}
print(akl)

#集合推导式,自带结果去重功能
{1, 4, 9, 25}

推导式有很多,但是各种推导式不同很大的在于括号

为什么没有元组推导式呢?因为一旦用了小括号那就变成一个生成器了。

各种推导式:列表的,集合的,生成器的,字典,

#遍历操作
#筛选操作

生成器中的数据只能取一次,取了就没有了

懒惰性,不取值就不会工作


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值