Bedingte list comprehension

Ich versuche besser zu verstehen, wie die Liste Verstehens Arbeit.
Ich habe die folgende Funktion, die true oder false zurückgibt wenn eine Zahl eine Primzahl ist (das fand ich irgendwo im forum, aber kann mich nicht erinnern, wo):

import math

def is_prime(n):
    if n % 2 == 0 and n > 2: 
        return False
    for i in range(3, int(math.sqrt(n)) + 1, 2):
        if n % i == 0:
            return False
    return True

wenn ich laufen:

[x for x in range(2, num) if is_prime(x)]

bekomme ich das gewünschte Ergebnis

[2, 3, 5, 7, 11, 13, 17, 19]

bei dem Versuch, zu konvertieren die gesamte Funktion auf eine Liste, die das Verständnis, die ich kam mit:

[x if not (x%2==0 and x > 2) else x for x in range (2, num) 
     for i in range(3, int(x**(1/2))+1, 2) if not (x%i==0)]

produziert:

[10, 11, 13, 14, 16, 17, 19]

nicht sicher, wohin ich gehe falsch und würde schätzen etwas Hilfe. In Wahrheit denke ich, es ist besser, verwenden Sie die Funktion in diesem Fall, aber wie ich schon sagte, ich bin versucht, zu verstehen, die Liste Verständnis und seine Fähigkeiten.

  • dass nur die Renditen der ungeraden zahlen und schließt 2. OP ist auch ohne zahlen durch 3 teilbar.
  • Ich würde sagen, das ist zu viel, quetschen sich in eine Liste Verständnis. Es ist ok zum üben, aber nicht so etwas wie, dass, wenn jemand anderes hat, es zu Lesen.
  • Nur für kichert ich zeitlich jede version: die Funktion [x for x in range(2, num) if is_prime(x)] version war 9.01 s pro loop; @Julien-version (mit meiner geringfügigen änderungen): 12.8 s pro loop und @Harshit Garg version: 44.4 s pro loop.
Schreibe einen Kommentar