求素数的Python代码,求讲解

L1 = [x for x in range ( 1 , 100 ) if not [y for y in range ( 2 ,x/2+1) if x % y == 0 ]]
print L1

刚开始学,这个有点看不懂,range我知道,关键就是那个 if not...这个地方不太懂。求详细讲解,讲的好的有加分!
我只知道如果这样 [x for x in range(1,11) if x%2 == 0]
返回的是1-10中所有可以整除2的数。
上面再嵌套,再来个if not就不懂了,期待详细解答
如果你觉得新手看了你的解释能理解的话请写下,否则就不用浪费您的时间了

这样写不知道你能不能理解?

这是等效代码:

L1 = []
for x in range(1, 100):
list = []
for y in range(2, x/2 + 1):
if x % y == 0:
list.append(y)
if not list:
L1.append(x)
print L1

对于空列表,not [] 返回True

原来的代码中, if not后面是一个临时生成的列表, 如果这个列表为空则表明x没有任何>=2的因子,x必是素数,于是添加x 到主列表.

[x for x in range(1, 100) if express ]
这样的语句仅仅在express是True才会添加x
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-04-07
拆分一下啊。
首先是x取值1-99
然后对后面的语句进行判断,如果是False就输出L1,即对应的x值。
后面的语句可以理解为:y取值(2,x/2+1),在这里面遍历。
如果对任一个y有x % y == 0那么返回值为1,就被if not 否掉了。这一步就是判断素质数。
输出的应该是质数而不是素数吧?追问

这种判断素数的方法我理解,只是用Python这样写有点看不太明白。
你说: 后面的语句可以理解为:y取值(2,x/2+1),在这里面遍历。如果对任一个y有x % y == 0那么返回值为1,就被if not 否掉了。
可以理解成,内层的迭代返回的结果元组是全0的,前面的x就被输出,如果有一个元素是非0,就不输出?

追答

yes。

第2个回答  2012-04-04
if pow(a,n-1,n)!=1: return False return True 测10023 isPrime2(10023,5) 你可以百度一下“筛法求素数”。 有个希腊的数学家的一个,WnpFwY
第3个回答  2012-04-03
对所有的y在2到x/2+1之间,y都不是x的因子,那么x就是一个质数。