如何在 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 中将列表作为函数的输入传递的主要内容,如果未能解决你的问题,请参考以下文章

如何在python中将字典项作为函数参数传递? [复制]

如何在 SWIG/Python 中将结构列表传递给 C

在 PHP 中将数组作为参数而不是数组传递

如何在提交函数的reactjs中将表单值作为FormData传递

如何在 pthread_create() 函数中将矩阵作为参数传递?

如何在用户定义的函数中将数据库列作为参数传递?