我正在使用Python,有一个函数需要以列表作为参数。例如,我正在使用以下语法:
def square(x,result= []):
for y in x:
result.append=math.pow(y,2.0)
return result
print(square([1,2,3]))
输出结果仅为[1]
,但我应该得到的是[1,4,9]
。
我做错了什么?
为什么不完全避开这个问题呢?
def square(vals):
return [v*v for v in vals]
编辑:如多位读者所指出的那样,你的第一个问题是短路了 for
循环。你的 return
应该在循环后面,而不是在循环中。
下一个问题是你对 list.append
的使用 - 你需要调用它,而不是赋值给它,即 result.append(y*y)
。相反,result.append = y*y
会将方法覆盖为数值,可能会在下次调用时引发错误。
一旦你纠正了这个问题,如果你反复调用函数,你会发现另一个不太明显的错误发生了:
print(square([1,2,3]) # => [1, 4, 9]
print(square([1,2,3]) # => [1, 4, 9, 1, 4, 9]
由于你将一个可变对象(列表)作为默认值传递,所有后续对该默认项的使用都指向同一个原始列表。
相反,尝试使用
def square(vals, result=None):
if result is None:
result = []
result.extend(v*v for v in vals)
return result
您目前在 for
循环的第一次迭代中返回函数值。因此,for
循环的第二次和第三次迭代都没有执行。您需要将 return
语句移出循环,如下所示:
import math
def square(x):
result = []
for y in x:
result.append(math.pow(y,2.0))
return result
print(square([1,2,3]))
输出
[1.0, 4.0, 9.0]
result
了?您可以使用列表推导式生成结果,然后将其返回。我不确定为什么您将 result
作为变量传递到函数中,因为它没有被使用。return result
意味着函数在第一次迭代时返回该值,因此它只返回列表中第一个数字的平方。import math
def square(x):
return [math.pow(y, 2) for y in x]
>>> print(square([1,2,3]))
[1.0, 4.0, 9.0]
square([1,2,3],[100,200,300])
返回 [100,200,300,1,4,9]
。 - muruimport math
map(lambda x:(math.pow(x,2)), [1,2,3])
map
函数,它接受一个列表和一个函数作为参数,并返回一个新的列表,其中该函数已经分别应用于列表的每个成员。 在这种情况下,它将math.pow(x, 2)
函数应用于列表的每个成员,其中每个数字是x。map(lambda x:(math.pow(x,2)), [1,2,3])
返回一个可迭代对象,非常方便,但如果你需要得到一个列表,只需在整个语句外围加上list()
即可。def square(x):
result=[]
for y in x:
result.append(math.pow(y,2.0)) # add to list after calculation
return result
print(square([1,2,3])
您可能有兴趣使用 yield
。
def square(x):
for y in x:
yield math.pow(y, 2.0)
for sq in square(x):
...
list(square(x))
按需获取完整列表。你的代码在任何地方都没有意义。语法错误在结尾缺少了打印的闭合括号,for循环内部的return调用意味着它只执行一次,并且result.append是一个函数而不是构造函数,因此正确的调用方式是
result.append(math.pow(y,2))
唯一不成问题的是传递列表,这就是你的问题,如果你这样做,函数将接收整个列表。
def f(a):
print a
f([1,2,3])
输出
[1,2,3,]
return
语句。