如何在Python

时间:2016-01-31 23:01:57

标签: python arrays list function

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

我做错了什么?

7 个答案:

答案 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,]