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内的每一个数.
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内的每一个数.
热门评论
3.再看老师的,太长了看着晕,拆一下
reduce怎么还有一个参数,之前看的类型都是两个啊
查了一下,第三个参数是设置运算的初始值,上来就把[]给a,之后的返回值就都是数组类型了。
第一轮
使用初始值,a=[]
由于a是[],所以all([])为True,然后添加2到数组,返回a
第二轮
第三轮
这里all()返回False,直接短路跳过append,返回数组
最大难点,and用来短路append添加数组,而a.append()返回结果必然是0,然后用or保证能够返回数组a
4.我刚才的方法和老师效率差多少呢?
大概7倍
3.再看老师的,太长了看着晕,拆一下
reduce怎么还有一个参数,之前看的类型都是两个啊
查了一下,第三个参数是设置运算的初始值,上来就把[]给a,之后的返回值就都是数组类型了。
第一轮
使用初始值,a=[]
由于a是[],所以all([])为True,然后添加2到数组,返回a
第二轮
第三轮
这里all()返回False,直接短路跳过append,返回数组
最大难点,and用来短路append添加数组,而a.append()返回结果必然是0,然后用or保证能够返回数组a
4.我刚才的方法和老师效率差多少呢?
大概7倍
lambda a, x: all(x % t for t in a) and a.append(x) or a
老师没看懂这个