Προτάσεις Boolean (Boolean Expressions)

Ένα μικρό παράδειγμα με προτάσεις boolean (δεν είναι ανάγκη να το πληκτρολογήσετε):
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. Κάθε εντολή print εμφανίζει έναν αριθμό και μια πρόταση. Χρησιμοποιώ τον αριθμό για να ξέρω με ποια πρόταση ασχολούμαι κάθε φορά. Προσέξτε πως η πρόταση είναι ή 0 ή 1. Στην Python η ψευδής πρόταση γράφεται με 0 και η αληθής με 1. Οι γραμμές:
print 1, a == 6
print 2, a == 7
εμφανίζουν ένα ``1'' καi ένα ``0'' αντίστοιχα όπως το περιμέναμε αφού η πρώτη είναι αληθής και η δεύτερη ψευδής. Η τρίτη εντολή , print 3,a == 6 and b == 7, είναι λίγο διαφορετική. Ο τελεστής and σημαίνει ότι αν η πρόταση πρίν και η πρόταση μετά από αυτόν είναι αληθείς τότε όλη η πρόταση είναι αληθής διαφορετικά ολόκληρη η πρόταση είναι ψευδής. Η εόμενη γραμμή , print 4,a == 7 and b == 7, δείχνει πως αν ένα μέρος μιας πρότασης and είναι ψευδές τότε όλη η πρόταση είναι ψευδής. Η συμπεριφορά της πρότασης and μπορεί να περιγραφεί συνοπτικά ως εξής:

Πρόταση Αποτέλεσμα
αληθής και αληθής αληθής
αληθής και ψευδής ψευδής
ψευδής και αληθής ψευδής
ψευδής και ψευδής ψευδής

Σημειώστε πως αν η πρώτη πρόταση είναι ψευδής η Python δεν εξετάζει την δεύτερη αφού ξέρει ότι η όλη πρόταση θα είναι ψευδής.

Η επόμενη γραμμή, print 5,not a == 7 and b == 7, χρησιμοποιεί τον τελεστή not. Ο τελεστής not δίνει το ακριβώς αντίθετο της πρότασης (Θα μπορούσαμε να ξαναγράψουμε την πρόταση ως print 5,a != 7 and b == 7). Να και ο πίνακας ``συμπεριφοράς'':

Πρόταση Αποτέλεσμα
όχι αληθής ψευδής
όχι ψευδής αληθής

Οι επόμενες δύο γραμμές, print 6,a == 7 or b == 7 και print 7,a == 7 or b == 6, χρησιμοποιούν τον τελεστή or . Ο τελεστής or είναι αληθής αν η πρώτη πρόταση είναι αληθής, ή αν η δεύτερη πρόταση είναι αληθής ή αν και οι δύο είναι αληθείς. Αν δεν είναι καμμία από τις δύο τότε είναι ψευδής. Να και ο πίνακας:

Πρόταση Αποτέλεσμα
αληθής ή αληθής αληθής
αληθής ή ψευδής αληθής
ψευδής ή αληθής αληθής
ψευδής ή ψευδής ψευδής

Προσέξτε πάλι πως αν η πρώτη πρόταση είναι αληθής η Python δεν ελέγχει την δεύτερη πρόταση αφού ξέρει πως η όλη πρόταση είναι αληθής. Κάτι τέτοιο είναι λογικό μια και με τον τελεστή or η όλη πρόταση είναι αληθής αν είναι τουλάχιστον η πρώτη πρόταση αληθής. Το πρώτο μέρος είναι αληθές και το δεύτερο είναι ή αληθές ή ψευδές, αλλά η όλη πρόταση είναι πάλι αληθής.

Οι παρακάτω δύο γραμμές, print 8,not (a == 7 and b == 6) και print 9,not a == 7 and b == 6, δείχνουν πως οι παρενθέσεις μπορούν να χρησιμοποιηθούν για να ``εκβιάσουν'' τον έλεγχο ενός μέρους. Σημειώστε πως οι παρενθέσεις άλλαξαν την τιμή της πρόταση από ψευδή σε αληθή. Αυτό συνέβη αφού οι παρενθέσεις ``επέβαλαν'' τον τελεστή not σε όλη την πρόταση αντί μόνο στο μέρος a == 7 portion.

Να ένα παράδειγμα για το πως χρησιμοποιείται μια πρόταση boolean:

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

#make a copy of the list
copy = list[:]
#sort the copy
copy.sort()
prev = copy[0]
del copy[0]

count = 0

#go through the list searching for a match
while count < len(copy) and copy[count] != prev:
    prev = copy[count]
    count = count + 1

#If a match was not found then count can't be < len
#since the while loop continues while count is < len
#and no match is found
if count < len(copy):
    print "First Match: ",prev

Και το αποτέλεσμα:

First Match:  Jill

Το πρόγραμμα αυτό λειτουργεί προσπαθώντας να βρεί όμοια όσο while count < len(copy) and copy[count]. Όταν το count είναι μεγαλύτερο από τον τελευταίο αριθμό καταλόγου του copy ή όταν το όμοιο βρεθεί ο τελεστής and παύει να είναι αληθής και ο βρόγχος τερματίζεται. Η δομή ελέγχου if απλώς ελέγχει για να είμαστε σίγουροι πως ο βρόγχος while τερματίστηκε επειδή βρέθηκε κάποιο όμοιο.

Το άλλο ``κόλπο'' του τελεστή and χρησιμοποιήθηκε κι αυτό στο παράδειγμα. Εξετάζοντας τον πίνακα για το and θα παρατηρήσετε ότι η τρίτη εγγραφή είναι ``ψευδής και δεν ελέγχεται''. Αν το count >= len(copy) (με άλλα λόγια αν το count < len(copy) είναι ψευδές) τότε η πρόταση copy[count] δεν εξετάζεται ποτέ. Αυτό συμβαίνει επειδή η Python ξέρει ότι εφόσον το πρώτο μέρος είναι ψευδές δεν μπορεί να είναι και ται δύο αληθή. Κάτι τέτοιο ονομάζεται και ``βραχυκύκλωμα'' και είναι χρήσιμο αν το δεύτερο μέρος μιας πρότασης and δημιουργήσει σφάλμα αν κάτι πάει στραβά. Χρησιμοποίησα την πρώτη πρόταση (count < len(copy)) για να δω αν ο count είναι ένας έγκυρος αριθμός καταλόγου για το copy. (Αν δεν με πιστεύετε διαγράψτε τα όμοια `Jill' και `Life', ελέγξτε ότι ακόμη λειτουργεί και μετά αλλάξτε την σειρά από count < len(copy) and copy[count] != prev σε copy[count] != prev and count < len(copy).)

Οι προτάσεις boolean μπορούν να χρησιμοποιηθούν όταν θέλετε να ελέγξετε δύο ή περισσότερα διαφορετικά πράγματα με μια κίνηση.

Παραδείγματα

password1.py

## This programs asks a user for a name and a password.
# It then checks them to make sure the the user is allowed in.

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.

Ασκήσεις

Γράψτε ένα πρόγραμμα στο οποίο ο χρήστης μαντεύει το όνομά σας αλλά έχει μόνο τρεις ευκαιρίες. Αν τις χάσει το πρόγραμμα να τερματίζεται.