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