【发布时间】:2022-01-14 05:13:52
【问题描述】:
问题
我试图理解列表理解和生成器表达式之间的区别:
x = 25
if x in [i**2 for i in range(100)]:
print('list version: {} is a square!'.format(x))
# list version: 25 is a square!
if x in (i**2 for i in range(100)):
print('generator version: {} is a square!'.format(x))
# generator version: 25 is a square!
当调用一次时,它们似乎都在做同样的事情。所以没有区别?
然后我循环尝试它们:
l = [i**2 for i in range(100)]
g = (i**2 for i in range(100))
print('list version')
for x in range(20, 51):
if x in l:
print('{} is a square!'.format(x))
# list version
# 25 is a square!
# 36 is a square!
# 49 is a square!
print('generator version')
for x in range(20, 51):
if x in g:
print('{} is a square!'.format(x))
# generator version
#
在生成器版本中,没有找到正方形。为什么?生成器和列表有什么区别?
上下文
我正在尝试解决以下问题:给定一个数字n (n > 0),我必须生成最小的平方数N (N > 0),这样n + N 也是一个完美的平方。如果没有收到响应,返回-1。
我有以下代码:
def solve(n):
# l = [i**2 for i in range(10**2)]
l = (i**2 for i in range(10*4))
r = -1
for i in l:
if n + i in l:
return i
else:
r = -1
return r
当我使用列表理解 l = [i**2 for i in range(10**2)] 时它有效,但当我使用生成器 l = (i**2 for i in range(10*4) 时无效。
我在 Python 可视化工具中验证了这段代码,如果我使用生成算法,它不会进入循环。
你能帮帮我吗?
【问题讨论】:
-
“它不”是什么意思?
-
它不适合发电机
-
您需要提供哪些详细信息?我是这个平台的新手,也许我忘了说明什么
-
它有什么作用?你是怎么得出它没有进入循环的结论的?例如,您尝试过
for i in l: print(i)吗?你自己研究了什么来解决它? How to Ask -
你应该提到“不起作用”的含义:它是否产生错误的输出(哪个),它是否产生一个错误(哪个),它是否挂起,......等等。我们希望您提供调试信息。
标签: python algorithm generator