Список не возвращает правильные значения в качестве вывода - PullRequest
2 голосов
/ 07 марта 2020

Я пытаюсь написать небольшую функцию (как упражнение). Эта функция принимает список значений и возвращает значения, которые являются нечетными числами. Я получил функцию, которая дает мне правильный ответ с помощью функции 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, но я просто не могу заставить его работать.

Что я делаю не так?

Ответы [ 2 ]

2 голосов
/ 07 марта 2020

try:

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] в качестве текущего итератора, мы будем изменять наш список во время итерации; К счастью, каждый итератор равен по значению элементу списка, который он мутирует. Вот пример, чтобы проиллюстрировать, что происходит. Это легко увидеть, когда мы не обновляем 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]
1 голос
/ 07 марта 2020

Вам просто нужно return list1[:i] вместо того, чтобы возвращать все list1. Демонстрация с этим:

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

С вашим необычным, но правильным for list1[i] in list1 и соответствующим обновлением i вы перемещаете все нечетные числа в начало списка и считаете их с помощью i. Осталось только вернуть эту переднюю часть.

Либо удалите ненужную заднюю часть с помощью del list1[i:], прежде чем выполнить return list1.

.
...