如何在 Python 中将列表作为函数的输入传递
Posted
技术标签:
【中文标题】如何在 Python 中将列表作为函数的输入传递【英文标题】:How to pass a list as an input of a function in Python 【发布时间】:2016-05-09 07:39:30 【问题描述】:我正在使用 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]
的地方。
我做错了什么?
【问题讨论】:
1.不要设置可变的默认参数。 2.你只能return
一次。
那么我怎样才能返回一个数组作为输出。你能给我任何想法吗?谢谢
将 return 带出 for 循环。
@MaSH 请不要推荐这样的不良做法。这里没有理由使用全局变量。
根据您的 cmets,这里的答案似乎已经解决了这个问题。 SO 文化encourages you 将已解决您的问题的答案标记为已接受的答案。但是,这不是强制性的。
【参考方案1】:
您应该在 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])
【讨论】:
Append 是一个你不想在这里覆盖的函数。【参考方案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])
返回一个可迭代对象,这非常方便,但如果您需要返回一个列表,只需将整个语句包装在list()
中。
【讨论】:
【参考方案3】:您可能有兴趣使用yield
def square(x):
for y in x:
yield math.pow(y, 2.0)
这样你就可以打电话了
for sq in square(x):
...
它不会一次生成整个正方形列表,而是每次迭代一个元素,或者使用list(square(x))
按需获取完整列表。
【讨论】:
【参考方案4】:为什么不完全回避这个问题?
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
【讨论】:
这并不能真正告诉 OP 他们哪里出了问题,而只是如何对数组求平方 @ShaneQful:请再看看。 抱歉,我上面的初步评论是基于您最初的简洁回答。投赞成票:)【参考方案5】:您当前在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]
【讨论】:
作为一个习惯于基于大括号而不是基于缩进的编程的人,我必须说,单个选项卡更改函数返回的位置是我觉得非常不直观的事情。 但是即使你使用了大括号,你仍然会缩进你的代码,不是吗?【参考方案6】:您的代码在任何地方都没有意义。最后的语法错误缺少打印的右括号,在 for 循环中返回调用意味着它只执行一次,并且 result.append 是一个函数而不是构造函数 sp 正确的调用是
result.append(math.pow(y,2))
唯一不成问题的是传递您的问题列表,如果您这样做,该函数将接收整个列表
def f(a):
print a
f([1,2,3])
出来
[1,2,3,]
【讨论】:
【参考方案7】:我们甚至使用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]
【讨论】:
嗯,例如,它可以被看作是初始值。也许 OP 打算square([1,2,3],[100,200,300])
返回 [100,200,300,1,4,9]
。以上是关于如何在 Python 中将列表作为函数的输入传递的主要内容,如果未能解决你的问题,请参考以下文章
如何在提交函数的reactjs中将表单值作为FormData传递