Python 列表未将正确的值作为输出返回
我正在尝试写一个小函数(作为练习)。此函数获取值列表并返回奇数值。我已经用print()函数得到了正确答案的函数,但是我不能用return语句得到正确答案Python 列表未将正确的值作为输出返回,python,list,function,return,Python,List,Function,Return,我正在尝试写一个小函数(作为练习)。此函数获取值列表并返回奇数值。我已经用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])
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语句的不同变体,但似乎无法让它工作
我做错了什么?您只需要
返回列表1[:I]
而不是返回整个列表1
。演示一下:
>>> odd_nr([1,2,3,4,5,6])
1
3
5
[1, 3, 5]
使用列表1中列表1[i]的异常但正确的,以及相应的i
更新,您将所有奇数移到列表的前面,并使用i
进行计数。剩下要做的就是只返回前面的部分
或者,在执行返回列表1
之前,使用删除列表1[i:][/code>删除不需要的背面部分,然后尝试:
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
语句不是返回值。这意味着打印不是函数返回的东西,它是一种副作用,一扇侧门,对我们人类来说,主要是看到的
要返回仅包含奇数的列表,需要在遍历原始输入列表时将它们收集到另一个列表中
完成后,返回收集所有奇数的列表。希望这有帮助
我还对您的代码进行了一点更新,针对列表1中的列表1[I],尽管它可以工作,但很难理解,而且它的原因是错误的,请参见下文。您只需对列表1中的数字执行,也不用担心增加任何计数器(i
)
关于列表中列表1[i]的为什么有效的解释
:
这很有趣。通过选择list1[i]
作为当前迭代对象,我们将在迭代时改变列表;幸运的是,每个迭代对象的值与它所变异的列表元素的值相等。这里有一个例子来说明发生了什么。当我们不更新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]
您只是返回原始列表而没有修改。@juanpa.arrivillaga-Nah,他们正在修改它,您可以在输出中看到它。@HeapOverflow哦,天哪,是的,列表1的[i]在列表1中
。这读起来像是while
循环和for
循环的奇怪混合体,避免语法错误更多的是出于偶然而不是出于意图。@HeapOverflow,是的,但请看我添加的解释。是的,但我不会称之为“幸运”。如果你不删除i+=1
,这是一个正确的算法,只是返回了太多(见我的答案)。我确实相信这是一个巧合,至少在OP的意图方面是如此,我自己也不清楚它为什么起作用。如果标准只是工作,二进制代码就可以了。编程语言是为人类编写和阅读的,因此让它们立即变得显而易见是非常重要的。我会继续说,即使这种方法有效,但对于任何现实世界的用例来说,它都是一种糟糕的方法。最后一次,我多次编写了该算法。在我看来这是故意的。您只需要知道,i
跟踪找到了多少元素(这也是下一个候选元素的索引)。