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

本文涉及的产品
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
简介: 【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))

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

相关文章
|
2月前
|
存储 索引 Python
|
2月前
|
Python
Python生成器、装饰器、异常
【10月更文挑战第15天】
|
2月前
|
机器学习/深度学习 算法 Java
机器学习、基础算法、python常见面试题必知必答系列大全:(面试问题持续更新)
机器学习、基础算法、python常见面试题必知必答系列大全:(面试问题持续更新)
|
2月前
|
搜索推荐 Python
Leecode 101刷题笔记之第五章:和你一起你轻松刷题(Python)
这篇文章是关于LeetCode第101章的刷题笔记,涵盖了多种排序算法的Python实现和两个中等难度的编程练习题的解法。
23 3
|
2月前
|
传感器 大数据 数据处理
深入理解Python中的生成器:用法及应用场景
【10月更文挑战第7天】深入理解Python中的生成器:用法及应用场景
51 1
|
2月前
|
存储 数据处理 Python
深入解析Python中的生成器:效率与性能的双重提升
生成器不仅是Python中的一个高级特性,它们是构建高效、内存友好型应用程序的基石。本文将深入探讨生成器的内部机制,揭示它们如何通过惰性计算和迭代器协议提高数据处理的效率。
|
26天前
|
存储 程序员 数据处理
深入理解Python中的生成器与迭代器###
本文将探讨Python中生成器与迭代器的核心概念,通过对比分析二者的异同,结合具体代码示例,揭示它们在提高程序效率、优化内存使用方面的独特优势。生成器作为迭代器的一种特殊形式,其惰性求值的特性使其在处理大数据流时表现尤为出色。掌握生成器与迭代器的灵活运用,对于提升Python编程技能及解决复杂问题具有重要意义。 ###
|
2月前
|
存储 大数据 数据处理
理解Python中的生成器:高效迭代的秘密
【10月更文挑战第8天】理解Python中的生成器:高效迭代的秘密
39 0
|
2月前
|
存储 大数据 程序员
深入理解Python中的生成器
【10月更文挑战第8天】深入理解Python中的生成器
17 0
|
2月前
|
算法 C++ Python
Leecode 101刷题笔记之第四章:和你一起你轻松刷题(Python)
这篇博客是关于LeetCode上使用Python语言解决二分查找问题的刷题笔记,涵盖了从基础到进阶难度的多个题目及其解法。
18 0