【问题标题】:Can't understand function behavior - isprime()无法理解函数行为 - isprime()
【发布时间】:2016-02-10 07:49:19
【问题描述】:

我已经构建了两个函数。第一个(不重要但相关,因为它在第二个中调用)告诉一个数字是否是素数:

def is_prime(i):
    if i == 1:
        print("prime")
    if i == 2:
        print("not prime")
    for d in range(2, i):
        if i % d != 0:
            d = d+1
            if d == i:
                print('prime')
                break
        if i % d == 0:
            print('not prime')
            break

我希望能够让这个函数计算从1p 的所有素数。 当我要求它将其附加到列表中时-它会单独返回一个空列表和所有值。

def prime_counting(p):
    list_of_primes = []
    for n in range (p+1):
        if is_prime(n) == "prime":
            list_of_primes.append(n)

我该如何解决这个问题?

【问题讨论】:

  • 注意: 1 不是素数。
  • 很抱歉。每次堆栈溢出都要求我等待 7 分钟才能接受答案!

标签: python function for-loop primes


【解决方案1】:

(注意:我没有检查您的is_prime() 函数的逻辑
您的代码中明显的错误是函数is_prime() 没有return 任何东西,它只是prints。您希望它为return TrueFalse,具体取决于数字是否为质数。将其更改为这样做。

然后你可以检查:

if is_prime(n) == True:
    list_of_primes.append(n)

编辑:如 cmets 中所述(正确),编写此类语句的更“pythonic”方式是:

if is_prime(n):
    list_of_primes.append(n)

由于is_prime() 将返回TrueFalse(因此无需与它们进行比较)。

【讨论】:

  • 更多pythonic是if is_prime(n):
  • 如果is_prime(n) 返回TrueFalse,您是否需要将其与True 进行比较?可能只使用if is_prime(n): ...?
  • 你们都对,因为 OP 是初学者(我假设),我认为这将是一种更清晰的方法。不过,我会用这个来编辑我的答案。谢谢
【解决方案2】:

你的代码有一些缺陷,但你要问的是:

您正在查看is_prime() 的返回值

if is_prime(n) == "prime":

is_prime() 不包含任何返回语句。

这是一个稍微修改过的版本,它实际上从is_prime()返回一个值:

def is_prime(i):
    if i == 1:
        return "prime"
    if i == 2:
        return "not prime"

    for d in range(2, i):
        if i % d != 0:
            d = d + 1
            if d == i:
                return "prime"
        if i % d == 0:
            return "not prime"


def prime_counting(p):
    list_of_primes = []
    for n in range(p+1):
        if is_prime(n) == "prime":
            print("added %s" % n)
            list_of_primes.append(n)
    return list_of_primes


if __name__ == '__main__':
    print(prime_counting(3))

如果您改为返回布尔值 return Truereturn False,您将可以这样做:

if is_prime(n):
   do_something()

甚至像这样使用“理解”:

prime_list = [n for n in range(1, p+1) if is_prime(n)]

【讨论】:

  • 虽然您的主要观点是正确的,但将return 像函数中的字符串一样是非常糟糕的做法。它非常容易出错(为什么“非质数”而不是“非质数”或“非质数”或“非质数”?...)并且不应该这样做。
  • 我绝对同意,并且在代码中提到它实际上是不好的做法。虽然用完全重写的代码回答问题可能会带来更多的困惑。
猜你喜欢
  • 1970-01-01
  • 2012-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-07
  • 2020-01-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多