【问题标题】:Why does my boolean function sometimes return None?为什么我的布尔函数有时会返回 None?
【发布时间】:2015-02-18 16:14:34
【问题描述】:

使用 Python 3.4。已尝试从 IF 语句中调用返回布尔值的函数 prime/2(始终为 True 或 False)。该函数运行起来很昂贵,所以我只想在知道需要它时调用它,因此从决策点内调用。被调用的函数不能可靠地返回 True/False。有时返回为 None,此时测试失败。我使用 Python 的 IDLE 及其调试器。我调用 primes(2, 5, []) 并逐步执行代码。当 prime/2 在 n = 5 和 p = 5 时到达 elif n

def primes(m, n, l):        # the calling function
    if m > n:               # creates a list of primes from
        print(l, end='\n')  # m through n, inclusive
    elif m < 2:
        primes(2, n, l)
    elif m == 2:
        l.append(2)
        primes(3, n, l)
    elif m % 2 == 0:
        primes(m + 1, n, l)
    elif prime(m, 2):        # calling the second function
        l.append(m)          # to test m for primality
        primes(m + 2, n, l)
    else:
        primes(m + 2, n, l)

def prime(n, p):             # the called function will return
    if n < 2:                # True if m is prime, False otherwise
        return False
    elif n < 4:
        return True
    elif n <= p:
        return True
    elif (n > 2) and (n % p == 0):
        return False
    elif p == 2:
        prime(n, 3)
    else:
        prime(n, p + 2)

【问题讨论】:

  • 请出示您的代码,以便我们知道您在说什么
  • “参考手册语法不允许我在 IF 中尝试执行的操作”。你是说if myFunctionCall(): 不适合你?这是完全有效的语法。
  • Python 短路了布尔表达式。虽然没有您的代码很难准确判断,但如果 need_time_consuming_func 为 False,if need_time_consuming_func and time_consuming_func(): 之类的代码不会调用 time_sumption_func()。
  • Python3.x 参考手册。我对所读内容的理解是,IF 条件可以是 (1) 等价测试,例如 ==、\=、
  • 我会提供一些代码。只需要弄清楚这是如何完成的。

标签: python function if-statement python-3.x functional-programming


【解决方案1】:

错误在于您递归调用 prime() 的方式。您需要显式返回该值。像这样:

def prime(n, p):             # the called function will return
    if n < 2:                # True if m is prime, False otherwise
        return False
    elif n < 4:
        return True
    elif n <= p:
        return True
    elif (n > 2) and (n % p == 0):
        return False
    elif p == 2:
        return prime(n, 3)   # <--- RETURN VALUE
    return prime(n, p + 2)   # <--- & RETURN VALUE

【讨论】:

  • 是的,我已经验证了它有效。非常感谢。
  • 没问题。如果您觉得这解决了问题,stackoverflow 程序会将其标记为答案。
猜你喜欢
  • 2019-03-03
  • 2021-11-13
相关资源
最近更新 更多