2015-06-27 122 views
0

我在python中編寫了這個函數來計算給定值下的素數。當我執行代碼時它打印「0」。有誰能告訴我爲什麼我的代碼出錯了嗎?'For'迭代器在python中沒有返回正確的答案

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) 
+5

'範圍(2,X + 1)'可以確保'x'也被包括在迭代。所以,它總是會返回'False'。 – thefourtheye

+0

另外pythonic的方式是: 如果is_prime(value): ..... elif not is_prime(value): – TheGeorgeous

+0

爲什麼兩個'else'? ...我認爲第一個就足夠了? –

回答

0

請參閱range function
range(start, stop[, step])

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

這意味着值變爲從2x包括。這意味着必然會有x%value == 0。所以你的函數總是返回False,然後素數是0的列表。您可以使用for value in range(2, x)

0

問題出在您的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 

而且,在其他的功能就應該開始

+0

這最後一個不是必需的,在Python代碼 – raj454raj

+0

中似乎很奇怪,但那不是實際問題,如果我們正在修復其他非必要問題,那麼它們中有很多需要修復:) –

+0

真的那個很糟糕的代碼:) – raj454raj

0
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) 
+0

這是行不通的,因爲如果數字「x **(1/2)」可以是「float」,並且「float」和「float」不能與'range「函數一起使用 –