Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 列表未将正确的值作为输出返回_Python_List_Function_Return - Fatal编程技术网

Python 列表未将正确的值作为输出返回

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])

我正在尝试写一个小函数(作为练习)。此函数获取值列表并返回奇数值。我已经用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语句的不同变体,但似乎无法让它工作


我做错了什么?

您只需要
返回列表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
跟踪找到了多少元素(这也是下一个候选元素的索引)。