代码之家  ›  专栏  ›  技术社区  ›  Hanzy

对于循环,语法错误:无法分配给函数调用[closed]

  •  0
  • Hanzy  · 技术社区  · 7 年前

    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范围内的素数。


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

    该代码将正确返回11000的平方素数列表:

    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 回复  |  直到 6 年前
        1
  •  0
  •   cdlane    7 年前

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

    这段代码的返回速度大约为100万,比基于分区的解决方案快20倍。

    光辉的理解 ,因为它缺少 math.sqrt() 优化,将比任何一个都慢几个数量级(我仍在等待它以100万的价格完成),并以两个不正确的结果开始列表。我们可以通过以下操作将其与您修订的代码在时间上相提并论:

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

    还有这个

        2
  •  0
  •   Evan    7 年前

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