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))
而这个是一个列表理解。但是同样,错误的方法所以回去看看基于筛子的实现。
我正在练习列表理解和嵌套列表理解。作为我练习的一部分,我正在写出等价的 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))
而这个是一个列表理解。但是同样,错误的方法所以回去看看基于筛子的实现。