Для создания двумерных массивов можно использовать вложенные генераторы, разместив
генератор списка, являющегося строкой, внутри генератора для строк. Например,
сделать список из 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, неотрицательное число,
непустая строка или список, то возвращается значение левого операнда, иначе возвращается значение правого операнда.