【问题标题】:'For' iterator in python doesn't return the right answerpython中的'For'迭代器没有返回正确的答案
【发布时间】:2015-09-14 06:13:44
【问题描述】:

我在 python 中写了这个来计算给定值下的素数。当我执行代码时它打印“0”。谁能告诉我为什么我的代码出错了?

def is_prime(x):
    if x<2:
        return False
    else:    
        for value in range(2, x):
            if x%value == 0:
                return False
        else: 
            return True

def primes_in(x):
    primes = [ ]
    for value in range(2, x+1):
        if is_prime(value):
            primes.append(1)
        elif not is_prime(value):
            primes.append(0)
        else: 
            primes.append(0)
    return sum(primes)

print primes_in(25)

【问题讨论】:

  • range(2, x+1) 确保 x 也包含在迭代中。所以,它总是会返回False
  • pythonic 的方式也是: if is_prime(value): ..... elif not is_prime(value):
  • 为什么是两个 else ? ...我认为第一个就足够了?
  • 更改后它会在我的机器上打印9
  • 顺便说一句,使用列表 (primes) 作为计数器相当浪费。

标签: python for-loop iterator


【解决方案1】:

range function
range(start, stop[, step])

 for value in range(2, x+1):
            if x%value == 0:
                return False

这意味着价值从2 变为x包含。这意味着一定会有x%value == 0。所以你的函数 always 返回 False 然后 primes 是 0 的列表。

你应该使用for value in range(2, x)

【讨论】:

    【解决方案2】:

    问题出在你的 is_prime 函数中,你从 2 循环到 x 包括两者,所以 x%x 总是 0 ,因此它总是返回 False。

    你只需要循环到数字的sqrt。

    示例代码-

    def is_prime(x):
        if x<2:
            return False
        else:    
            for value in range(2, int(x**(1/2))+1):
                if x%value == 0:
                    return False
            else: 
                return True
    

    另外,你应该在另一个函数中启动

    【讨论】:

    • 最后一个 else 不是必需的,在 python 代码中看起来很奇怪
    • 没错,但这不是真正的问题,如果我们要解决其他非必要问题,还有很多问题需要解决:)
    【解决方案3】:
    def is_prime(x):
        if x<2:
            return False
        else:
            if x == 2:
                return True
            for value in range(2, int(x**(0.5)) + 1):
                if x%value == 0:
                    return False
            return True
    def primes_in(x):
        primes = []
        for value in range(2, x+1):
            if is_prime(value) == True:
                primes.append(1)
            elif is_prime(value) == False:
                primes.append(0)
            else:
                primes.append(0)
        return sum(primes)
    print primes_in(25)
    

    【讨论】:

    • 这行不通,因为如果数字x**(1/2) 可以是float,并且floatfloat 不能与range 函数一起使用
    猜你喜欢
    • 2018-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-18
    • 1970-01-01
    • 2021-10-25
    相关资源
    最近更新 更多