Видимо в предпоследней строчке имелось в виду in вместо ==
И более по-питонячи юзать sys.platform вместо os.name.
Да, точно. Насчет второго - пояснишь? Я, вот, например, в данном случае сомневаюсь.
os - модуль работы с ОС. sys - модуль работы с python-платформой. И чисто формально получается, что sys "ближе". Но это такие уж совсем условности.
По поводу генераторов и списковых выражений:
( i for i in range(100500) )
Получаете генератор. А генераторы очень полезно использовать в цепочках типа:
body = ... # тут у нас например офигенно здоровая страница текста
lines = (line for line in body.splitlines())
first_words = (line.split(' ')[0] for line in lines)
triple_codes = (word for first_words if len(word) == 3 and word[0].isdigit())
for code in triple_codes:
print code
Вот мы взяли, например, какой-то лог. И вывели трехзначные кода, начинающиеся с цифры, которые встречаются вначале каждой линии.
Тут профита ровно два: код хорошо читается и каждый из генераторов логически отделен от остальных. А во-вторых, всё произойдет в один прогон. Памяти потребуется не стопицот метров, а килобайт отсилы.
[ i for i in range(100500) ]
Получите список. Если в предыдущем примере круглые скобочки поменять на квадратные, то на больших данных офигеете.
Но при этом всё равно полезен, когда вы знаете, что вам нужен именно список. А использовать генераторы, а в конце писать list(some_generator) - некрасиво....
{ i for i in range(100500) }
Получите множество. Тип
set. Множества прекрасны, кто не верит, почитайте. Практических применений кучи, только надо не боятся :)
word_list1 = ... # текст со словами один
word_list2 = ... # текст со словами второй
set1 = { word for i in word_list1}
set2 = { word for i in word_list2}
print set1 & set2 # выведет слова находящиеся в обоих списках
print set1 - set2 # выведет слова находящиеся в первом списке, но нет во втором.
Ну и так далее... Ещё, если у вас большой список и аналогичное множество, то конечно же
el in list будет медленнее чем
el in set
Добавлю, что чтобы работала магия множеств с вашими классами, достаточно определить в них методы __eq__ и __hash__. Первый для сопоставления элементов, второй для уникального ключа в множестве (тут я коряво сказал конечно...).
{k:v for ... in ..}
Просто словарь...
Внимание! Синтаксический сахар для словарей и множеств, появился только в 2.7, в версиях ниже будете получать синтаксическую ошибку