Проблема с ошибкой '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 шт):
вы считаете сумму по строкам, а не числам - ведь
inputвыводит строки:avg = sum(num_list) / len(num_list)вы каждый этап цикла создаете пустой список, так что у вас в нем максимум 1 значение
num_list = [] num_list = num_list.append(numb)после добавления значения в список вы переписываете список через присваивание, в итоге у вас уже не список, а
None, а это как раз не является итерируемым объектом
поэтому запихивайте в список числа, причем запихивайте правильно:
num_list.append(int(numb))
и вынесите инициализацию списка num_list из цикла while
P.S.
предположу, что после окончания ввода, но до выхода из программы можно опять начать накапливать числа - а значит список num_list надо очистить
P.P.S.
если пользователь сразу введет 'end', то программа рухнет из-за перевода строки в число - этот момент тоже надо учесть, т.е. добавление в список должно сидеть в альтернативной ветке условия на 'end'
Ваш код содержит несколько ошибок.
num_listстирается в цикле. Данные не накапливаются.В
num_listдобавляются строки, не числа. Суммировать такой список не имеет смысла.Оператор
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