我正在使用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]
。
我做错了什么?
答案 0 :(得分:18)
为什么不完全支持这个问题呢?
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
答案 1 :(得分:14)
您当前正在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]
答案 2 :(得分:6)
我们甚至使用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]
答案 3 :(得分:3)
你应该在for循环之外返回。否则,它将在第一次迭代后停止。
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])
答案 4 :(得分:3)
您可能对使用yield
def square(x):
for y in x:
yield math.pow(y, 2.0)
你可以这样打电话
for sq in square(x):
...
不会一次生成整个方块列表,而是每次迭代生成一个元素,或者使用list(square(x))
按需获取完整列表。
答案 5 :(得分:2)
这是一个使用功能稍强的风格的有趣机会:
import 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])
返回一个iterable,这非常方便,但如果你需要返回一个列表,只需将整个语句包装在list()
中。
答案 6 :(得分:0)
你的代码在任何地方都没有意义。语法错误最后缺少print的结束括号,在for循环内返回调用意味着它只执行一次,而result.append是一个函数而不是构造函数sp正确的调用是
result.append(math.pow(y,2))
唯一不是问题的是传递列表,这是你的问题,如果你这样做,函数就会收到整个列表
def f(a):
print a
f([1,2,3])
出
[1,2,3,]