@JustMoose
Программист. Радиолюбитель. Прокрастинатор ;)

Что за идиома в питоне?

Всем привет.
Нагуглил кусок питона. В нём строка:
f = open("file.txt", "r")
l = [line.strip() for line in f]
Хочется понять, что за идиома "line.strip() for line in f"?
Я понимаю, что "for line in f" перебирает строки в файле. Но, обычно в конце цикла стоит двоеточие. И тело цикла следующей строкой. А здесь тело записано перед циклом? Как это хоть называется? :)
  • Вопрос задан
  • 1284 просмотра
Решения вопроса 1
aRegius
@aRegius
Python Enthusiast
Привет, Вова.

Это называется Генератор списка / List comprehension
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@abcd0x00
Списочное включение.

Есть списочное, словарное, множественное включение и есть генераторное выражение.

Генераторное выражение
>>> gen = (i for i in 'abcd')
>>> gen
<generator object <genexpr> at 0xb7375374>
>>> next(gen)
'a'
>>> next(gen)
'b'
>>> next(gen)
'c'
>>> next(gen)
'd'
>>> next(gen)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
>>> next(gen)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
>>>


Вот пример использования генераторного выражения
>>> list(i for i in 'abc')
['a', 'b', 'c']
>>> list(i, j for i in 'abc')
  File "<stdin>", line 1
SyntaxError: Generator expression must be parenthesized if not sole argument
>>>

Кажется, будто это списочное включение, а на самом деле это генераторное выражение, создающее генератор, который передаётся в конструктор списка.

Но такую конструкцию часто используют в виде аналога включения опредлённого типа.
Как бы "кортежное включение"
>>> tuple(i for i in 'abc')
('a', 'b', 'c')
>>>
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы