如何在Python中将列表作为函数的输入?

12

我正在使用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]

我做错了什么?


14
  1. 不要使用可变的默认参数。
  2. 函数只能有一个 return 语句。
- jonrsharpe
1
那么我如何将一个数组作为输出返回呢?你有什么想法吗?谢谢。 - Arpan Das
3
将返回值从for循环中带出。 - Daniel Roseman
10
请不要像这样推荐不好的做法,@MaSH。在这里使用全局变量没有任何理由。 - Daniel Roseman
2
根据您的评论,这里的答案似乎已经解决了问题。SO文化鼓励您将解决您问题的答案标记为被接受的答案。然而,这并非强制性的。 - Reti43
显示剩余3条评论
7个回答

21

为什么不完全避开这个问题呢?

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

3
这个回答并没有告诉原帖作者他们错在哪里,只是简单地说明如何对数组进行平方运算。 - ShaneQful
1
@ShaneQful:请再仔细看一下。 - Hugh Bothwell
抱歉,我的上面的评论是基于你最初简洁的回答。给你点赞 :) - ShaneQful
这是唯一一个提到result.append错误赋值的答案,而这在所有情况下都是错误的。 - Christoph Rackwitz

15

您目前在 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]

作为一个习惯于基于大括号的编程者,而不是基于缩进的编程者,我必须说,单个制表符改变函数返回位置是一件非常不直观的事情。 - Pharap
但是即使你使用大括号,你仍然需要缩进你的代码,不是吗? - Matthias

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]

嗯,它可以被视为初始值,例如。也许OP的意图是让 square([1,2,3],[100,200,300]) 返回 [100,200,300,1,4,9] - muru

3
这是一个有趣的机会,可以使用稍微更为实用的风格:
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
你应该在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 是一个你不想在这里覆盖的函数。 - Cees Timmerman

3

您可能有兴趣使用 yield

def square(x):
    for y in x:
        yield math.pow(y, 2.0)

那样一来,你可以通过调用函数来实现。
for sq in square(x):
    ...

不要一次性生成完整的平方列表,而是在每次迭代中生成一个元素,或使用list(square(x))按需获取完整列表。

0

你的代码在任何地方都没有意义。语法错误在结尾缺少了打印的闭合括号,for循环内部的return调用意味着它只执行一次,并且result.append是一个函数而不是构造函数,因此正确的调用方式是

result.append(math.pow(y,2))

唯一不成问题的是传递列表,这就是你的问题,如果你这样做,函数将接收整个列表。

def f(a):
    print a
f([1,2,3])

输出

[1,2,3,]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接