关于素数筛选Lambda表达式中x==i逻辑的疑问
解析素数筛选代码中的
x == i逻辑 这段代码是埃拉托斯特尼筛法(埃氏筛)的简化实现,用来找出100以内的素数。你疑惑的x == i,核心作用就是在每次过滤时把当前的i(也就是我们用来筛除倍数的基准数)本身保留下来,具体拆解如下:
- 先明确
filter的规则:filter会保留lambda表达式返回True的元素,丢弃返回False的元素。Python的布尔判断里,0等价于False,非零数值都等价于True。 - 拆分
x == i or x % i这个条件:- 当
x是i的倍数且x≠i时,x%i等于0(布尔值为False),同时x == i也是False,整个条件返回False,这个数会被过滤掉。 - 当
x就是i本身时,x == i是True,不管x%i的结果是什么(其实i%i=0),整个条件返回True,所以i会被留在nums里。 - 当
x不是i的倍数时,x%i得到非零值(布尔值为True),不管x == i是什么,整个条件返回True,这个数会被保留。
- 当
举个具体循环的例子:
- 第一次循环
i=2:初始nums是2到99的所有数,过滤后会保留2(x==i为True),以及所有奇数(奇数%2≠0,返回True),筛掉所有大于2的偶数。 - 第二次循环
i=3:此时nums里是2和所有奇数,过滤后会保留3(x==i为True),以及所有不能被3整除的数,筛掉9、15这类3的倍数(6、12等偶数早就被之前的循环筛掉了)。
另外补充:循环里i只到10是因为100的平方根是10——一个合数必然有一个不大于其平方根的因数,所以筛到10就足够把100以内的所有合数过滤干净,剩下的都是素数。
内容的提问来源于stack exchange,提问作者emiliano
相关产品推荐
相关产品推荐

