在all中添加第二个if(..,其中包含for循环)



我想在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)):

最新更新