【Python百日刷题计划】Day2~生成器面试题(你真的了解Python生成器吗?)

目录

🏠前言:

🦠​​​​​面试题一(难度为中等偏上且必须掌握)

🏵️🏵️题目要求

🏵️🏵️题目提示

🏵️🏵️流程图分析

🏵️🏵️答案以及解析

✨运行结果✨

✨解析✨

✨拓展思考✨

🦠面试题二(难度为难且必须掌握)

🏵️​​​​​​​🏵️题目要求

🏵️​​​​​​​🏵️题目提示

🏵️​​​​​​​🏵️答案以及解析

✨运行结果✨

✨解析✨

🦠面试题三进阶版

🏵️​​​​​​​🏵️题目要求

🏵️​​​​​​​🏵️答案以及解析

✨运行结果✨

✨解析✨

🏠结语:


🏠前言:

本篇博客主要向各位小伙伴们介绍的<Python生成器面试题>,带各位掌握Python希望各位小伙伴们能够在这里收获到更多知识!让我们一起学习!一起进步!

作者希望:由于博主水平限制,博客难免会有错误和不准之处,我也非常希望各位小伙伴能够在留言区指出。让我们一起共勉。

d61ffebdebcc4019897ec6fbab020faa.gif

🦠​​​​​​​​​​​​面试题一(难度为中等偏上且必须掌握

🏵️​​​​​​​🏵️题目要求

以下代码执行后的输出结果是什么?

def func():
    for i in range(4):
        yield i

g=func()

g1=(i for i in g)
g2=(i for i in g1)

print(list(g1))
print(list(g2))

🏵️​​​​​​​🏵️题目提示

1、同一个生成器中的数据只能取一次,取完就没有了

2、生成器的特点惰性运算:不找生成器取值,它就根本不工作

🏵️​​​​​​​🏵️流程图分析

🏵️​​​​​​​🏵️答案以及解析

运行结果

解析

1、先定义了三个生成器g、g1、g2

g=func()
g1=(i for i in g)
g2=(i for i in g1)

2、因为遇到了list(g1),所以list要向g1要值,由于g1 = (i for i in g),所以g1又向g要值然后g执行依次返回0,1,2,3给g1,g1又依次返回给list,所以最后打印出了[0,1,2,3]

下一步执行list(g2)所以g2要向g1要值。因为g1的值在list(g1)的时候都给了list,所以g1里面已经没有值了,所以g1更不会向g取值,所以list(g2)打印出的只是一个空列表

拓展思考

如果将print(list(g1))注释掉打印出的结果是什么:

因为没有list(g1)向g1要值,所以g是不为空的,所以list(g2)打印的结果是[0,1,2,3]

🦠面试题二(难度为难且必须掌握)

🏵️​​​​​​​🏵️题目要求

下列代码执行后的输出结果是什么:

def add(n,i):
    return n+i

def test():
    for i in range(4):
        yield i

g=test()
for n in [1,10]:
    g=(add(n,i) for i in g)

print(list(g))

🏵️​​​​​​​🏵️题目提示

将代码中的

for n in [1,10]:
    g=(add(n,i) for i in g)

用以下代码替换之后在思考一下

n = 1
g = (add(n,i) for i in g)
n = 10
g = (add(n,i) for i in g)

 🏵️​​​​​​​🏵️答案以及解析

运行结果

解析

将提示中的代码进一步替换

n = 1
g = (add(n,i) for i in g)
n = 10
g = (add(n,i) for i in g)

替换为以下代码:

n = 1
g = (add(n,i) for i in g)
n = 10
g = (add(n,i) for i in (add(n,i) for i in test()))

题目就可以替换为

def add(n,i):
    return n+i

def test():
    for i in range(4):
        yield i

g=test()

n = 1
g = (add(n,i) for i in g)
#当执行n=10后n=1就彻底消失了,就不用管了
n = 10
g = (add(n,i) for i in (add(n,i) for i in test()))
#也可以进一步换为g = (add(10,i) for i in (add(10,i) for i in test()))

print(list(g))

所以代码运行结果为:[20, 21, 22, 23]就显而易见了

如果面试题三已经明白了,那就做一下面这个进阶版的面试题三吧(如果还没懂的话额…那就多看几遍吧相信一定会看懂💪​​​​​​​💪)

🦠面试题三进阶版

🏵️​​​​​​​🏵️题目要求

下列代码执行后的输出结果是什么?

def add(n,i):
    return n+i

def test():
    for i in range(4):
        yield i

g=test()
for n in [1,10,5]:
    g=(add(n,i) for i in g)

print(list(g))

🏵️​​​​​​​🏵️答案以及解析

运行结果

解析

可以将代码等价为如下代码

def add(n,i):
    return n+i
def test():
    for i in range(4):
        yield i
g=test()
#for n in [1,10,5]:
#    g=(add(n,i) for i in g)
n = 1
g=(add(n,i) for i in g)    #g=(add(n,i) for i in test())
n = 10
g=(add(n,i) for i in g)    #g=(add(n,i) for i in (add(n,i) for i in test()))
n = 5
g=(add(5,i) for i in (add(5,i) for i in (add(5,i) for i in test())))
print(list(g))

相信通过上面的代码你就可以更好的了解题目,和答案的产生了到此本次分享就结束了😊😊

🏠结语:

感谢各位能够看到这里:

最后一句:代码看懂了不是懂,一定要自己实际操作哇,这样才能更好的理解和吸收。
最后来一句:一个人可以在任何他怀有无限热忱的事情上成功,让我们一起进步吧!!

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5Zyo5LiL5ZGo5ZGob3Zv,size_17,color_FFFFFF,t_70,g_se,x_16

  • 31
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 36
    评论
评论 36
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

在下周周ovo

感谢帅气又多金的您的支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值