【问题标题】:function does't return a list as indented, but returns only one listelement instead函数不返回缩进的列表,而是只返回一个列表元素
【发布时间】:2022-01-15 20:55:59
【问题描述】:

为了练习起见,我正在尝试计算以下数学表达式:

参数中的 x 值应该是一个数字 - 一个 int 或 float 参数中的 y 值应该是一个数字列表。

该函数应该返回一个与参数中的列表 y 长度相同的值列表。

出于某种尴尬的原因,我只设法让函数只返回一个列表元素,它来自函数中两个方程中的第一个。

有问题的代码是:

def f(x ,y):

    list = []

    for i in y:
        if y[i] <= 0:
            list.append(4 * (x ** 3) * y[i] - 2 * x * y[i])
        if y[i] > 0:
            list.append(4 * (x ** 3) * y[i] + 2 * x * y[i])

        return list

x_value = 2
y_values = [1,-2, 3, -7]

print(f(x_value, y_values))

#wanted output: [28, -56, 85, -252]

#actual output: [-56]

我的问题是:

  • 如何让这个函数返回一个包含所有计算的列表?比如像 [28, -56, 85, -252] 而不是当前输出 [-56]

这可能是一个简单的修复,但由于某种原因我被卡住了。

有没有好心人帮我解决这个问题?

【问题讨论】:

  • return 移动到与list = [] 相同的缩进左侧
  • 并且不要使用list作为名称,它是内置类型。
  • @Brown Bear:这是我的第一个想法,但由于某种原因,它给了我一条错误消息,指出索引超出范围。
  • @buran:谢谢,我知道,但这只是为了翻译目的。
  • 强烈强调不要使用list作为变量名list 已经是 python 中内置类型 list 的名称。重用内置的名称来命名其他东西不仅令人困惑,而且还会产生意想不到的副作用。想象一下,如果我通过一项法律,“房子”现在是我自己房子的专有名称。突然之间,每一个使用“房子”这个词的法律合同现在都指的是我的房子。我给自己带来了很多麻烦!在其他编程语言中这不是什么大问题,但是“python 的名称是动态的,没有作用域的”,这意味着重命名会影响一切。

标签: python list function for-loop math


【解决方案1】:

首先,当你有for i in y时,iy中的实际值,而不是索引,所以你不使用y[i],你直接使用i。其次,你应该returnfor i in y循环结束后的最终列表,所以它需要在循环之外。最后,不要使用内置名称(例如list)作为您自己的变量/函数/类名称,因为它会覆盖内置名称。

def f(x ,y):
    L = []

    for i in y:
        if i <= 0:
            L.append(4 * (x ** 3) * i - 2 * x * i)
        if i > 0:
            L.append(4 * (x ** 3) * i + 2 * x * i)

    return L

要将i 用作索引,您需要将循环更改为for i in range(len(y)),并像以前一样使用y[i]

另外,如果你使用numpy,你可以这样解决:

>>> import numpy as np

>>> x_value = 2
>>> y_values = np.array([1,-2, 3, -7])

>>> 4 * x_value**3 * y_values + 2 * x_value * np.where(y_values <= 0, -y_values, y_values)
array([  36,  -56,  108, -196])

【讨论】:

  • 另外,正如 cmets 中的人所指出的,我绝对更喜欢“L”作为空列表的变量名,而不是我的菜鸟选择“list”:-P。
【解决方案2】:

你可以用列表推导简单地做到这一点:

def f(x,y):
    return [4 * (x ** 3) * yy - 2 * x * yy if yy <= 0 
            else 4 * (x ** 3) * yy + 2 * x * yy for yy in y]

def f(x, y)
    return [4 * (x ** 3) * yy + (int(yy > 0) - 0.5) * 4 * x * yy for yy in y]

要阐明给出的最后一个例子可能有点神秘:在两个公式中,两个元素总是相同的:

4 * (x ** 3) * yy

2 * x * yy

在一种情况下,你将它们相加,在另一种情况下,你取差:

因此我们可以将f(x, y) 写为:

def f(x, y):
    lst = []
    for yy in y:
        a, b = 4 * (x ** 3) * yy, 2 * x * yy
        lst.append(a + (1 if yy > 0 else -1) * b
    return lst

虽然有一种情况需要适当的关闭,但也有不重写相同代码/公式的情况。 如果知道bool(yy &gt; 0) 是 1 如果yy &gt; 0 和 0 否则可以更紧凑,所以 2 * (bool(yy &gt; 0) - 0.5) 分别是 1 和 -1:

【讨论】:

  • 谢谢!喜欢列表理解的简短形式和使用!
猜你喜欢
  • 1970-01-01
  • 2022-06-15
  • 2021-11-19
  • 1970-01-01
  • 1970-01-01
  • 2013-04-30
  • 2022-01-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多