Генераторы списков

Для создания двумерных массивов можно использовать вложенные генераторы, разместив генератор списка, являющегося строкой, внутри генератора для строк. Например, сделать список из n строк и m столбцов при помощи генератора, создающего список из n элементов, каждый элемент которого является списком из m нулей:

[[0] * m for i in range(n)]

При этом внутренний список также можно создать при помощи, например, такого генератора: [0 for j in range(m)]. Вложив один генератор в другой получим вложенные генераторы:

[[0 for j in range(m)] for i in range(n)]

Если число 0 заменить на некоторое выражение, зависящее от i (номер строки) и j (номер столбца), то можно получить список, заполненный по некоторой формуле.

Использование логических выражений в генераторах

Есть несколько способов использовать в генераторах логические выражения, то есть аналоги условий.

Тернарный оператор

Прежде всего существует тернарный оператор, который можно использовать в арифметических выражениях, то есть справа от операции присваивания, в генераторах, в функции print, в инструкции return и т.д.

Синтаксис тернарного оператора:

знач1 if условие else знач2

Тернарный оператор проверяет условие, если оно истино, то возвращает знач1, иначе возвращается знач2.

Пример вычисления максимума из значений a и b.

print(a if a > b else b)

Приведение типов

Иногда оказывается удобным явно или неявно приводить логические типы к int и наоборот. В этом случае действуют следующие правила.

При приведении значений типа bool к типу int значение True переводится в 1, значение False переводится в 0. Такое преобразование может быть выполнено явно при помощи функции int, или оно выполняется неявно если значение типа bool используется в арифметических операциях. Например, выражение (x > 0) + (y > 0) + (z > 0) позволяет определить, сколько среди чисел x, y, z положительных.

Это позволяет также конструировать аналоги логических выражений. Например, максимум из чисел a и b можно найти так:

print(a * (a > b) + b * (a <= b))

В этом примере если (a > b), то первое слагаемое будет равно a, а второе слаемое будет равно 0. Если же (a <= b), то первое слагаемое будет 0, а второе будет равно b.

При приведении значения типа int к типу bool число 0 переводится в False, а ненулевые числа переводятся в True. При переводе строк и списков к типу bool пустые строки и списки приводятся к значению False, а непустые — к True.

Интересны правила применения логических операций and и or к выражениям нелогического типа. Здесь применяются правила неполного вычисления логических выражений. Для операции and сначала вычисляется значение левого операнда. Если левый операнд приводится к логическому False (то есть имеет значение False, 0, является пустой строкой или пустым списком), то возвращается значение левого операнда. Иначе возвращается значение правого операнда. Аналогично работает операция or: если значение левого операнда True, неотрицательное число, непустая строка или список, то возвращается значение левого операнда, иначе возвращается значение правого операнда.