手记

[硕.Love Python] 求10000以内所有素数

1.题目: 求10000以内所有素数.

2.源码:

reduce(lambda a, x: all(x % t for t in a) and a.append(x) or a, xrange(2, 10000), [])

3.思路: 面对一个未检测是否为素数的x, 用之前已找到的所有素数(收集在列表a中), 依次尝试能否整除x, 如果全都不能整除则说明x为素数, 此时将x添加到列表a中.循环上述过程检测10000内的每一个数.

17人推荐
随时随地看视频
慕课网APP

热门评论

3.再看老师的,太长了看着晕,拆一下

def func(a,x):
    return all(x%t for t in a) and a.append(x) or a
print reduce(func,xrange(2,10000),[])

reduce怎么还有一个参数,之前看的类型都是两个啊

查了一下,第三个参数是设置运算的初始值,上来就把[]给a,之后的返回值就都是数组类型了。

第一轮

a=[]
print all(2%t for t in a) and a.append(2) or a

使用初始值,a=[]

由于a是[],所以all([])为True,然后添加2到数组,返回a

第二轮

a=[2]
print all(3%t for t in a) and a.append(3) or a

第三轮

a=[2,3]
print all(4%t for t in a) and a.append(4) or a

这里all()返回False,直接短路跳过append,返回数组

最大难点,and用来短路append添加数组,而a.append()返回结果必然是0,然后用or保证能够返回数组a


4.我刚才的方法和老师效率差多少呢?

method_1: 0.687256097794
method_2: 0.103365898132

大概7倍


3.再看老师的,太长了看着晕,拆一下

def func(a,x):
    return all(x%t for t in a) and a.append(x) or a
print reduce(func,xrange(2,10000),[])

reduce怎么还有一个参数,之前看的类型都是两个啊

查了一下,第三个参数是设置运算的初始值,上来就把[]给a,之后的返回值就都是数组类型了。

第一轮

a=[]
print all(2%t for t in a) and a.append(2) or a

使用初始值,a=[]

由于a是[],所以all([])为True,然后添加2到数组,返回a

第二轮

a=[2]
print all(3%t for t in a) and a.append(3) or a

第三轮

a=[2,3]
print all(4%t for t in a) and a.append(4) or a

这里all()返回False,直接短路跳过append,返回数组

最大难点,and用来短路append添加数组,而a.append()返回结果必然是0,然后用or保证能够返回数组a


4.我刚才的方法和老师效率差多少呢?

method_1: 0.687256097794
method_2: 0.103365898132

大概7倍


lambda a, x: all(x % t for t in a) and a.append(x) or a
老师没看懂这个

查看全部评论