2016-09-15 3 views
0

Also habe ich diesen Code und er soll ein Tupel mit allen Primzahlen darin ausgeben. Aber stattdessen druckt es nur ein leeres Tupel aus ...allPrimes druckt ein leeres Tupel aus Python

Kann mir jemand sagen warum? Ich muss auch ein Kind verwenden.

def isPrime(number): 
for i in range(2,int(number**(0.5))+1): 
    if number % i == 0: 
     return False 
    else: 
     return True 


def allPrimes(number): 
    tup=() 
    for i in range(1,number): 
     if isPrime(i) == True: 
      tup += (i,) 
    print(tup) 

allPrimes(26) 

ist hier der richtige Code

def isPrime(number): 
    if number < 2: 
     return False 
    for i in range(2, int(number ** (0.5)) + 1): 
     if number % i == 0: 
      return False 
    return True 



def allPrimes(number): 
    tup=() 
    for i in range(1,number): 
     if isPrime(i) == True: 
      tup += (i,) 
     print(tup) 

allPrimes(26) 
out[1]: (2, 3, 5, 7, 11, 13, 17, 19, 23) 
+0

Ich habe gerade einige Änderungen an meinem Code vorgenommen und es funktioniert immer noch nicht. – drewteriyaki

+0

Ich muss ein Tupel verwenden, es ist für eine Assaignment – drewteriyaki

+0

Es ist normalerweise besser, eine "Liste" zu verwenden, um es aufzubauen. Auch wenn es am Ende ein "Tupel" sein muss, ist es viel schneller, die "Liste" zu erstellen und dann am Ende in "Tupel" umzuwandeln, als ständig ein neues "Tuple" -Element zu erzeugen. Initialisiere einfach ret = [] ', ändere' tup + = (i,) 'in' ret.append (i) ', und wenn du' zurückkommst/'druckst, mache' print (tuple (ret)) 'oder' return tuple (ret) 'um zu konvertieren. – ShadowRanger

Antwort

2

Ihre isPrime() Funktion beginnt bei 1. Jede ganze Zahl ist durch 1 teilbar, so dass immer False zurückgegeben wird. Beginnen Sie stattdessen bei 2.

def isPrime(number): 
    if number < 2: 
     return False 
    for i in range(2, int(number ** (0.5)) + 1): 
     if number % i == 0: 
      return False 
    return True 

Auch sollte Ihre allPrimes wahrscheinlich eine Liste verwenden, anstatt ein Tupel, und man konnte nur isPrime(i) statt isPrime(i) == True verwenden, aber es wird so, wie es ist zu arbeiten.

+0

Noch nicht ganz richtig ... das würde True für 1 – wim

+0

Ich habe gerade diese Änderungen vorgenommen, aber es heißt, dass 3 ist keine Primzahl – drewteriyaki

+0

Nein, tut es nicht. – kindall

1

Es ist, weil Ihre isPrime Funktion funktioniert nicht.

number % 1, d.h. 'Rest, wenn durch 1 geteilt', wird immer Null für ganze Zahlen sein.

1

Es gibt ein paar Probleme in Ihrem Code:

1) In isPrime kehrt True auf der falschen Linie

2) Sie drucken tup außerhalb des Funktionsumfangs

3) Sie sind nicht Handhabung Fall von 1 (in isPrime)

4) Sie tuple verwenden Primzahlen zu speichern, ist list Wette ter; es ist viel effizienter.

5) Verwenden Sie Snake Case für Funktionsnamen in Python.

machen die Änderungen:

def is_prime(number): 
    if number < 2: 
     return False 

    for i in range(2,int(number**(0.5))+1): 
     if number % i == 0: 
      return False 

    return True 

def all_primes(number): 
    my_primes = [] 
    for i in range(1,number): 
     if is_prime(i): 
      my_primes.append(i) 
    return my_primes 

if __name__ == "__main__": 
    print all_primes(40) 
+0

Ich würde vorschlagen, zwischen Implementierung/logische Fehler und gute/Python-Konventionen (Punkte 1-4 und 5) zu unterscheiden, so OP nicht verwirrt, dass die Namen wichtig sind. Aber vielleicht bin ich einfach zu wählerisch - in diesem Fall tut mir leid ;-) – quapka

0

Da in der ersten Iteration, wenn number % i != 0: die Zahl prim ist, haben Sie True am Ende der Iteration einer Pause es, wenn `Zahl% i == 0 zurückzukehren:

def isPrime(number): 
    res = True 
    if number < 2: 
     res = False 
    else: 
     for i in range(2,int(number**0.5)+1): 
      if number % i == 0: 
       res = False 
       break 
    return res 
+0

Bitte überprüfen Sie dies. – Zety