找到素数的这些片段有什么区别?

时间:2017-09-09 18:53:57

标签: python

我试图找到1到100之间的素数。

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

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 个答案:

答案 0 :(得分:2)

你的第一次尝试应该是:

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))]

答案 1 :(得分:2)

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

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