生成器面试题(你真的了解Python生成器吗?)

举报
在下周周ovo 发表于 2022/08/07 15:06:04 2022/08/07
【摘要】 生成器面试题(你真的了解Python生成器吗?)

 文章目录

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

🏵️🏵️题目要求

🏵️🏵️题目提示

🏵️🏵️流程图分析

🏵️🏵️答案以及解析

✨运行结果✨

✨解析✨

✨拓展思考✨

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

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

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

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

✨运行结果✨

✨解析✨

🦠面试题三进阶版

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

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

✨运行结果✨

✨解析✨


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

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

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


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))

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

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。