True e False — imparare a porre domande
Operatori di confronto, and / or / not, confronti concatenati e quali valori Python considera falsi — le basi per scrivere le condizioni.
Come vuoi imparare?
Il problema che stiamo risolvendo
Un programma deve decidere qualcosa: questo ordine ha diritto a uno sconto? La password è abbastanza lunga? L'articolo è disponibile in magazzino?
Il codice che decide arriva nel prossimo capitolo (if). Ma prima ti serve la cosa su cui si basa una decisione — una domanda la cui risposta è sì o no. In Python queste risposte si chiamano True e False, e il tipo si chiama bool.
Per ora impariamo solo a porre domande, non a decidere. Dividerla così è voluto: quasi tutti gli errori che si fanno scrivendo un if sono in realtà errori nella domanda, non nell'if.
Alla fine di questo capitolo sarai in grado di
- Usare i sei operatori di confronto
- Distinguere
=da== - Unire domande semplici in domande più grandi con
and,orenot - Scrivere confronti concatenati come
18 <= age <= 60 - Dire quali valori Python considera falsi senza che siano
False
Prerequisiti: Ricevere input da chi usa il tuo programma.
I sei confronti
age = 22
print(age == 22)
print(age != 22)
print(age > 18)
print(age < 18)
print(age >= 22)
print(age <= 21)True
False
True
False
True
FalseOgni confronto produce un valore — True oppure False. Il che significa che un confronto si può salvare in una variabile:
age = 22
is_adult = age >= 18
print(is_adult)
print(type(is_adult))True
<class 'bool'>Scriverlo così rende il codice molto più leggibile — is_adult dice cosa si sta controllando, mentre age >= 18 obbliga chi legge a capirlo da solo.
= e == — un carattere, un significato diverso
total = 100 # an instruction: put 100 into total
print(total == 100) # a question: is total 100?True=salva (assegnazione)==chiede (confronto)
Scrivi = dove dovrebbe esserci una condizione, e Python 3 solleva un errore chiaro, con un messaggio utile:
SyntaxError: invalid syntax. Maybe you meant '==' or ':=' instead of '='?Buona notizia — questo errore non passa inosservato: viene subito segnalato.
Confrontare testi
print("rafi" == "rafi")
print("Rafi" == "rafi")
print("apple" < "banana")
print(len("password123") >= 8)True
False
True
TrueDue cose da notare:
Le maiuscole contano. "Rafi" non è uguale a "rafi". Quando confronti un testo digitato da una persona, esegui prima .strip().lower() — altrimenti chi ha scritto il nome con la maiuscola o ha lasciato uno spazio in più verrebbe escluso:
typed = " RAFI "
print(typed == "rafi")
print(typed.strip().lower() == "rafi")False
True< funziona anche sul testo, seguendo l'ordine alfabetico, come in un dizionario — da qui "apple" < "banana". È la base per ordinare una lista di nomi.
and, or, not
Tre parole uniscono domande semplici in domande più grandi:
age = 22
has_id = True
print(age >= 18 and has_id)
print(age >= 60 or has_id)
print(not has_id)True
True
Falseand— vero quando entrambe sono vereor— vero quando almeno una è veranot— inverte il valore
Il quadro completo, tutto insieme:
print(True and True)
print(True and False)
print(False and False)
print(True or False)
print(False or False)True
False
False
True
Falseorsignifica "uno o più", non "esattamente uno". Nel linguaggio di tutti i giorni, "tè o caffè?" lascia intendere che se ne prenda uno solo. L'ordi Python èTrueanche quando entrambi i lati sono veri. Se lo dimentichi, le condizioni ti sorprenderanno.
not si applica sempre a ciò che viene subito dopo di lui, e viene eseguito per primo. L'ordine è: prima not, poi and, e or per ultimo.
print(True or False and False)
print((True or False) and False)True
FalseNella prima riga and è stato eseguito per primo, quindi Python ha letto True or (False and False) — cioè True or False, che è True. Nella seconda, le parentesi hanno cambiato l'ordine. Quando hai dei dubbi, usa le parentesi — vale qui come valeva per l'aritmetica.
Confronti concatenati
Per verificare se qualcosa sta tra due limiti, Python ti permette di scriverlo come si fa in matematica:
marks = 72
print(0 <= marks <= 100)
print(marks > 60 and marks < 80)
print(60 < marks < 80)True
True
TrueLa seconda e la terza riga dicono la stessa cosa, e la terza si legge meglio. Molti linguaggi di programmazione non lo permettono; Python sì, e conviene usarlo.
Quali valori Python considera falsi
Non sono solo False — anche alcuni valori comuni contano come falsi:
print(bool(0))
print(bool(1))
print(bool(-5))
print(bool(""))
print(bool("hello"))
print(bool("0"))
print(bool("False"))False
True
True
False
True
True
TrueLa regola in una riga: zero e le cose vuote sono false, tutto il resto è vero. Quindi 0 è falso e il testo vuoto "" è falso; ma -5 è vero (non è zero), e "0" e "False" sono veri — perché non sono vuoti, contengono caratteri.
Le ultime due righe sono la vera trappola. Tutto ciò che arriva da input() è testo, quindi anche quando la persona digita 0, tu hai "0" — che Python considera vero. Per confrontare dei numeri devi prima convertirli con int().
La regola "vuoto è falso" ha anche un uso pratico — intercettare chi ha premuto Invio senza scrivere niente:
name = input("Name: ").strip()
print("Name was given:", bool(name))Name:
Name was given: FalseUn esempio completo
eligibility.py:
# Check a discount rule without deciding anything yet
age = int(input("Age : "))
years_member = int(input("Years a member : "))
order_total = float(input("Order total : "))
is_adult = age >= 18
is_senior = age >= 60
is_loyal = years_member >= 2
is_large_order = order_total >= 1000
# The rule: adults who are either long-standing members or spending a lot
gets_discount = is_adult and (is_loyal or is_large_order)
print()
print(f"Adult : {is_adult}")
print(f"Senior : {is_senior}")
print(f"Loyal member : {is_loyal}")
print(f"Large order : {is_large_order}")
print(f"Gets discount : {gets_discount}")Age : 34
Years a member : 1
Order total : 1500
Adult : True
Senior : False
Loyal member : False
Large order : True
Gets discount : TrueNota che ogni condizione ha ricevuto prima un nome, e la regola è stata poi composta a partire da quei nomi. Scritta su un'unica riga — age >= 18 and (years_member >= 2 or order_total >= 1000) — il codice girerebbe allo stesso modo, ma rileggerlo sei mesi dopo per ricavare la regola sarebbe molto faticoso. Anche le parentesi contano: senza di esse and verrebbe eseguito per primo, e la regola stessa cambierebbe.
Quando qualcosa va storto
SyntaxError: invalid syntax. Maybe you meant '==' ... Hai scritto un = dove serve un confronto. Usa ==.
Questi dovrebbero essere uguali, ma ottengo False Controlla tre cose: spazi di troppo (.strip()), maiuscole e minuscole (.lower()), e il tipo — "22" == 22 è sempre False, perché testo e numero non sono mai uguali.
TypeError: '<' not supported between instances of 'str' and 'int' Hai confrontato un testo con un numero, probabilmente dimenticando di convertire un input(). Avvolgilo in int().
Due decimali non risultano uguali con == È previsto — ricorda la trappola dei decimali del capitolo 5. Confronta dopo round().
La condizione non fa quello che dice Controlla l'ordine di and/or: prima not, poi and, poi or. Usa le parentesi per dichiarare esplicitamente cosa intendi.
Passo 4 di 6 — Prevedi
Verifica cosa hai capito
Qual è l'output di queste tre righe?
print(5 > 3 and 2 > 4)
print(5 > 3 or 2 > 4)
print(not 5 > 3)- AFalse True True
- BFalse False True
- CTrue True False
- DFalse True False
Come viene considerato vero o falso ciascuno di questi tre valori?
print(bool("False"))
print(bool(""))
print(bool(0))- ATrue False False
- BTrue True False
- CFalse True False
- DFalse False False
La persona ha digitato Yes (Y maiuscola, uno spazio finale) e il programma dice Continuing: False. Perché, e qual è la correzione migliore?
answer = input("Type yes to continue: ")
print("Continuing:", answer == "yes")- A`answer` va prima convertito con `bool()`
- BIl `==` dovrebbe essere un `=`
- CSia lo spazio finale sia la maiuscola contano in un confronto — serve `answer.strip().lower() == "yes"`
- DUn `input()` non potrà mai essere uguale a `"yes"`, quindi bisogna usare `in`
Per rispondere serve un account
Accedi per verificare le tue risposte
Le domande sono qui sopra, e ragionarci a mente è la parte che conta. Accedi per vedere le risposte, le spiegazioni e i suggerimenti a tre livelli.
Tocca a te
Scrivi un file chiamato password_check.py che riceve una password e stampa True/False per quattro domande:
- La lunghezza è almeno 8
- La lunghezza è compresa tra 8 e 20 (scrivilo come confronto concatenato)
- La parola
"password"non compare al suo interno (ti serviranno sianotsiain, e dovrai mettere tutto in minuscolo prima di confrontare) - Se tutte e tre le condizioni precedenti sono vere insieme
Poi eseguilo con almeno quattro password diverse: una molto corta, una molto lunga, una che contiene Password con la maiuscola, e una che rispetta tutto. Verifica che tutte e quattro diano la risposta giusta — soprattutto la terza, perché è lì che si nasconde la trappola delle maiuscole.
In questa missione c’è di più
Quello che hai letto sopra è la missione completa: non è stato tagliato nulla. Pro aggiunge:
- Cosa succede davvero dietro le quinte: come Python lo esegue
- La soluzione completa dell’esercizio, svolta passo per passo
- Esercizi extra più difficili
- La domanda da colloquio su questo argomento, con una risposta modello
Passo 6 di 6
Sfida — il quiz del capitolo
Dieci domande dalla più facile alla più difficile. Le ultime sono difficili di proposito.
Accedi per fare il quiz