python生成器之面试题

1.0
有一个有意思的python面试题,是下面的这个样子

def add(a,b): #普通求和函数
return a + b
def test(): #生成器函数
for r in range(4):
yield r
g=test()
for n in [2,10]:
g=(add(n,i) for i in g)
print(list(g))
----------------------------------------------------------------------------------------------
1.1:代码块注释如下(还是上面的内容,只是注释加多了)
def add(a,b):                     #普通求和函数
return a + b
def test(): #生成器函数
for r in range(4):
yield r
g=test() #获取生成器对象,后面的操作都指向这个对象,这和直接执行fun()函数销效果是不一样的
for n in [2,10]: #因为前面已经定义了生成器g,这个for循环的代码块等于是重新定义了变量g,
g=(add(n,i) for i in g) #重新定义的这个变量g也是一个生成器,使用推导式定义的生成器
print(list(g)) #list自带for方法,所以list(g)会一次性把上面列表生成器的值拿完
------------------------------------------------------------------------------------------------
1.2:代码简化(对上面的代码做了简化,但是都是等效的,主要是对for循环做了简化)
def add(a,b):            #普通求和函数
return a + b
def test(): #生成器函数
for r in range(4):
yield r
g=test()
n=2
g=(add(n,i) for i in g)
n=10
g=(add(n,i) for i in g)
print(list(g))
--------------------------------------------------------------------------------------------------
1.3:代码简化(对上面的代码做了简化,但是都是等效的,主要是对n重新赋值的过程做了简化)
def add(a,b):            
return a + b
def test():
for r in range(4):
yield r
g=test()
n=10 #和上面的代码做比较,n重新赋值了两次,第二次已经把一次的赋值覆盖掉了,但是g因为前面做过定义,需要带入
g=(add(n,i) for i in (add(n,i) for i in g))
print(list(g))
--------------------------------------------------------------------------------------------------
1.3:代码简化(对上面的代码做了简化,但是都是等效的,带入数字10)

def add(a,b):

return a + b
def test():             
for r in range(4):
yield r
g=test()

g=(add(10,i) for i in (add(10,i) for i in g))
print(list(g))
#因为for循环自带__next__方法,所以for循环作用于生成器的时候也是一次性遍历完的,并不需要单独的在一个一个执行next
#分别带入i值0,1,2,3,可以生成g的一个生成器结果,再通过list(g)一次性拿完
-----------------------------------------------------------------------------------------------












转载于:https://www.cnblogs.com/zhuhaofeng/articles/9469897.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值