将含if all条件的Python列表推导式转换为循环的问题
把带all条件的列表推导式转为for循环的正确方法
你现在的问题是没法把列表推导式里的all条件正确整合到for循环里,先看你的原代码和出错的尝试:
原列表推导式代码
def count_primes(num): prime = [x for x in range(2,num) if all (x % y != 0 for y in range (2,x))] return len(prime)
你的错误实现
def count_primes(num): primes = [2] for x in range(3,num): for y in range(2,x): if x % y == 0: break else: primes.append(x) break return len(primes)
错误原因
你代码的逻辑完全偏离了原推导式的意图:原代码里的all(x % y !=0 for y in range(2,x))要求所有小于x的y都不能整除x,才会把x判定为质数。但你的实现里,只要x不能被第一个y(也就是2)整除,就直接把x加入列表并跳出内层循环——这会把很多合数(比如9、15)错误地当成质数加入。
正确的循环实现
核心思路是:先假设当前x是质数,遍历所有可能的y去验证,只要找到一个能整除的就标记为非质数,等所有y都验证完后,再判断是否加入质数列表:
def count_primes(num): primes = [] # 遍历2到num-1的所有数 for x in range(2, num): is_prime = True # 检查每个y是否能整除x for y in range(2, x): if x % y == 0: is_prime = False break # 找到因数,不用继续检查 # 所有y都无法整除x,才是质数 if is_prime: primes.append(x) return len(primes)
额外优化(可选)
其实内层循环不需要遍历到x,只需要遍历到int(x**0.5)+1就够了——因为如果x有一个大于sqrt(x)的因数,那必然对应一个小于sqrt(x)的因数,这样能减少循环次数,提升效率:
def count_primes(num): primes = [] for x in range(2, num): is_prime = True # 只检查到平方根即可 for y in range(2, int(x**0.5) + 1): if x % y == 0: is_prime = False break if is_prime: primes.append(x) return len(primes)
内容的提问来源于stack exchange,提问作者TreesAreGood
相关产品推荐
相关产品推荐

