python 推导式和生成器表达式

一、推导式

列表推导式

  • 基本的列表推导式
    [每一个元素或者是和元素相关的操作 for 元素 in 可迭代数据类型]
list1 = [i for i in range(10)]
print(list1)  
# output 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

以上代码相当于

my_list = []
for i in range(10):
    my_list.append(i)
print(my_list)
  • 带运算的列表推导式
my_list = [i*i for i in range(10)]
print(my_list)
# output
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
  • 带条件判断的列表推导式
    [满足条件的元素相关的操作 for 元素 in 可迭代数据类型 if 元素相关的条件]
my_list = [i*i for i in range(10) if i % 2 == 0]
print(my_list)
# output
[0, 4, 16, 36, 64]
  • 列表推导式嵌套
my_list = [x*y for x in range(10) if x % 2 == 0 for y in range(10) if y % 3 == 0]
print(my_list)

# x : 0 2 4 6 8
# y :0 3 6 9
# output
[0, 0, 0, 0, 0, 6, 12, 18, 0, 12, 24, 36, 0, 18, 36, 54, 0, 24, 48, 72]

集合推导式
在列表推导式的基础上,把外层的[ ]换成{ }就变成了一个集合推导式,集合推导式自带去重的功能

my_set = {i * i for i in [-1, 1, 2, -2, 3]}
print(my_set)  # {1, 4, 9}

字典推导式
在集合推导式的基础上,前面的一个数变成两个数,中间加 :,例如 x : y ,其他不变,就变成了一个字典推导式了

my_dict = {i: 'happy' for i in range(5)}
print(my_dict)  # {0: 'happy', 1: 'happy', 2: 'happy', 3: 'happy', 4: 'happy'}

实现字典的键值互换

good_dict = {"computer": 4000, "book": 40, "girlfriend": 1000000}
my_dict = {good_dict[k]: k for k in good_dict}
print(my_dict)  # {4000: 'computer', 40: 'book', 1000000: 'girlfriend'}
二、生成器表达式

变()-----> 元祖推导式??? to young to navive!! ----- > 生成器表达式
在列表推导式的基础上,把外层的[ ]换成( )就变成了一个元祖推导式,,no no no ,就变成了一个生成器表达式

my_generator = (i for i in range(5))  # 返回一个生成器
print("my_generator:%s" % my_generator)
my_generator.__next__()
for i in my_generator:
    print(i, end=" ")

# output
 my_generator:<generator object <genexpr> at 0x00000209FF5BD9A8>
1 2 3 4    

大部分内置函数,也是使用迭代器协议访问对象的。例如, sum函数是Python的内置函数,该函数使用迭代器协议访问对象,而生成器实现了迭代器协议,所以,我们可以直接这样计算一系列值的和:

my_sum = sum(i*i for i in range(5))

因此不用多此一举先构造列表

my_sum = sum([i*i for i in range(5)])

非想要用推导式的方法得到一个元祖??have a try 曲线救国

my_tuple = tuple([i for i in range(10)])
print(my_tuple)  # (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)

问题是使用类型转换,一样会在短时间内耗费比较大的内存。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值