gpt4 book ai didi

python - 为什么我不能在这个例子中用它的返回值替换函数名?

转载 作者:行者123 更新时间:2023-12-03 23:00:24 26 4
gpt4 key购买 nike

我正在编写一个 python 程序来打印素数。这是我的代码和一些评论

# make an odd iterator
def _odd_iter():
n = 3
while True:
yield n
n = n + 2

# return a lambda funcion to find which number couldn't be divisible by p
def _not_divisible(p):
return lambda x : x % p > 0

def primes():
yield 2
it = _odd_iter() # initial sequence
while True:
n = next(it)
yield n # give the first element in the new iterator it
# When I use code below, filter seems doesn't work well.
it = filter(lambda x : x % n > 0, it)
# When I use code below, filter works well
# it = filter(_not_divisible(n), it)

# print the first 10 primes
prime = primes()
for i in range(10):
print(next(prime), end=', ')
我的主要问题与 filter 一致.当我使用函数时 _not_divisible(n)在过滤器中,我得到了输出:
2, 3, 5, 7, 11, 13, 17, 19, 23, 29
这就是我想要的。但是当我使用函数 _not_divisible(n)的返回值 lambda x: x % n > 0而不是函数本身,我得到了输出:
2, 3, 5, 7, 9, 11, 13, 15, 17, 19
看来 filter不起作用。
我也测试是否 _not_divisible(3)lambda x: x % 3 > 0都一样:
# test if _not_divisible(n) and lambda x:x % n > 0 are same, This works fine. 
ita = filter(lambda x:x % 3 > 0, range(20))
itb = filter(_not_divisible(3), range(20))
while True:
try:
print(next(ita), end=', ')
print(next(itb), end=', ')
except StopIteration:
break
它给了我一个很好的输出:
1, 1, 2, 2, 4, 4, 5, 5, 7, 7, 8, 8, 10, 10, 11, 11, 13, 13, 14, 14, 16, 16, 17, 17, 19, 
19,
那么是什么原因导致的问题,任何人都可以提供帮助?

最佳答案

这是一个偷偷摸摸的。问题出在 n ,您在上次测试中对其进行了硬编码。

ita = filter(lambda x:x % 3 > 0, range(20))
itb = filter(_not_divisible(3), range(20))
我们修改一下代码看看。
ita = []
itb = []
for n in range(3, 8, 2):
ita.append(filter(lambda x:x % n > 0, range(20)))
itb.append(filter(_not_divisible(n), range(20)))

for a, b in zip(ita, itb):
print(list(a))
print(list(b))
print()
这打印出来
[1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19]
[1, 2, 4, 5, 7, 8, 10, 11, 13, 14, 16, 17, 19]

[1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19]
[1, 2, 3, 4, 6, 7, 8, 9, 11, 12, 13, 14, 16, 17, 18, 19]

[1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19]
[1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19]
lambda 将始终查找 n 的值当它被调用时。到您在 ita 中调用所有 lambda 时,他们都会看到值 n在迭代结束时有,即 7。
相反,当您将该值传递给函数并从内部调用 lambda 时,您最终会“卡住”该值。因为函数有自己的本地上下文和 n是在调用过程中传递的任何值。所以 itb 中的每个 lambda会查 n每次都来自不同的上下文。

关于python - 为什么我不能在这个例子中用它的返回值替换函数名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66352765/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com