我在Python中编写了一个非常简单的函数,它打印出特定序列中的所有素数。
它工作正常,但它给我的结果中有太多的括号/括号。我想把结果作为一个输出,只有一个包含所有数字的列表,而不是很多输出,每个包含一个数字。
以下是代码:
def prime_list(X, Y):
Z = 0
while X <= Y:
if is_prime(X):
Z = Z, X
X = X + 1
print (Z)
代码中使用的函数is_prime()
只返回True
(如果数字是素数)和False
(如果不是)。
基本上,对于每个循环,它会检查X
是否为素数。如果是,则X
将添加到名为Z
的列表中。虽然,当它这样做时,它还会在列表中添加不必要的括号/括号。这是结果,使用序列1-100:
>>> prime_list(1,100)
(((((((((((((((((((((((((0, 2), 3), 5), 7), 11), 13), 17), 19), 23), 29), 31), 37), 41), 43), 47), 53), 59), 61), 67), 71), 73), 79), 83), 89), 97)
正如您所看到的,括号/圆括号太多了。
我怎样才能重写代码,所以它不会制作这些代码?
答案 0 :(得分:5)
只需附加到列表而不是嵌套元组:
def prime_list(X, Y):
Z = []
while X <= Y:
if is_prime(X):
Z.append(X)
X = X + 1
return Z
答案 1 :(得分:3)
不是一个直接的答案,但这是一个更清洁,更短的方式:
def prime_list(X, Y):
return [ x for x in range(X, Y+1) if is_prime(x) ]
答案 2 :(得分:0)
您还可以连接元组(在附加到Z
时注意尾随逗号):
def prime_list(X, Y):
Z = ()
while X <= Y:
if is_prime(X):
Z += X,
X = X + 1
print (Z)
不确定哪个更有效:附加到列表或连接元组......
答案 3 :(得分:0)
在“z = z,x”行中,你所做的是为z分配一个包含z和x的列表。在第一次之后,当您到达此处时,z始终是一个列表,因此您将获得一个包含旧列表和整数的新列表。所以,在开始时z = 0,然后是0,1下一个,然后它变成椭圆形...下一次,它变为(0,1),2;上一个列表(旧z)和新x。下次,你得到((0,1),2),3等等。
如果使用z.append(x),它会在列表中添加一个附加项,而不是每次都创建一个新的2元素列表。使用z.append(x),最后,你会得到(0,1,2,3,...),这更接近你的想象。