如何将Python中的for循环转换为列表推导式?附素数函数改写问题
解决素数判断函数的列表推导式改写问题
嘿,咱们来搞定你改写素数判断函数时遇到的问题,让素数列表能正常输出!首先先看你原来的素数判断函数:
def isPrime(n): for i in range(2, n): if n % i == 0: return False return True
这个函数本身是能正常工作的,但如果你想用列表推导式/生成器表达式的逻辑来重写它(让代码更简洁),直接硬套列表推导式语法会报错——因为你需要的是返回一个布尔值(是否为素数),而不是生成一个列表。这里我们可以用all()函数配合生成器表达式来实现一行版的素数判断,还能顺便优化效率(原来的函数遍历到n-1有点冗余,其实遍历到√n就足够了):
改写后的高效isPrime函数
def isPrime(n): return n > 1 and all(n % i != 0 for i in range(2, int(n**0.5) + 1))
简单解释下逻辑:
n > 1:先排除小于等于1的数,它们肯定不是素数all(...):只要生成器里的所有条件都成立(也就是n不能被2到√n之间的任何整数整除),就返回True,否则返回Falseint(n**0.5) + 1:因为range是左闭右开的区间,加1是为了确保能遍历到√n的整数部分
生成2到99的素数列表
你原来的打印语句完全可以直接用,不管是用你最初的isPrime还是上面改写后的版本,都能正常输出结果:
print([x for x in range(2, 100) if isPrime(x)])
你之前改写报错的可能原因
如果之前你尝试直接把for循环的逻辑塞进列表推导式返回,比如写成:
def isPrime(n): return [False for i in range(2,n) if n%i==0]
这就会返回一个列表而不是布尔值,自然会导致后续列表推导式判断条件时出错——因为if后面需要的是布尔值,而不是列表。所以一定要用all()/any()这类函数把推导式的结果转换成布尔值才行。
现在运行上面的代码,就能得到2到99的所有素数列表啦!
内容的提问来源于stack exchange,提问作者RomeoRomeo
相关产品推荐
相关产品推荐

