Проблема с ошибкой 'NoneType' object is not iterable в цикле while

Всех приветствую. Задача - пользователь вводит числа сколько угодно раз, при этом 0 - осуществляет выход из программы. После окончания ввода необходимо просчитать и вывести среднее значение введенных чисел.

numb = input('Введите любое целое цисло (end для окончания ввода, 0 для выхода): ')

while numb != '0':
    num_list = []
    num_list = num_list.append(numb)
    
    if numb == 'end':
        avg = ()
        avg = sum(num_list) / len(num_list)
        print(f'Среднее значение введенных чисел: {avg}') 
        break
    numb = input('Введите любое целое цисло (end для окончания ввода, 0 для выхода): ')

При инициализации кода выдается ошибка 'NoneType' object is not iterable. Не понимаю, почему получается значение None и откуда она выскакивает. Заранее спасибо за помощь.


Ответы (2 шт):

Автор решения: Zhihar
  1. вы считаете сумму по строкам, а не числам - ведь input выводит строки:

     avg = sum(num_list) / len(num_list)
    
  2. вы каждый этап цикла создаете пустой список, так что у вас в нем максимум 1 значение

     num_list = []
     num_list = num_list.append(numb)
    
  3. после добавления значения в список вы переписываете список через присваивание, в итоге у вас уже не список, а None, а это как раз не является итерируемым объектом

поэтому запихивайте в список числа, причем запихивайте правильно:

num_list.append(int(numb))

и вынесите инициализацию списка num_list из цикла while

P.S.

предположу, что после окончания ввода, но до выхода из программы можно опять начать накапливать числа - а значит список num_list надо очистить

P.P.S.

если пользователь сразу введет 'end', то программа рухнет из-за перевода строки в число - этот момент тоже надо учесть, т.е. добавление в список должно сидеть в альтернативной ветке условия на 'end'

→ Ссылка
Автор решения: Stanislav Volodarskiy

Ваш код содержит несколько ошибок.

  1. num_list стирается в цикле. Данные не накапливаются.

  2. В num_list добавляются строки, не числа. Суммировать такой список не имеет смысла.

  3. Оператор num_list = num_list.append(numb) замещает список на значение None. Распространённая ошибка.

Если поправить эти ошибки, получится такой код. У него только один недостаток - он ломается если сразу ввести end:

numb = input('Введите любое целое цисло (end для окончания ввода, 0 для выхода): ')

num_list = []
while numb != '0':
    
    if numb == 'end':
        avg = ()
        avg = sum(num_list) / len(num_list)
        print(f'Среднее значение введенных чисел: {avg}') 
        break

    num_list.append(int(numb))
    numb = input('Введите любое целое цисло (end для окончания ввода, 0 для выхода): ')

Но и этот код грешен дублированием. Устраним его:

num_list = []
while True:
    numb = input('Введите любое целое цисло (end для окончания ввода, 0 для выхода): ')
    if numb == '0':
        break

    if numb == 'end':
        avg = ()
        avg = sum(num_list) / len(num_list)
        print(f'Среднее значение введенных чисел: {avg}') 
        break

    num_list.append(int(numb))

Нужет ли список значений? Нет. Нужны только его сумма и длина. Уберем список:

sum_ = 0
len_ = 0
while True:
    numb = input('Введите любое целое цисло (end для окончания ввода, 0 для выхода): ')
    if numb == '0':
        break

    if numb == 'end':
        avg = sum_ / len_
        print(f'Среднее значение введенных чисел: {avg}') 
        break

    sum_ += int(numb)
    len_ += 1

Остались опечатки, другой порядок операторов, лишние переменные. Можно идти сдавать:

sum_ = 0
len_ = 0
while True:
    n = input('Введите любое целое число (end для окончания ввода, 0 для выхода): ')
    if n == 'end':
        print(f'Среднее значение введенных чисел: {sum_ / len_}') 
        break

    if n == '0':
        break

    sum_ += int(n)
    len_ += 1

Сдавать рано, поправим ошибку когда пользователь сразу вводит end. Вот теперь комар носа не подточит:

sum_ = 0
len_ = 0
while True:
    n = input('Введите любое целое число (end для окончания ввода, 0 для выхода): ')
    if n == 'end':
        if len_ == 0:
            print('Вы не ввели ни одного числа')
        else:
            print(f'Среднее значение введенных чисел: {sum_ / len_}') 
        break

    if n == '0':
        break

    sum_ += int(n)
    len_ += 1
→ Ссылка