Nell'esempio viene utilizzato un'altro 'trucco' dell'operatore and. Se guardate la tabella di and potete osservare che la terza espressione è falsa senza che Python esegua un controllo sul secondo elemento. Se count >= len(copy) (in altre parole count < len(copy) è falsa) allora copy[count] non viene processata. Questo avviene perché Python sa che se la prima accezione è falsa, lo sono entrambe. Questo piccolo trucco è utile se la seconda metà dell'and causa un errore. Ho usato la prima espressione (count < len(copy)) per eseguire un controllo su count e controllare se count sia un indice valido (se non mi credete, rimuovete 'Jill' e 'Life', eseguite il programma e vedete se funziona ancora, quindi invertite l'ordine di count < len(copy) and copy[count] != prev con copy[count] != prev and count < len(copy)).
Le espressioni booleane possono essere usate quando avete bisogno di verificare due o più elementi in una volta.
10.1 Esempi
password1.py
## Questo programma chiede ad un utente un nome ed una password,
# poi controlla per accertarsi che gli sia consentito l'accesso.
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."
Semplice esecuzione:
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.
10.2 Esercizi
Scrivete un programma che spinga l'utente ad indovinare il vostro nome dandogli solamente 3 possibilità, dopo le quali il programma termina.
Questo capitolo tratta i dizionari. I dizionari hanno chiavi e valori. Le chiavi sono usate per trovare i valori. Ecco un esempio di un dizionario in uso:
def print_menu():
print '1. Print Phone Numbers'
print '2. Add a Phone Number'
print '3. Remove a Phone Number'
print '4. Lookup a Phone Number'
print '5. Quit'
print
numbers = {}
menu_choice = 0
print_menu()
while menu_choice != 5:
menu_choice = input("Type in a number (1-5):")
if menu_choice == 1:
print "Telephone Numbers:"
for x in numbers.keys():
print "Name: ",x," \tNumber: ",numbers[x]
print
elif menu_choice == 2:
print "Add Name and Number"
name = raw_input("Name:")
phone = raw_input("Number:")
numbers[name] = phone
elif menu_choice == 3:
print "Remove Name and Number"
name = raw_input("Name:")
if numbers.has_key(name):
del numbers[name]
else:
print name," was not found"
elif menu_choice == 4:
print "Lookup Number"
name = raw_input("Name:")
if numbers.has_key(name):
print "The number is",numbers[name]
else:
print name," was not found"
elif menu_choice != 5:
print_menu()
E qui l'output:
1. Print Phone Numbers
2. Add a Phone Number
3. Remove a Phone Number
4. Lookup a Phone Number
5. Quit
Type in a number (1-5):2
Add Name and Number
Name:Joe
Number:545-4464
Type in a number (1-5):2
Add Name and Number
Name:Jill
Number:979-4654
Type in a number (1-5):2
Add Name and Number
Name:Fred
Number:132-9874
Type in a number (1-5):1
Telephone Numbers:
Name: Jill Number: 979-4654
Name: Joe Number: 545-4464
Name: Fred Number: 132-9874
Type in a number (1-5):4
Lookup Number
Name:Joe
The number is 545-4464
Type in a number (1-5):3
Remove Name and Number
Name:Fred
Type in a number (1-5):1
Telephone Numbers:
Name: Jill Number: 979-4654
Name: Joe Number: 545-4464
Type in a number (1-5):5
Questo programma è simile a quello con la lista di nomi nel capitolo sulle liste. Ecco come funziona il programma. Innanzitutto viene definita la funzione print_menu che visualizza sullo schermo un menu più volte usato nel programma. A questo punto compare la linea numbers = {} che dichiara numbers come un dizionario. Le linee seguenti fanno funzionare il menu:
for x in numbers.keys():
print "Name: ",x," \tNumber: ",numbers[x]
Tramite questo ciclo si possono visualizzare le informazioni contenute nel dizionario. La funzione numbers.keys() restituisce una lista che viene poi utilizzata dal ciclo for. Questa lista non ha un ordine particolare, quindi se la volete in ordine alfabetico la dovrete ordinare. Con la notazione numbers[x] potete accedere ai singoli membri del dizionario. Ovviamente in questo caso x è una stringa. Successivamente la linea numbers[name] = phone aggiunge un nome ed un numero di telefono al dizionario. Se name è stato già inserito nel dizionario phone, rimpiazza il valore precedente. Le linee successive:
if numbers.has_key(name):
del numbers[name]
Controllano se una chiave è già presente nel dizionario, in tal caso la rimuovono. La funzione numbers.has_key(name) ritorna vero se name è presente in numbers, altrimenti ritorna falso. La linea del del numbers[name] rimuove la chiave name ed il valore ad essa associato. Le linee:
if numbers.has_key(name):
print "The number is",numbers[name]
Controllano se nel dizionario è presente una determinata chiave, se la trovano, stampano il numero ad essa associato. Infine, se la scelta non è presente nel menu (quindi non è valida) il programma visualizza nuovamente il menu.
Ricapitolando: i dizionari hanno chiavi e valori. Le chiavi possono essere stringhe o numeri e puntano a valori. I valori puntati possono essere qualsiasi tipo di variabile, anche liste di dizionari (che possono contenere a loro volta dizionari e liste (paura eh? :=) )). Questo è un esempio che utilizza una lista in un dizionario:
max_points = [25,25,50,25,100]
assignments = ['hw ch 1','hw ch 2','quiz ','hw ch 3','test']
students = {'#Max':max_points}
def print_menu():
print "1. Add student"
print "2. Remove student"
print "3. Print grades"
print "4. Record grade"
print "5. Print Menu"
print "6. Exit"
def print_all_grades():
print '\t',
for i in range(len(assignments)):
print assignments[i],'\t',
print
keys = students.keys()
keys.sort()
for x in keys:
print x,'\t',
grades = students[x]
print_grades(grades)
def print_grades(grades):
for i in range(len(grades)):
print grades[i],'\t\t',
print
print_menu()
menu_choice = 0
while menu_choice != 6:
print
menu_choice = input("Menu Choice (1-6):")
if menu_choice == 1:
name = raw_input("Student to add:")
students[name] = [0]*len(max_points)
elif menu_choice == 2:
name = raw_input("Student to remove:")
if students.has_key(name):
del students[name]
else:
print "Student: ",name," not found"
elif menu_choice == 3:
print_all_grades()
elif menu_choice == 4:
print "Record Grade"
name = raw_input("Student:")
if students.has_key(name):
grades = students[name]
print "Type in the number of the grade to record"
print "Type a 0 (zero) to exit"
for i in range(len(assignments)):
print i+1,' ',assignments[i],'\t',
print
print_grades(grades)
which = 1234
while which != -1:
which = input("Change which Grade:")
which = which-1
if 0 <= which < len(grades):
grade = input("Grade:")
grades[which] = grade
elif which != -1:
print "Invalid Grade Number"
else:
print "Student not found"
elif menu_choice != 6:
print_menu()
E questo è il semplice output:
1. Add student
2. Remove student
3. Print grades
4. Record grade
5. Print Menu
6. Exit
Menu Choice (1-6):3
hw ch 1 hw ch 2 quiz hw ch 3 test
#Max 25 25 50 25 100
Menu Choice (1-6):6
1. Add student
2. Remove student
3. Print grades
4. Record grade
5. Print Menu
6. Exit
Menu Choice (1-6):1
Student to add:Bill
Menu Choice (1-6):4
Record Grade
Student:Bill
Type in the number of the grade to record
Type a 0 (zero) to exit
1 hw ch 1 2 hw ch 2 3 quiz 4 hw ch 3 5 test
0 0 0 0 0
Change which Grade:1
Grade:25
Change which Grade:2
Grade:24
Change which Grade:3
Grade:45
Change which Grade:4
Grade:23
Change which Grade:5
Grade:95
Change which Grade:0
Menu Choice (1-6):3
hw ch 1 hw ch 2 quiz hw ch 3 test
#Max 25 25 50 25 100
Bill 25 24 45 23 95
Menu Choice (1-6):6
La variabile students è un dizionario le cui chiavi sono i nomi degli studenti, i valori sono i voti degli studenti. Le prime due linee creano semplicemente due liste. La linea successiva students = {'#Max':max_points} crea un nuovo dizionario la cui chiave è #Max e il valore [25,25,50,25,100] (è il valore di max_points nel momento in cui il valore viene assegnato; viene usata la chiave #Max perché # è sempre ordinato sopra i caratteri alfabetici). Quindi viene definita la funzione print_menu. Le linee seguenti definiscono print_all_grades.
def print_all_grades():
Le espressioni booleane possono essere usate quando avete bisogno di verificare due o più elementi in una volta.
10.1 Esempi
password1.py
## Questo programma chiede ad un utente un nome ed una password,
# poi controlla per accertarsi che gli sia consentito l'accesso.
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."
Semplice esecuzione:
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.
10.2 Esercizi
Scrivete un programma che spinga l'utente ad indovinare il vostro nome dandogli solamente 3 possibilità, dopo le quali il programma termina.
Questo capitolo tratta i dizionari. I dizionari hanno chiavi e valori. Le chiavi sono usate per trovare i valori. Ecco un esempio di un dizionario in uso:
def print_menu():
print '1. Print Phone Numbers'
print '2. Add a Phone Number'
print '3. Remove a Phone Number'
print '4. Lookup a Phone Number'
print '5. Quit'
numbers = {}
menu_choice = 0
print_menu()
while menu_choice != 5:
menu_choice = input("Type in a number (1-5):")
if menu_choice == 1:
print "Telephone Numbers:"
for x in numbers.keys():
print "Name: ",x," \tNumber: ",numbers[x]
elif menu_choice == 2:
print "Add Name and Number"
name = raw_input("Name:")
phone = raw_input("Number:")
numbers[name] = phone
elif menu_choice == 3:
print "Remove Name and Number"
name = raw_input("Name:")
if numbers.has_key(name):
del numbers[name]
else:
print name," was not found"
elif menu_choice == 4:
print "Lookup Number"
name = raw_input("Name:")
if numbers.has_key(name):
print "The number is",numbers[name]
else:
print name," was not found"
elif menu_choice != 5:
print_menu()
E qui l'output:
1. Print Phone Numbers
2. Add a Phone Number
3. Remove a Phone Number
4. Lookup a Phone Number
5. Quit
Type in a number (1-5):2
Add Name and Number
Name:Joe
Number:545-4464
Type in a number (1-5):2
Add Name and Number
Name:Jill
Number:979-4654
Type in a number (1-5):2
Add Name and Number
Name:Fred
Number:132-9874
Type in a number (1-5):1
Telephone Numbers:
Name: Jill Number: 979-4654
Name: Joe Number: 545-4464
Name: Fred Number: 132-9874
Type in a number (1-5):4
Lookup Number
Name:Joe
The number is 545-4464
Type in a number (1-5):3
Remove Name and Number
Name:Fred
Type in a number (1-5):1
Telephone Numbers:
Name: Jill Number: 979-4654
Name: Joe Number: 545-4464
Type in a number (1-5):5
Questo programma è simile a quello con la lista di nomi nel capitolo sulle liste. Ecco come funziona il programma. Innanzitutto viene definita la funzione print_menu che visualizza sullo schermo un menu più volte usato nel programma. A questo punto compare la linea numbers = {} che dichiara numbers come un dizionario. Le linee seguenti fanno funzionare il menu:
for x in numbers.keys():
print "Name: ",x," \tNumber: ",numbers[x]
Tramite questo ciclo si possono visualizzare le informazioni contenute nel dizionario. La funzione numbers.keys() restituisce una lista che viene poi utilizzata dal ciclo for. Questa lista non ha un ordine particolare, quindi se la volete in ordine alfabetico la dovrete ordinare. Con la notazione numbers[x] potete accedere ai singoli membri del dizionario. Ovviamente in questo caso x è una stringa. Successivamente la linea numbers[name] = phone aggiunge un nome ed un numero di telefono al dizionario. Se name è stato già inserito nel dizionario phone, rimpiazza il valore precedente. Le linee successive:
if numbers.has_key(name):
del numbers[name]
Controllano se una chiave è già presente nel dizionario, in tal caso la rimuovono. La funzione numbers.has_key(name) ritorna vero se name è presente in numbers, altrimenti ritorna falso. La linea del del numbers[name] rimuove la chiave name ed il valore ad essa associato. Le linee:
if numbers.has_key(name):
print "The number is",numbers[name]
Controllano se nel dizionario è presente una determinata chiave, se la trovano, stampano il numero ad essa associato. Infine, se la scelta non è presente nel menu (quindi non è valida) il programma visualizza nuovamente il menu.
Ricapitolando: i dizionari hanno chiavi e valori. Le chiavi possono essere stringhe o numeri e puntano a valori. I valori puntati possono essere qualsiasi tipo di variabile, anche liste di dizionari (che possono contenere a loro volta dizionari e liste (paura eh? :=) )). Questo è un esempio che utilizza una lista in un dizionario:
max_points = [25,25,50,25,100]
assignments = ['hw ch 1','hw ch 2','quiz ','hw ch 3','test']
students = {'#Max':max_points}
def print_menu():
print "1. Add student"
print "2. Remove student"
print "3. Print grades"
print "4. Record grade"
print "5. Print Menu"
print "6. Exit"
def print_all_grades():
print '\t',
for i in range(len(assignments)):
print assignments[i],'\t',
keys = students.keys()
keys.sort()
for x in keys:
print x,'\t',
grades = students[x]
print_grades(grades)
def print_grades(grades):
for i in range(len(grades)):
print grades[i],'\t\t',
print_menu()
menu_choice = 0
while menu_choice != 6:
menu_choice = input("Menu Choice (1-6):")
if menu_choice == 1:
name = raw_input("Student to add:")
students[name] = [0]*len(max_points)
elif menu_choice == 2:
name = raw_input("Student to remove:")
if students.has_key(name):
del students[name]
else:
print "Student: ",name," not found"
elif menu_choice == 3:
print_all_grades()
elif menu_choice == 4:
print "Record Grade"
name = raw_input("Student:")
if students.has_key(name):
grades = students[name]
print "Type in the number of the grade to record"
print "Type a 0 (zero) to exit"
for i in range(len(assignments)):
print i+1,' ',assignments[i],'\t',
print_grades(grades)
which = 1234
while which != -1:
which = input("Change which Grade:")
which = which-1
if 0 <= which < len(grades):
grade = input("Grade:")
grades[which] = grade
elif which != -1:
print "Invalid Grade Number"
else:
print "Student not found"
elif menu_choice != 6:
print_menu()
E questo è il semplice output:
1. Add student
2. Remove student
3. Print grades
4. Record grade
5. Print Menu
6. Exit
Menu Choice (1-6):3
hw ch 1 hw ch 2 quiz hw ch 3 test
#Max 25 25 50 25 100
Menu Choice (1-6):6
1. Add student
2. Remove student
3. Print grades
4. Record grade
5. Print Menu
6. Exit
Menu Choice (1-6):1
Student to add:Bill
Menu Choice (1-6):4
Record Grade
Student:Bill
Type in the number of the grade to record
Type a 0 (zero) to exit
1 hw ch 1 2 hw ch 2 3 quiz 4 hw ch 3 5 test
0 0 0 0 0
Change which Grade:1
Grade:25
Change which Grade:2
Grade:24
Change which Grade:3
Grade:45
Change which Grade:4
Grade:23
Change which Grade:5
Grade:95
Change which Grade:0
Menu Choice (1-6):3
hw ch 1 hw ch 2 quiz hw ch 3 test
#Max 25 25 50 25 100
Bill 25 24 45 23 95
Menu Choice (1-6):6
La variabile students è un dizionario le cui chiavi sono i nomi degli studenti, i valori sono i voti degli studenti. Le prime due linee creano semplicemente due liste. La linea successiva students = {'#Max':max_points} crea un nuovo dizionario la cui chiave è #Max e il valore [25,25,50,25,100] (è il valore di max_points nel momento in cui il valore viene assegnato; viene usata la chiave #Max perché # è sempre ordinato sopra i caratteri alfabetici). Quindi viene definita la funzione print_menu. Le linee seguenti definiscono print_all_grades.
def print_all_grades():