В Python часто используются генераторы, которые записываются с использованием следующего синтаксиса:
[<добавляемое значение> for <переменная> in <объект итерирования>]
Генератор в данном случае - это такая конструкция, которая создает список. Именно поэтому вся конструкция заключается в квадратные скобки [ ].
Генерирование значений происходит следующим образом. Конструкцией for ... in ... перебираются элементы из объекта итерирования. То есть, на каждой итерации в переменную укладывается очередной элемент из объекта итерирования. И дополнительно, на каждой итерации, вычисляется выражение, обозначенное как добавляемое значение. Именно одно и добавляется в создаваемый генератором список.
Вот пример, который генерирует список квадратов из начального списка чисел:
anyList = [1, 2, 3, 4, 5]
newList = [a**2 for a in anyList]
print(newList)
Результат:
[1, 4, 9, 16, 25]
Однако часто перебор значений из объекта итерирования может дополняться условиями. Тогда в результирующий список будут попадать только те значения, исходные элементы которых удовлетворяют условию.
Вот пример генерации списка файлов из произвольной директории. В список попадают только *.txt-файлы и только настоящие файлы (не директории):
directory = "/path/to/directory"
files = [f for f in os.listdir(directory) if f.endswith(".txt")
and os.path.isfile(os.path.join(directory, f))]
Здесь запись [f for f ... означает что итоговое имя файла попадает в итоговый список без изменений. То есть, добавляемое значение равно перебираемому значению.