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 раза, а затем завершается.