【问题标题】:How do I call a function that has a nested function?如何调用具有嵌套函数的函数?
【发布时间】:2021-11-07 18:12:33
【问题描述】:

我是嵌套函数的新手,想在下面调用我的函数,我正在尝试使用嵌套函数和过滤器查找数字是否为素数。以下是我的代码:

def divides(n):
    def div(k):
        return n % k == 0
    return div

def prime(n):
    cnt=0
    res = list(filter(divides(n)(range(1,n)),range(1,n)))
    for i in res:
        if i==True:
            cnt+=1
    if cnt == 2:
        return ("It is a prime")
    else:
        return ("It is not a prime")

print(prime(5))

所以它会引发类型错误,因为我试图将数字从 1 到 n 作为范围发送到嵌套函数。如何使用两个值调用此函数?调用嵌套函数的正确方法是什么?

【问题讨论】:

  • 你可能想做[divides(n)(k) for k in range(1, n)]之类的事情而不是list(filter(divides(n)(range(1,n)),range(1,n)))
  • fwiw 而不是使用嵌套函数,我认为只有一个带有两个参数的函数会简单得多......
  • divides() 没有嵌套。
  • list(filter(divides(n), range(1,n))) 将是调用它的方式。但是,这会导致程序在使用 5 调用时打印“It is not a prime”,因此您也会遇到逻辑错误。我认为您真正需要的是list(filter(divides(n), range(1,n+1))),因为范围不包括 Python 中的正确端点。
  • 糟糕,还是不行。您要么需要使用 map 而不是过滤器,要么更好地将 cnt 计算为 cnt=len(res) 而不是遍历列表。

标签: python filter nested-function


【解决方案1】:

您的divides(n)(range(1,n)) 创建函数divides(n),然后立即调用它,并使用全范围对象作为参数。该范围对象变为k,而n % k 失败。

您尝试使用filter 中的函数,它需要一个函数作为第一个参数:

res = list(filter(divides(n)(range(1,n)),range(1,n)))

你的意思是:

res = list(filter(divides(n), range(1, n)))

然后filterdivides(n) 返回的函数应用于该范围内的每个数字。对于您的 n = 5,您将得到 res = [1],这是该范围内 5 的唯一除数。

你用res 做的事情也有问题,看起来你应该使用range(1, n+1),因为你试图找出是否正好有两个除数。只需检查 len(res) == 2 即可。

或者不是收集列表中的所有除数然后计数,您可以只检查是否有任何除数:

def prime(n):
    if any(filter(divides(n), range(2, n))):
        return ("It is not a prime")
    else:
        return ("It is a prime")

更简单,并且具有能够提前停止的额外好处。例如,prime(1000) 仅达到 2,不检查任何其他候选。

【讨论】:

  • 还是不明白嵌套函数中k的值是怎么设置的?
  • 就像我说的:“filter 将 divides(n) 返回的函数应用于该范围内的每个数字”。
猜你喜欢
  • 2018-05-27
  • 2018-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-23
  • 2012-02-07
  • 1970-01-01
相关资源
最近更新 更多