Comments 27
Эти «выражения» в Python называются генераторами, надо бы это как-то выделить, и про них уже писали
Вы меня опередили :)
Согласен, что «Однострочные выражения» — не самый изящный перевод, но лучше не придумал и не нагуглил стандартного русского названия.
А генераторы — это немного другое.
А генераторы — это немного другое.
А генераторы — это немного другое.
В русскоязычной литературе, что читал, это называлось генераторы-функции. А то, о чем пост — генераторы списков или выражения-генераторы.
Что касается гугления русского названия — википедия дает ответ. Если в ней найти «List comprehension» (взял из оригинала), и перейти на русскую версию, можно познакомиться с термином «Списковое включение (Абстракция списков)». С данным термином встречаюсь впервые, полагаю, является обобщенным для всех языков.
Убедительно. Исправил. Спасибо)
А еще к оригинальной статье есть отличный комментарий
Вроде как добавили генераторы словарей в Python 3, а потом бэкпортировали во 2 ветку
But be aware that dict comprehensions works only in Python 2.7+.
in Python 2.6 and below you can replace it with:
dict((key, value) for item in list if condition)
Вроде как добавили генераторы словарей в Python 3, а потом бэкпортировали во 2 ветку
Кстати, мне лично нравится название genexp — generator expression.
List comprehensions — списковые выражения (кажется так в перводе Лутца).
Мне не кажется удачным использование слова «генератор», потому что генератора тут нет.
Мне не кажется удачным использование слова «генератор», потому что генератора тут нет.
Вот из Лутца прямо

Вы придираетесь к слову «генератор», в данном случае «генератор списка» — это то, что создает список, не более

Вы придираетесь к слову «генератор», в данном случае «генератор списка» — это то, что создает список, не более
Значит я ошибся с источником этого знания у меня :)
Ну, это только потому что в оригинальном термине нет слова генератор, но в языке, при этом существуют генераторы и они не тоже самое что List comprehensions.
Понятно, что споры о переводе/формулировках ерундовые, но всё же я не удержусь, извините.
Если
это генератор списка.
То как назвать:
Выражение-генератор?
Как-то путано выходит слишком, по моему.
Вы придираетесь к слову «генератор», в данном случае «генератор списка» — это то, что создает список, не более
Ну, это только потому что в оригинальном термине нет слова генератор, но в языке, при этом существуют генераторы и они не тоже самое что List comprehensions.
Понятно, что споры о переводе/формулировках ерундовые, но всё же я не удержусь, извините.
Если
L = [x for x in range(1, 10)]
это генератор списка.
То как назвать:
L = (x for x in range(1, 10))
Выражение-генератор?
Как-то путано выходит слишком, по моему.
Именно выражение-генератор. И ничего путанного. Генератор списка создает список, генератор словаря создает словарь.
А выражение-генератор — оно не сразу создает весь список в памяти, а работает именно как генератор.
Вы поищите по хабру статьи про питон и генераторы, везде используются именно эти термины. Не понимаю, почему такие споры только сейчас возникли
А выражение-генератор — оно не сразу создает весь список в памяти, а работает именно как генератор.
Вы поищите по хабру статьи про питон и генераторы, везде используются именно эти термины. Не понимаю, почему такие споры только сейчас возникли
Генератор списка не возвращает генератор, как и генератор словаря, зато выражение-генератор возвращает генератор.
Нет, это путано.
Ещё раз обращаю внимание на отсутствие слова генератор в оригинальном термине.
И как мне кажется, «списковое выражение» вполне нейтрально и подходит для первода/описания термина гораздо лучше, чем то, что предложили вы.
Нет, это путано.
Ещё раз обращаю внимание на отсутствие слова генератор в оригинальном термине.
И как мне кажется, «списковое выражение» вполне нейтрально и подходит для первода/описания термина гораздо лучше, чем то, что предложили вы.
А я еще раз повторяю, это не я предложил, это принятые русскоязычные термины в Python.
Вот еще одна ссылка в подтверждение, я уже их достаточно привел.
Вот еще одна ссылка в подтверждение, я уже их достаточно привел.
Новичкам было бы еще полезно написать, для какой версии Python данные примеры. В Python 3.4
xrange
нет.Много чего можно также слелать и через многими ненавистную reduce, например, удаление дубликатов:
items = [1,2,3,6,2,1,2,3,4,1,2,3,4]
unique = reduce(lambda stack, item: stack + [item] if not (item in stack) else stack, items, []))
Вот еще, как можно сделать, но работает более медленно
#[i for i in range(1, 11) if i % 2 == 0]
list(filter((lambda x: x % 2 == 0), range(1, 11)))
Послушайте, ну писать туториал до того как вы прочитали docstring с метода это же нехорошо:
[i for i in range(1, 11) if i % 2 == 0] == range(2, 12, 2)
range():
range(stop) -> list of integers
range(start, stop[, step]) -> list of integers
Return a list containing an arithmetic progression of integers.
range(i, j) returns [i, i+1, i+2, ..., j-1]; start (!) defaults to 0.
When step is given, it specifies the increment (or decrement).
For example, range(4) returns [0, 1, 2, 3]. The end point is omitted!
These are exactly the valid indices for a list of 4 elements.
[i for i in range(1, 11) if i % 2 == 0] == range(2, 12, 2)
Генератор и впрямь плохое название, в Питоне 3 генераторы — это совершенно другой зверь. Жаль, что никак не найдется нормальный термин для comprehension
Ну раз уж зашла речь о comprehensions, то надо вспомнить и родоначальника — set comprehension
oddlist = [ x%10 for x in range(100) if x%2 ] # 1 3 5 7 9 1 3 5 7 9 ...
emptylist = []
oddcubes = { x : x**3 for x in range(100) if x%2 }
emptydict = {}
odds = { x%10 for x in range(100) if x%2 } # 1 3 5 7 9 - дубликаты будут выкинуты
emptyset = set() # внезапно! {} это пустой словарь, а не пустое множество
Sign up to leave a comment.
Генераторы словарей