Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
0 / 0 / 0
Регистрация: 07.06.2018
Сообщений: 28
1

NoneType в генераторе списков

16.07.2019, 20:05. Показов 2112. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Почему в таком виде получаю ошибку "TypeError: unsupported operand type(s) for +: 'int' and 'NoneType'"?
Вернее я понимаю что sum() не складывает объекты разных типов и None + None тоже, вопрос почему в отдельной строке от print() работает, а в одну строку нет?

Python
1
2
l = []
print(sum([l.append(i) for i in range(999) if i % 3 == 0 or i % 5 == 0]))
А так все работает?
Python
1
2
3
l = []
[l.append(i) for i in range(999) if i % 3 == 0 or i % 5 == 0]
print(sum(l))
В первом случае получаю большой список с объектами типа None, если не использовать ф-цию sum()
Миниатюры
NoneType в генераторе списков  
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.07.2019, 20:05
Ответы с готовыми решениями:

Ошибка считывание данных в генераторе списков
Столкнулся с немного не понятным случаем: При считывании данных в данном случае, все работает...

Ошибка в Генераторе
Только сейчас заметил , генератор не генерирует слова вернее не все слова, import itertools ...

Ошибка в генераторе
# Первый Вариант def get_infinite_square_generator(): global i i = 1 while True: ...

Глюк в генераторе СЧ
Работаю с программой, ищущей глобальный минимум среди миллионов минимумов локальных. Программа...

ПСП генераторе в Simulink
Добрый вечер! Хочу задать вопрос по поводу генераторов ПСП в матлабе симулинк.:-[ Я построила...

2
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
16.07.2019, 20:10 2
Метод списка append возвращает None.
Python
1
print(sum(i for i in range(999) if i % 3 == 0 or i % 5 == 0))
0
1728 / 968 / 199
Регистрация: 22.02.2018
Сообщений: 2,694
Записей в блоге: 6
17.07.2019, 09:54 3
Лучший ответ Сообщение было отмечено Александр_Ч как решение

Решение

Александр_Ч, Мне кажется Вы не совсем понимаете, как работает конструкция
Python
1
[l.append(i) for i in range(999) if i % 3 == 0 or i % 5 == 0]
Она возвращает не список l, а список, который формируется следующим образом.
На каждом шаге цикла for вычисляется выражение перед for, в данном случае это
Python
1
l.append(i)
и полученное значение заносится в формируемый этой конструкцией список (не список l).
То есть на каждом шаге метод l.append(i) добавляет в список l число i, а в список формируемый конструкцией то, что возвращает метод l.append(i), то есть None
Python
1
2
3
4
5
6
7
8
9
>>> l = []
>>> l.append(3)
>>> l = []
>>> x = l.append(3)
>>> l
[3]
>>> x
>>> print(x)
None
Поэтому в результате, после завершения цикла мы в списке l получаем множество чисел, и параллельно в списке , формируемом конструкцией
Python
1
[l.append(i) for i in range(999) if i % 3 == 0 or i % 5 == 0]
список, элементами которого являются None. Поэтому в первом случае питон и ругается, что не может просумировать список, состоящий из множества None.
А во втором случае суммируются числа в списке l и потому выдается правильный результат.

Добавлено через 4 минуты
Александр_Ч, Как правильно написать код, Вам показал 0x10, То есть список l и метод append здесь лишние и только вызывают ошибку.

Добавлено через 42 минуты
Александр_Ч, И еще. Запись
Python
1
[l.append(i) for i in range(999) if i % 3 == 0 or i % 5 == 0]
формирует список, а не генератор списка.
В переводе книги Лутца такую конструкцию называют генератором списка, но в оригинале на английском, Лутц это называет не генератором, а другим словом.
Я для себя решил такую конструкцию называть "список формируемый циклом for ".
Я не знаю, Вы уже изучили различие между между списком и генератором списка? В отличие от списка
Python
1
[l.append(i) for i in range(999) if i % 3 == 0 or i % 5 == 0]
выражение в круглых скобках
Python
1
(i for i in range(999) if i % 3 == 0 or i % 5 == 0)
формирует генератор списка.
Python
1
2
3
4
5
L = [i for i in range(9) if i % 3 == 0 or i % 5 == 0]  # список
print(L)
 
G = (i for i in range(9) if i % 3 == 0 or i % 5 == 0)  # генератор списка
print(G)
Вывод:
Python
1
2
[0, 3, 5, 6]
<generator object <genexpr> at 0x000001D85EFBC750>
Для функции sum все равно, что Вы даете в качестве аргумента, список или генератор списка, результат будет тот же.
Python
1
2
3
print(sum((i for i in range(999) if i % 3 == 0 or i % 5 == 0)))
 
print(sum([i for i in range(999) if i % 3 == 0 or i % 5 == 0]))
Вывод:
Python
1
2
232169
232169
Добавлено через 8 минут
Александр_Ч, Вы можете заметить, что у 0x10, и у меня в синтаксисе
Python
1
print(sum(i for i in range(999) if i % 3 == 0 or i % 5 == 0))
Python
1
print(sum((i for i in range(999) if i % 3 == 0 or i % 5 == 0)))
разное количество круглых скобок. Это особенность питона, если не может быть разночтения, то питон сам добавляет круглые скобки для выражения, что он и делает в варианте у 0x10
Кстати в варианте
Python
1
print(sum([i for i in range(999) if i % 3 == 0 or i % 5 == 0]))
убирать круглые скобки нельзя, тогда не вызовется функция sum. А если уберете квадратные скобки, то просто получите вариант с генератором списка.
2
17.07.2019, 09:54
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.07.2019, 09:54
Помогаю со студенческими работами здесь

Обьем текста в Qr генераторе
Почему то влазит около 100 символов, иначе выбивает ошибку. Как Можно менять размеры самого Qr...

Распараллеливание while в BSS-генераторе
Здравствуйте, дорогие форумчани! Третий день мучаюсь над проблемой распараллеливания while...

ошибка в генераторе эмбакадеро
Хочу инициализировать IBDataSet1 программно вот код DataModule1-&gt;IBDataSet1-&gt;SelectSQL-&gt;Clear();...

НЧ звон в ВЧ генераторе на 74HC00 с кварцем
Доброго времени суток всем. В одной схеме понадобился мне генератор на 10 МГц, который вроде бы...

Как разрядится емкость в генераторе?
Добрый день, вот обстоит вопрос в разборе полетов по генератору, подскажите в какой...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru