For loop, SyntaxError: can't assign to function call

For loop, SyntaxError: can't assign to function call

我正在练习列表理解和嵌套列表理解。作为我练习的一部分,我正在写出等价的 for 循环。这个 for 循环我做错了,我相信这是因为我试图在函数调用中分配一个值而不是变量。我收到的错误是:

File "<stdin>", line 4
SyntaxError: can't assign to function call

我为这个循环编写的代码是:

import math

def squared_primes():
    list = []
    for x in range(1,1000000):
        for q in range(2,math.sqrt(x)+1):
            if all(x % q != 0):
                list.append(x**2)
    print(list)

此函数试图创建一个完全平方列表,其根是 1 到 1000000 范围内的素数。

谁能帮我理解我的循环语法到底在哪里崩溃了?另外,我可以将其作为嵌套列表理解来执行吗?显然我的列表理解正在崩溃,因为我无法正确使用 for 循环语法...


解决方案:感谢用户@Evan,我能够修复变量和语法问题,并从中获得了一些关于如何修复 all() 语句的提示this thread.

此代码将正确地 return 1,1000 的平方素数列表:

def squared_primes():
    list1 = []
    for x in range(1,1000):
        if all(x%q !=0 for q in range(2,int(math.sqrt(x)+1))):
            list1.append(x**2)
    print(list1)

这很简洁。列表理解是光荣的。

def squared_primes(maximum):
    return( [ x**2 for x in range(0,maximum) if all( x % i for i in range(2, x) ) ] )

print(squared_primes(1000000))

This code will properly return a list of the squared primes from 1,1000:

除了它 returns 1 作为列表的第一个元素并且 1 的平方根不是质数。让我们修复该故障并将代码重写为正确的函数:

from math import sqrt

def squared_primes(maximum):
    primes = []

    for number in range(2, maximum):
        if all(number % divisor != 0 for divisor in range(2, int(sqrt(number)) + 1)):
            primes.append(number ** 2)
    return primes

print(squared_primes(1000))

顺便说一句,这个不是列表理解:

all(x % q !=0 for q in range(2, int(math.sqrt(x) + 1)))

它是一个 生成器! 如果你想要一个列表理解,你会这样做:

all([x % q !=0 for q in range(2, int(math.sqrt(x) + 1))])

但坚持使用生成器,因为它可以轻松地使复合材料失败。

当我们要求一个包含 1000000(百万)或更多方块的列表时,您的代码将开始陷入困境。那时我们需要一个更有效的基于筛选的算法,例如:

def squared_primes(maximum):
    sieve = [True] * maximum

    if maximum > 0:
        sieve[0] = False  # zero is not a prime
        if maximum > 1:
            sieve[1] = False # one is not a prime

    for index in range(2, int(maximum ** 0.5) + 1):
        if sieve[index]:
            prime = index
            for multiple in range(prime + prime, maximum, prime):
                sieve[multiple] = False

    return [index * index for index in range(maximum) if sieve[index]]

在大约一百万时,此代码的结果 return 比基于除法的解决方案快 20 倍。

@Evan 的 精明理解 ,因为它缺少您的 math.sqrt() 优化,将比任何一个慢几个数量级(我还在等待它完成一百万)并以两个不正确的结果开始列表。我们可以通过以下方式将其与您修改后的代码同步:

from math import sqrt

def squared_primes(maximum):
    return [number ** 2 for number in range(2, maximum) if all(number % divisor for divisor in range(2, int(sqrt(number)) + 1))]

print(squared_primes(1000))

而这个一个列表理解。但是同样,错误的方法所以回去看看基于筛子的实现。