Python 入门 07 —— 推导式、生成器、解包

一、推导式
推导式其实是循环语句一个简写,以用于快捷地生成列表、元组、字典和集合。例如:

lst1 = [x for x in range(5)]
lst2 = tuple([x for x in range(5)])
lst3 = {x:chr(65+x) for x in range(5)}
lst4 = {x for x in range(5)}
print(lst1,lst2,lst3,lst4)
# [0, 1, 2, 3, 4] (0, 1, 2, 3, 4) {0:‘A’, 1:‘B’, 2:‘C’, 3:‘D’, 4:‘E’} {0, 1, 2, 3, 4}

推导式第一部分是一个运算式,可以有函数,运算的结果就作为序列的一个元素。不断的循环,不断地产生元素,所以元素构成一个序列。

1、推导式的后面部分是一个简写的循环语句,这个循环语句还可以嵌套。例如:

lst1 = [str(x)+’-’+str(y) for x in range(5) for y in range(2)]
lst2 = [str(x)+’-’+str(y) for x in range(5) for y in range(x)]
print(lst1,lst2,sep=’\n’)
# [‘0-0’, ‘0-1’, ‘1-0’, ‘1-1’, ‘2-0’, ‘2-1’, ‘3-0’, ‘3-1’, ‘4-0’, ‘4-1’]
# [‘1-0’, ‘2-0’, ‘2-1’, ‘3-0’, ‘3-1’, ‘3-2’, ‘4-0’, ‘4-1’, ‘4-2’, ‘4-3’]

2、在推导式的最后面还可以加一个 if 语句来过滤元素。例如:

lst1 = [x**2 for x in range(10) if x>=5]
lst2 = [str(x)+’-’+str(y) for x in range(5) for y in range(x) if x+y>3]
print(lst1,lst2,sep=’\n’)
# [25, 36, 49, 64, 81]
# [‘3-1’, ‘3-2’, ‘4-0’, ‘4-1’, ‘4-2’, ‘4-3’]

二、生成器
生成器从表面上看与推导列一样,也是相当于循环语句的简写,只有在最外面限定只能用小括号,但生成器与推导式有两点本质的不同:
一是生成器最后生成的不是序列,而是一个生成器迭代对象,当然这个生成器迭代对象可以轻易地转换成列表、元组、字典和集合;
二是生成器在编译时仅生成一个生成器对象,只在被调用时才创建生成器迭代对象。生成器对象相当于一台机器,生成器迭代对象相当于产品。

举例:
gen = (x for x in range(5)) # 最外面限定只能用小括号
print(gen) # 产生的是生成器迭代对象 <generator object at 0x00000000024CEDD0>
print(list(gen)) # 调用时会创建生成器迭代对象,生成器迭代对象很容易转换成序列:[0,1,2,3,4]

推导列能用的循环嵌套和最后加一个 if 语句的方法,在生成器中一样能用。
gen2 = (str(x)+’-’+str(y) for x in range(10) for y in range(x) if x+y>13)
print(list(gen2)) # [‘8-6’, ‘8-7’, ‘9-5’, ‘9-6’, ‘9-7’, ‘9-8’]

以上说的仅是用于生成序列的生成器,因为它的外面用的是小括号,所以可称之为:元组型生成器。另外,当一个函数中有“yield”关键词时,这个函数就变成了一个生成器型函数(又称:函数型生成器)。

很多人将元组型生成器称作“元组生成器”,我认为这不是很妥当,因为这很容易被误认为这个生成器是专门用于生成元组的,而其实不是,它最终生成的是一个生成器迭代对象,这个生成器迭代对象可以被转换成元组,也可以被转换成其它序列。

有 yield 的生成器型函数与无yield 的普通函数相比,区别还是很大的。

1、生成器型函数只有作为next()参数被调用时才会被执行,其它方式无法使用这种函数。

def fun01():  # 无 yield 的普通函数
    print('++');  print(
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值