Keywords: easytut

Далее: Словари Наверх: Курс языка Python для начинающих Назад: Циклы for Содержание
В этой главе

- Примеры
- Упражнения

# Логические выражения

Ниже приводится небольшой пример логических выражений (вам не обязательно его печатать).

    a = 6
    b = 7
    c = 42
    print 1, a == 6
    print 2, a == 7
    print 3,a == 6 and b == 7
    print 4,a == 7 and b == 7
    print 5,not a == 7 and b == 7
    print 6,a == 7 or b == 7
    print 7,a == 7 or b == 6
    print 8,not (a == 7 and b == 6)
    print 9,not a == 7 and b == 6

Результат:

    1 1
    2 0
    3 1
    4 0
    5 1
    6 1
    7 0
    8 1
    9 0

Что же здесь происходит? Программа состоит из множества странных команд `print`. Каждая из них выводит номер и выражение. Номер просто служит для того чтобы отслеживать, с каким выражением мы имеем дело. Результат всех выражений равен либо 0, либо 1. В Python ложно пишется как 0 и истинно - как 1. Команды

    print 1, a == 6
    print 2, a == 7

выводят 1 и 0, соответственно, как и ожидается, поскольку первое выражение истинно, а второе – ложно. Третья команда `print 3,a == 6 and b == 7` отлична от предыдущих. Оператор `and` означает, что если выражение перед ним истинно и выражение за ним истинно, то все выражение истинно, в любом другом случае оно ложно. Следующая строка, `print 4,a == 7 and b == 7` показывает, что если часть выражения `and` ложна, то и все выражение ложно. Работу оператора `and` можно представить следующим образом:

выражение | результат
истинно and истинно | истинно
истинно and ложно | ложно
ложно and истинно | ложно
ложно and ложно | ложно

Заметьте, если первая часть выражения ложна, Python не проверяет вторую часть, поскольку он знает, что выражение в целом ложно.

Следующая команда, `print 5,not a == 7 and b == 7`, использует оператор `not`. Оператор `not` меняет истинность на противоположную (это можно было бы записать как `print 5,a != 7 and b == 7`). Таблица для него:

выражение | результат
not истинно | ложно
not ложно | истинно

Два следующих оператора, `print 6,a == 7 or b == 7` и `print 7,a == 7 or b == 6`, используют оператор `or`. Оператор `or` дает истинно, если первое выражение истинно, или второе выражение истинно, или оба они истинны. Если оба ложны, то все выражение ложно. Таблица:

выражение | результат
истинно or истинно | истинно
истинно or ложно | истинно
ложно or истинно | истинно
ложно or ложно | ложно

Обратите внимание, что если первая часть выражения истинна, то Python не проверяет вторую часть, поскольку он знает, что все выражение истинно. Первая часть выражения `or` истинна, поэтому вторая часть может быть истинной или ложное, выражение в целом все равно будет истинно.

Следующие две команды, `print 8,not (a == 7 and b == 6)` и `print 9,not a == 7 and b == 6`, показывают, что можно использовать скобки для группировки выражений, чтобы какие-либо выражения проверялись первыми. Заметьте, скобки изменили истинность выражения с ложно на истинно. Это случилось, потому что из-за скобок оператор `not` применился ко всему выражению, а не только к части `a == 7`.

Пример использования логических выражений:

    list = ["Life","The Universe","Everything","Jack","Jill","Life","Jill"]

    #делаем копию списка. Смотрите главу Возвращаемся к спискам
    #чтобы узнать что значит [:].
    copy = list[:]
    #сортируем копию
    copy.sort()
    prev = copy[0]
    del copy[0]

    count = 0

    #просматриваем список в поисках совпадения
    while count < len(copy) and copy[count] != prev:
        prev = copy[count]
        count = count + 1

    #если элемент найден, то count не может быть < len
    #поскольку цикл while продолжается пока count < len
    #или пока элемент не найден
    if count < len(copy):
        print "First Match: ",prev

А вот и результат:

    First Match:  Jill

Программа работает, продолжая поиск до тех пор, пока `count < len(copy) and copy[count] != prev`. Если либо `count` становится больше, чем последний индекс списка `copy`, либо совпадающий элемент был найден, выражение с `and` становится ложным и цикл заканчивается. Условие `if` просто проверяет, закончился ли цикл из-за того, что был найден совпадающий элемент.

Еще одно применение оператора `and` показано там же. Если первая часть выражения ложна, то все выражение ложно, и вторая часть не проверяется. Если `count >= len(copy)` (другими словами, `count > len(copy)` ложно), то программа не рассматривает `copy[count]`. Происходит это потому, что Python знает, что если первая часть выражения ложна, то все выражение будет ложно независимо от второй части. Это называется коротким замыканием, и бывает полезно, если вторая часть выражения может дать ошибку, если что-то не так. Я использовал первую часть выражения (`count < len(copy)`), чтобы проверить, что `count` является правильным индексом для `copy`. (Если вы мне не верите, уберите вторые экземпляры элементов ‘Jill’ и ‘Life’ и проверьте, что это все равно работает, а затем поменяйте `count < len(copy) and copy[count] != prev` на `copy[count] != prev and count < len(copy)`).

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

# Примеры

password1.py

    ## Программа просит ввести имя пользователя и пароль
    # Затем она проверяет, можно ли впустить пользователя

    name = raw_input("What is your name? ")
    password = raw_input("What is the password? ")
    if name == "Josh" and password == "Friday":
        print "Welcome Josh"
    elif name == "Fred" and password == "Rock":
        print "Welcome Fred"
    else:
        print "I don't know you."

Примеры работы:

    What is your name? Josh
    What is the password? Friday
    Welcome Josh

    What is your name? Bill
    What is the password? Money
    I don't know you.

# Упражнения

Напишите программу, которая просит отгадать ваше имя, но дает это сделать только 3 раза, а затем завершается.

Далее: Словари Наверх: Курс языка Python для начинающих Назад: Циклы for Содержание