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人点赞
4 评论
共同学习,写下你的评论
Brook_StudyMachine
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倍
Brook_StudyMachine
1.先不看老师答案自己试试
def func(n): for i in xrange(2,n): if n%i==0: return False return True [x for x in range(2,10000) if func(x)]
按照之前的思路,要将func(x)转换为匿名函数
[x for x in xrange(2,10000) if (lambda n:for i in xrange(2,n) if n%i==0)(x)]
语法错误,逻辑也不太对
2.是在想不出来了,看看老师的答案,好复杂啊
有一个all(),如果列表中有0或''会返回0
那么将我之前的改一下
[x for x in xrange(2,10000) if (lambda n:all(n%i for i in xrange(2,n)))(x)] [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37,...]
通过了
这个方法是遍历型的,效率恐怕不高
TheWayToNinja
这么暴力能过吗?可以参考下素数筛选法
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
lambda a, x: all(x % t for t in a) and a.append(x) or a
老师没看懂这个