Comments 27
Согласен, что «Однострочные выражения» — не самый изящный перевод, но лучше не придумал и не нагуглил стандартного русского названия.
А генераторы — это немного другое.
А генераторы — это немного другое.

В русскоязычной литературе, что читал, это называлось генераторы-функции. А то, о чем пост — генераторы списков или выражения-генераторы.

Что касается гугления русского названия — википедия дает ответ. Если в ней найти «List comprehension» (взял из оригинала), и перейти на русскую версию, можно познакомиться с термином «Списковое включение (Абстракция списков)». С данным термином встречаюсь впервые, полагаю, является обобщенным для всех языков.
ок, не так выразился, List comprehensions — это «генераторы списков» по-русски, Dictionary comprehensions — «генераторы словарей», соответственно.
Они во всей русскоязычной литературе так называются, вот еще пример
А еще к оригинальной статье есть отличный комментарий
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 ветку
generator expression — это, я так, понимаю, выражение-генератор? Ну это же не тоже самое, что генератор списка
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 нет.
спасибо. Написал про версии и исправил на range(), с ней код универсальнее.
Много чего можно также слелать и через многими ненавистную 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)))
UFO landed and left these words here
Послушайте, ну писать туториал до того как вы прочитали docstring с метода это же нехорошо:

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)

и я и автор оригинала знаем, про то что в range можно задать шаг. Это же просто пример.
Генератор и впрямь плохое название, в Питоне 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() # внезапно! {} это пустой словарь, а не пустое множество

Only those users with full accounts are able to leave comments. Log in, please.