2017-03-07 122 views
-2

我必須確定列表中的所有數字是否都是素數,然後根據結果返回布爾型「True」或「False」語句。我在for循環中創建了一些條件語句,以查看數字是否爲素數。我的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展臺,for循環停止檢查列表中的第一個值之後迭代。我不明白爲什麼,因爲語法與我過去使用的循環相同。

我插入了一些示例值,如:all_primes([5,2,11,37])all_primes([5,2,4,37]),返回值始終爲true,因爲5是列表中的第一個數字,也是唯一正在迭代的數字。

任何想法爲什麼?

+5

你'return'在你的每個分支。這立即擺脫了功能。在for循環完成之後,您需要將代碼設置爲'return'。 – roganjosh

+3

另外,'i%i''總是0,所以第一個'elif'的'和'語句永遠不會是真的。 –

+0

啊,我沒有明白。這是否意味着我必須擺脫休息時間?我正在使用中斷,因爲即使單個值不是素數,循環也需要關閉。 –

回答

4

您在if/else區塊有returnbreak,您應該清除它們。 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 
+0

我如何編寫你不使用「地圖」功能的建議代碼? –

+0

@PrithviBoinpally,檢查編輯。 – Netwave

+0

我試過了編輯後的代碼,但不幸的是有一些測試用例不適用於該邏輯。如果列表的輸入是1,3,5,7,那麼它會失敗,因爲1不是素數,也不是負數。 –

1

你應該看到另一個問題。

如果你發現一個不是素數的數字,你應該返回False,並且在循環結束後你應該返回True。