我想在for循环中的getal后面添加一个if。
if all(number % getal != 0 for getal in primes):
primes.append(number)
我试过这个,但没用。是否可以在for循环中向getal添加一个if?
if all(number % getal != 0 for getal if getal <= sqr_number in primes):
primes.append(number)
不知怎的,你们给出的将if替换到代码末尾的解决方案与当前代码的工作方式不同。
def prime(n):
primes = [2,3,5,7]
number = 9
while number < n:
print(number)
sqr_number = int(number**0.5)
if number % sqr_number != 0:
#print(sqr_number)
for getal in primes:
if getal <= sqr_number:
#print(getal)
if all(number % getal != 0 for getal in primes):
primes.append(number)
number += 2
print(primes)
print(sum(primes))
综合中过滤器的语法如下:
(expr for target in iterable if condition)
所以你把if
放错了位置,它需要在最后:
all(number % getal != 0 for getal in primes if getal <= sqr_number)
In:
if all(number % getal != 0 for getal if getal <= sqr_number in primes):
primes.append(number)
"过滤器"条件应该在循环之后:
if all(number % getal for getal in primes if getal <= sqr_number ):
primes.append(number)
(注:此处!= 0
为冗余(
也就是说,它不是很有效,因为一旦达到sqr_number
(如果列表被排序(,就不会使用最后的迭代(经典循环可以使用break
(
您可以使用bisect
来计算primes
表的最大有用索引:
max_useful_index = bisect.bisect(primes,sqr_number)
当数字高于sqr_number
时,该内部循环停止(添加了保护以避免可能的超范围错误,不确定+1
的需要,可能需要对索引进行一些微调…(:
if all(number % primes[i] != 0 for i in range(min(max_useful_index+1,len(primes)) ):
另一种可能性(可能更容易理解(是使用itertools.takewhile
,这样当达到极限时迭代就会耗尽:
if all(number % getal for getal in itertools.takewhile(lambda x: x <= sqr_numberprimes, primes)):