代码之家  ›  专栏  ›  技术社区  ›  jxie0755

这些片段在寻找素数方面有什么不同?

  •  2
  • jxie0755  · 技术社区  · 8 年前

    我知道一定有一百万种方法来实现这一点,但我写了几行,可能相当愚蠢。

    pnumber = []
    for x in range(2, 101):
        for i in range(2, x):
            if all(x % i):
                pnumber.append(x)
    print(pnumber)
    

    这不起作用,但如果我尝试这段代码,它会起作用。

    pnumber = [x for x in range(2, 101) if all(x % i for i in range(2, x))]
    print(pnumber)
    

    2 回复  |  直到 8 年前
        1
  •  2
  •   AChampion    8 年前

    您的代码段不是等价的,循环的等价物(不使用任何生成器或理解表达式)将是:

    pnumber = []
    for x in range(2, 101):
        for i in range(2, x):
            if x % i == 0:
                break
        else:
            pnumber.append(x)
    print(pnumber)
    
        2
  •  2
  •   DjaouadNM    8 年前

    您的第一次尝试应该是:

    pnumber = []
    for x in range(2, 101):
        if all(x % i for i in range(2, x)):
            pnumber.append(x)
    print(pnumber)
    

    你的第二次尝试只是第一次的一行版本,速度基本相同,但更短,叫做列表理解。如果你比较这两种方法,你会发现它们的相似之处。

    # In algerba:
    evens = {x : x mod 2 = 0}
    # In python (you need a finite set of numbers for x):
    evens = [x for x in range(2,10) if x%2==0]
    
    # In algerba:
    primes = {x : for any 1<y<x, x mod y =/= 0}
    # In python (you need a finite set of numbers for x):
    primes = [x for x in range(2, 101) if all(x % y != 0 for y in range(2, x))]