# Προτάσεις 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.

# Ασκήσεις

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