Лекция 2. Синтаксис. Дополнения

Именованые аргументы функции print

В Python3 у функций может быть два вида аргументов: позиционные и именованные. Позиционными называются те аргументы, которые передаются в определённом порядке и в этом порядке присваиваются параметрам функции (первый фактический аргумент – первому параметру и так далее). В дополнение к позиционным у некоторых функций существуют именованные аргументы, для указания которых нужно указать имя аргумента.

У функции print таких аргументов три:

sep
разделитель (англ. separator) аргументов при печати. Значение по умолчанию ‘ ‘ (пробел). Разделитель выводится между позиционными аргументами.
end
выводится после печати всех позиционных аргументов. Значение по умолчанию ‘n’.
file
поток вывода, в который будет производиться печать. Значение по умолчанию sys.stdout, стандартный поток вывода.

Примеры:

print('abc', 'def', 'ghi')                       # 'abc def ghi\n'
print('abc', 'def', 'ghi', sep='#:', end='!')    # 'abc#:def#:ghi!'
print('abc', 'def', 'ghi', sep='', end='')       # 'abcdefghi'

Функция input

Функция input считывает строку пользовательского ввода вплоть до перевода строки '\n' и возвращает считанную строку, выбрасывая сам перевод строки. Если на данной операционной системе, например, на Windows или Mac OS X, принят перевод строки с помощью двух символов '\r\n', то из ввода будут выкинуты оба символа. В этом плане Python старается по максимуму скрывать различия между различными операционными системами.

Если input вызвать без аргумента, она просто считывает строку. Если её вызвать со строкой-аргументом, то она сначала выведет пользователю эту строку, потом будет считывать ввод. Это полезно, когда нужно дать пользователю подсказку, что вводить.

Пример:

a = int(input("Введите a: "))      # преобразуем ввод к типу int
b = float(input("Введите b: "))    # к типу float
s = input("Введите строку s: ")    # если преобразования не делать, то результатом
                                   # будет стандартный строковый тип str.

Оператор for-else

Достаточно часто возникает ситуация, когда при наступлении в цикле определённого события цикл прерывается с помощью break, и уже вне цикла нужно выполнить какие-либо действия, если события не произошло. Например, в алгоритме поиска можно сделать break на первом искомом объекте и после цикла выполнить действие, если ни одного объекта не найдено.

Такие действия можно выполнить с помощью дополнительной логической переменной, которую называют флагом:

found = False
for ...:
    ...
    ...
    if условие:
        found = True
        break
if not found:        # условие сработает, только если found не было присвоено True
    ...

В виду того, что такой приём встречается достаточно часто, авторы Python внедрили в for встроенную возможность выполнять какой-нибудь код, если цикл завершился нормально, без break. Такой код должен находится в операторе else, который идёт после for на одном с ним уровне отступов.

for ...:
    ....
    ....
    if условие:
        break
    ...
else:
    ... # код в этом else относится к for.
    ... # этот код будет выполнен, если цикл for
    ... # завершился обычным образом, а не с помощью
    ... # break

Имеется аналогичная возможность дописывать else после while с тем же смыслом.

Оператор continue

Оператор continue переходит на следующую итерацию цикла while или for. В for переменная цикла принимает следующее значение, и тело цикла начинает выполняться сначала. В while происходит переход к вычислению условия.

for i in range(5):
    if i % 3 == 0:
        continue
    print(i)

Такой код выведет:

1
2
4

Если continue вложен сразу в несколько циклов, то он влияет только на самый вложенный из них.

Пример кода, который обрабатывает пары чисел (i, j), где i != j:

for i in range(10):
    for j in range(10):
        if i == j:
            continue # следующее j
        print(i, j)

Оператор elif

Иногда возникает необходимость обработать несколько альтернативных ветвей, как в случае из предыдущей лекции, где у квадратного уравнения могло быть два, одно или ноль решений. В такой ситуации мы можем воспользоваться вложенным if, однако в случае большого количества ветвей код будет выстраиваться “лесенкой”, как в примере ниже.

x = int(input("Введите число, целое"))

if x == 0:
    print("Ноль")
else:
    if x < 0:
        print("Отрицательное")
    else:
        if x % 2 == 0:
            print("положительное чётное")
        else:
            print("положительное нечётное")

Специально для того, чтобы не происходило роста вложенности в случае многих альтернативных ветвей, автор Python добавил в язык оператор elif (сокращение от “else if”). Пример выше полностью эквивалентен следующему коду:

x = int(input("Введите число, целое"))

if x == 0:
    print("Ноль")
elif x < 0:
    print("Отрицательное")
elif x % 2 == 0:
    print("положительное чётное")
else:
    print("положительное нечётное")

Условия в цепочке if-elif-...-else проверяются последовательно, одно за другим, если одно из них выполнится, будет выполнена соответствующая ветвь кода, после этого дальнейшие условия elif-ов проверяться не будут, и управление перейдёт к коду вне if.

Если ни одно условие не выполнится и есть ветка else, то будет выполнена она.

Логические операторы

Таблица истинности not: ...

Таблица истинности and: ...

Таблица истинности or: ...

and, or, not всегда возвращают True или False, а на вход они могут принимать любые объекты языка Python, интерпретируя их следующим образом:

Ложные значения

  • False
  • None - отсутствие чего-либо
  • 0
  • 0.0
  • “” - пустая строка
  • () - пустой кортеж
  • [] - пустой список
  • {} - пустой словарь
  • set() - пустое множество
  • frozenset() - пустое неизменяемое множество
  • и некоторые другие

Истинные значения

  • всё остальное
if a:
    print("Bingo!")    # Будет напечатано, если в переменной a истинное выражение,
                       # например True, 1, 2, "hello" и т.д.
bool(0)                # False
bool("hello")          # True
2 * 2 == 4             # True
2 * 2 == 5             # False
2 * 2 == 5 or True     # True
bool(0)
bool(1)

bool(123)

int(False)
int(True)

True
False