【问题标题】:My For loop won't iterate through a list我的 For 循环不会遍历列表
【发布时间】:2017-07-27 14:14:53
【问题描述】:

我必须确定列表中的所有数字是否都是素数,然后根据结果返回布尔“真”或“假”语句。我在 for 循环中做了一些条件语句来查看数字是否为素数。

代码如下:

def all_primes(xs):
    is_prime = None
    for i in xs:
        if i < 2:
            is_prime = False
            return is_prime
            break
        elif (i % 2 == 0) and (i % i == 1):
            is_prime = False
            return is_prime
            break
        else:
            is_prime = True
            return is_prime

问题是,我在 Python Visualizer 中看到了这一点,for 循环在检查列表中的第一个值后停止迭代。我不明白为什么语法与我过去使用的 for 循环相同。

我插入了一些示例值,例如:all_primes([5,2,11,37])all_primes([5,2,4,37]),返回值始终为真,因为 5 是列表中的第一个数字,也是唯一被迭代的数字。

关于为什么的任何想法?

【问题讨论】:

  • 您的每个分支机构都有return。这立即打破了功能。 for 循环完成后,您需要将代码设置为 return
  • 此外,i % i 始终为 0,因此第一个 elifand 语句永远不会为真。
  • @khelwood Any 整数可以被 1 和自身整除。素数的特别之处在于,没有其他数。
  • @ChristianKönig 你跟我说什么?我说i / i错了

标签: python for-loop math iteration primes


【解决方案1】:

你的if/else 块中有一个return 和一个break,你应该摆脱它们。 else 中的 return 也应该在外面,否则只要他找到“素数”,它就会返回。

def all_primes(xs):
  is_prime = None
  for i in xs:
      if i < 2:
          is_prime = False
          return is_prime
      elif (i % 2 == 0):
          is_prime = False
          return is_prime
      else:
          is_prime = True
  return is_prime

在此之后,您应该知道,您并没有真正检查素数。 这不是最有效的方法,但它很清楚如何:

def all_primes(xs):
    def checkPrime(n):
        if n < 2:
            return False
        for i in xrange(2, n):
            if n%i == 0:
                return False
        return True
    return all(map(checkPrime, xs))

编辑: 如果没有 map 函数,您只需要使用 for 循环进行迭代:

def all_primes(xs):
    def checkPrime(n):
        if n < 2:
            return False
        for i in xrange(2, n):
            if n%i == 0:
                return False
        return True
    for n in xs:
        if not checkPrime(n):
            return False
    return True

【讨论】:

  • 如果不使用“map”函数,我将如何编写您建议的代码?
  • 我尝试了编辑后的代码,但不幸的是有些测试用例不适用于该逻辑。如果列表的输入是 1,3,5,7,那么它将失败,因为 1 不是质数,也不是负数。
  • @PrithviBoinpally,只需在checkPrime函数中添加检查,将再次编辑。
【解决方案2】:

您应该反过来看待问题。

如果你找到一个不是素数的数,你应该返回 False,在你的循环结束后你应该返回 True。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-21
    相关资源
    最近更新 更多