对于循环,SyntaxError:无法分配给函数调用

时间:2017-08-10 13:50:46

标签: python for-loop list-comprehension primes nested-loops

我正在练习列表推导和嵌套列表推导。作为我练习的一部分,我写出了等效的循环。这个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,我能够解决变量和语法问题,并对如何修复this thread中的all()语句进行了一些提示

此代码将正确返回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)

2 个答案:

答案 0 :(得分:0)

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

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))

答案 1 :(得分:0)

  

此代码将正确返回平方素数列表   1,1000:

除了它返回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]]

大约一百万,此代码将返回比基于部门的解决方案快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))

这个列表理解。但是,错误的方法又回过头来看看基于筛选的实现。