Python3-22/456- 013Python推导式与生成器表达式

一、概念

        Python中的推导式(comprehensions),又称为解析式,是一种独特的数据处理方式!可以从一个数据序列构建另一个新的数据序列的结构体具有使用方便,且让代码看起来更高级!

        Python中支持各种数据结构的推导式:

  • 列表(list)推导式
  • 字典(dict)推导式
  • 集合(set)推导式
  • 元组(tuple)推导式,本身不支持,tuple()函数得以实现

二、列表推导式

  • 语法
    • 变量名 = [表达式 for 变量 in 列表 for 变量 in xxx]
    • 变量名 = [表达式 for 变量 in 列表 if 条件]
  • 语义
    • 遍历出列表中的内容给变量,表达式根据变量值进行逻辑运算,或者遍历列表中的内容给变量,然后给if条件进行判断,符合的值再给表达式。
  • 练习

  1. 快速创建一个包含1-10的元素列表

list1 = [i for i in range(1,11)]
print(list1)

  2. 快速创建一个包含1-10的元素列表

list2 = [i for i in range(1,11) if i % 2 == 0]
print(list2)

  3. 现在有一个列表lst =[[1,2,3],[4,5,6],[7,8,9]],思考取出1/4/7和1/5/9元素

# 现有列表lst = [[1,2,3],[4,5,6],[7,8,9]] ,求出1/4/7和1/5/9元素,思考如何取出?
lst = [[1,2,3],[4,5,6],[7,8,9]]

lst1 = [lst[i][0] for i in range(len(lst))]
print(lst1)

lst2 = [lst[i][i] for i in range(len(lst))]
print(lst2)

  4. 过滤掉长度小于或等于3的字符串列表,并将剩下的转换成大写字母

names = ['Bob','Tom','alice','Jerry','Wendy','Smith']
new_names =[name.upper() for name in names if len(name)>3]
print(new_names)

#结果
['ALICE', 'JERRY', 'WENDY', 'SMITH']

  5. 计算30以内可以被3整除的数字(一个for循环)

multiples = [i for i in range(20) if i % 5 ==0]
print(multiples)

#执行结果
[0, 5, 10, 15]

  6. 多个for循环

lst1 = [1,2,3,4,5]

lst = [x * y for x in lst1 for y in range(3)]
print(lst)

  7. 多个for,以及多个if

# 多个for,多个if
lst1 = [1,2,3,4,5]
lst2 = [x * y for x in lst1 for y in range(3)  if x>2 if y>1]
print(lst2)

三、字典推导式

  语法: {k : v for 循环 if 条件}

#字典推导式
dict1 = {"k1":1,'k2':2}
dict2 = {key:value *3 for key, value in dict1.items()}
print(dict2)

四、集合推导式

  语法:{结果 for 循环 if 条件}


#集合推导式
set1 = {5, 4, 3, 2, 1}
set2 = {x * 2 for x in set1 if x > 2}
print(set2)

五、元组推导式,在Python中元组使用()表示,但是()又被用作是生成器了!

  语法:tuple( 结果 for 循环 if 循环)

#没有元组推导式,需要加上tuple()函数!因为在Python中,()圆括号被Python给用作生成器的语法了!
tuple1 = (1, 2, 3, 4, 5)
tuple2  = (x * 2 for x in tuple1)
print(tuple2)
#<generator object <genexpr> at 0x000001EF3512DF90>

tuple1 = (1, 2, 3, 4, 5)
tuple2 = tuple(x * 2 for x in tuple1)
print(tuple2)
#结果
(2, 4, 6, 8, 10)

 六、生成器表达式

  6.1 在语法上,生成器表达式与一般的列表推导式一样,且支持列表推导式的语法(for和if语句)

  6.2 重要区别:列表推导式在内存中产生所有的结果集,生成器表达式不在内存中构建结构,而是返回一个生成器对象(支持迭代协议!),后面按需产生值!

gen = (x ** 2 for x in range(4))
print(gen)
print('__iter__' in dir(gen))
print('__next__' in dir(gen))

#<generator object <genexpr> at 0x000002754703D0B0>
#True
#True

print('*' * 30)
for  i in gen:
    print(i)   
#结果
******************************
0
1
4
9
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值