【问题标题】:List not returning the proper values as an output列表未返回正确的值作为输出
【发布时间】:2020-03-07 00:47:59
【问题描述】:

我正在尝试编写一个小函数(作为练习)。此函数接受一个值列表并返回奇数值。我已经获得了使用 print() 函数给我正确答案的函数,但是我无法对 return 语句做同样的事情。

def odd_nr(list1):
    i = 0
    for list1[i] in list1:
        if list1[i] % 2 != 0:
            print(list1[i])
            i += 1
    return list1

odd_nr([1,2,3,4,5,6])

输出是:

1
3
5
[1, 3, 5, 6, 5, 6]

我无法弄清楚为什么 return 语句会给出这个输出。我尝试了不同的缩进,我尝试了 return 语句的不同变体,但我似乎无法让它工作。

我做错了什么?

【问题讨论】:

  • 您只是返回原始列表而没有修改。
  • @juanpa.arrivillaga 不,他们正在修改它,你可以在输出中看到它。
  • @HeapOverflow 哦,天哪,是的,for list1[i] in list1
  • 这读起来像是while 循环和for 循环的奇怪混合体,避免语法错误更多是出于偶然而非有意。

标签: python list function return


【解决方案1】:

尝试:

def odd_nr(list1):
    results = []
    for number in list1:
        if number % 2 != 0:
            print(number)
            results.append(number)
    return results

odd_nr([1,2,3,4,5,6])

进一步说明

任何函数都可以接受一些东西并返回一些东西。这东西也可以什么都不是,None

你的函数接受一个列表,并返回一个列表,但它返回的列表与它正在接受的列表相同。

print 语句不是返回值。这意味着 print 不是函数返回的东西,它是一个副作用,一个侧门,主要是供我们人类看到的。

要返回仅包含奇数的列表,您需要在迭代原始输入列表时将它们收集到另一个列表中。

然后,一旦你完成,return 收集了所有奇数的列表。希望这会有所帮助。

我还稍微更新了您的代码,for list1[i] in list1,尽管它可以工作,但很难理解,而且这样做是出于错误的原因,见下文。您可以简单地做for number in list1,也不必担心增加任何计数器(在您的情况下为i)。

解释为什么for list1[i] in list 有效

这很有趣。通过选择list1[i] 作为当前的迭代对象,我们将在迭代时改变我们的列表;幸运的是,每个 iteratee 的值与它正在变异的列表元素的值是相等的。这是一个例子来说明正在发生的事情。不更新的时候很容易看到i

list1= [1,2,3,4]
i=0
for list1[i] in list1:
    print(list1[i])
print(list1)

输出:

1
2
3
4
[4, 2, 3, 4]

【讨论】:

  • @HeapOverflow,是的,但请参阅我添加的解释。
  • 是的,但我不会称之为“幸运”。如果你不删除i += 1,这是一个正确的算法,除了返回太多(见我的回答)。
  • 我相信至少就 OP 的意图而言,这是一个巧合,而我自己对它为什么起作用的困惑也是如此。如果标准是正常工作,二进制代码就可以了。编程语言是为人类编写和阅读的,因此让它们立即显而易见是非常重要的。我会继续说,即使这种方法有效,但对于任何现实世界的用例来说,它都是一种糟糕的方法。
  • 嗯,对我来说这很明显:-)。再说一次,我多次编写了该算法,最后一次是yesterday。在我看来,它确实是故意的。您只需要意识到i 会跟踪找到了多少元素(这也是下一个候选者的索引)。
【解决方案2】:

您只需要return list1[:i] 而不是返回整个list1。演示:

>>> odd_nr([1,2,3,4,5,6])
1
3
5
[1, 3, 5]

通过您不寻常但正确的for list1[i] in list1i 的相应更新,您将所有奇数移到列表的前面并用i 计数。剩下要做的就是只返回前面的部分。

或者,使用del list1[i:] 删除不需要的后部,然后再使用return list1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-02
    • 2020-01-26
    • 1970-01-01
    相关资源
    最近更新 更多