Expressions booleanes
En aquesta lliçó aprendreu un nou tipus de dada: els booleans. No tots els llenguatges el tenen, hi ha llenguatges de programació que els valors booleans s’implementen amb els enters. Però el concepte intuïtiu és universal.
Expressions booleanes i operadors
Per aprendre sobre booleans resoldrem pas a pas dos reptes: en primer lloc, se us presentaran les dades i expressions de tipus booleà, i, en segon lloc, utilitzareu aquestes dades amb les estructures de control condicionals (els if).
Pas 1: tipus de dada booleana
El 2 és major que el 3? Quina resposta donaríeu a aquesta pregunta? Podeu afirmar que la resposta a aquesta pregunta és un enter o un float? Segur que no.
Les dades i els operadors booleans formen part d’una estructura algebraica creada per George Bool que s’anomena àlgebra booleana.
És una cadena o string? Tot i que podeu pensar que la resposta és “no”, segur que la vostra intuïció us diu que no té a veure amb les lletres “n” i “o”, sinó que és un concepte semblant a cert o fals. Aquesta és la resposta de l’intèrpret interactiu:
>>> 2 > 3 False >>> 3 > 2 True
Una dada de tipus booleà coincideix amb el concepte intuïtiu de cert o fals. Per tant, només pot tenir aquests dos valors: True (cert) o False (fals).
És molt important entendre que la dada booleana corresponent a cert és True. Escrit exactament d’aquesta manera. Què passaria si no ho escriviu exactament així? Avaluarem a continuació cas per cas. Fixeu-vos com respon l’intèrpret amb diverses variacions de True:
>>> 'true' 'true' >>> 'True' 'True'
Ja sabeu que qualsevol combinació de caràcters tancats entre les cometes simples (') o dobles (“) és una dada de tipus string o cadena. És a dir, ‘true’ o ‘True’ per al processador són del mateix tipus de dada que ‘hola’ o qualsevol text. És una cadena i no és un booleà. Quin resultat us trobaríeu si li doneu a l’intèrpret interactiu la variació true ? Vegeu-ho en codi:
>>> true Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'true' is not defined. Did you mean: 'True'?
La combinació de caràcters true, Python l’interpreta com el nom d’una variable que encara no ha estat definida. Com que no és cap de les paraules clau i no és una cadena, ha de ser una variable (tot i que és molt llest i ja veu què està passant: li costa molt imaginar algun cas que tingués sentit anomenar true a una variable).
Finalment, què passa quan indiquem a l’intèrpret el valor correcte? Ho podeu provar en codi:
>>> True True
En aquest exemple no és ni una cadena ni l’intèrpret s’ho pren com a nom d’una variable. És un valor que reconeix (de la mateixa manera que si escriviu el nombre 3), i és una paraula que té reservada per indicar el valor cert d’una dada booleana. El mateix passa amb False. Com amb tots els altres tipus de dades, poden ser assignades a variables amb l’operador assignació ( = ) i es pot operar amb elles si respectem les normes del llenguatge.
Pas 2: operadors relacionals
Ja coneixeu els operadors aritmètics que treballen sobre dades de tipus numèric. També heu constatat que com a resultat d’una comparació ha aparegut “el primer booleà”: al combinar l’operador binari relacional o de comparació > (major) entre dues dades numèriques (el 2 i el 3, dos enters en aquest cas) el resultat és una dada de tipus booleà.
Recordem que els operadors aritmètics operen sobre una o dues dades. Una en cas dels operadors unaris ( + i - aplicats a un sol nombre) i dues quan es tracta dels binaris ( + , - , * , / , //, % i **). Tots ells operen sobre enters i float i el resultat és una dada de tipus enter o float, segons el cas, però sempre una dada numèrica.
Hi ha una altra família d’operadors que es diuen operadors relacionals o de comparació. Aquests operadors estan definits pels símbols > , < , >= , ⇐ , == i != . Els operadors relacionals són operadors binaris. Això significa que, per llegibilitat, heu de posar un espai en blanc a cada costat. Si l’operador consta de dos símbols (com >= o == ), s’han d’escriure sense espais al mig.
Els operadors de comparació són operadors binaris que poden actuar entre diversos tipus de dades. El resultat sempre serà una dada de tipus booleana, és a dir, True o False.
Tal com podeu veure a la taula, es poden establir diferents tipus de comparacions:
| Operador | Comparació |
|---|---|
| a < b | a és menor que b |
| a > b | a és major que b |
| a ⇐ b | a és menor o igual que b |
| a >= b | a és major o igual que b |
| a == b | a és igual que b |
| a != b | a és diferent que b |
Estudiarem aquests operadors separats en dos grups.
Operadors >, <, >=, <=
El sentit comú ens indica que podem aplicar el concepte “major” entre dues dades numèriques, tant si són dos enters, dos float o una dada de cada tipus.
Exemple de comparacions
Podeu definir intuïtivament el resultat booleà de cada una d’aquestes afirmacions:
- 2 és major que 2.5: fals
- 1 és major o igual que 2: fals
- -1 és major o igual que -2: cert
Comproveu que si escriviu correctament aquests conceptes en un llenguatge entenedor per al processador, el resultat serà una dada booleana que indica el mateix concepte que cert o fals, segons cada cas. Utilitzeu l’intèrpret interactiu per fer aquesta comprovació:
>>> 2 > 2.5 False >>> 1 >= 2 False >>> -1 >= -2 True
Més endavant veureu que es pot estendre la definició d’aquests operadors a altres tipus de dades, però d’entrada ens quedem amb el que diu el sentit comú i només s’utilitzaran els operadors > , < , >= i ⇐ amb dades numèriques.
Operadors == i !=
Són els operadors igual i diferent. Podeu aplicar la intuïció si operem dades numèriques (com abans) sense cap problema:
- 2 és igual que 3: fals
- 7.5 és diferent que 7.55: cert
Què us diu la intuïció que pot passar si useu aquests operadors amb altres tipus de dades, o barrejant dades de diferents tipus? A la taula teniu recollit el que probablement us diria la vostra intuïció:
| Concepte | Resultat intuïtiu |
|---|---|
| 2 és diferent que ‘hola’ | cert |
| 2 és igual que True | Fals |
| True és igual que True | Cert |
| True és diferent que False | Cert |
| ‘hola’ és igual que ‘adeu’ | Fals |
| True (com a booleà) és igual que true (com a cadena) | Fals |
| 2 és 2.0 | Cert |
| True és igual a 1 | Fals |
Comproveu amb l’intèrpret interactiu que contesta el mateix que ens diu el sentit comú (en quasi tots els casos). Si ho feu, obtindreu els següents resultats:
>>> 2 != 'hola' True >>> 2 == True False >>> True == True True >>> True != False True >>> 'hola' == 'adeu' False >>> True == 'true' False >>> 2 == 2.0 True >>> True == 1 True
Atenció amb l’última! El processador diu que True i 1 són el mateix! Per què? Ho veurem aviat.
Operacions sense sentit
Acabeu de veure que, tal com indica la intuïció, els operadors < , < , >= , <= es poden utilitzar entre dues dades de tipus numèric (de moment), i, en canvi, els operadors == i != poden actuar entre tots els tipus de dades, tant si els dos operands són del mateix tipus com si no.
En alguns llenguatges de programació, com per exemple el C, no hi ha dades booleanes. Per indicar que una cosa és certa s’utilitza el valor 1, i per dir que és falsa el valor 0. Molts llenguatges, tot i tenir dades booleanes, també mantenen aquests valors per tradició.
Això té sentit, ja que vosaltres també sou capaços de dir si dues coses són iguals o diferents encara que no siguin del mateix tipus. Si prenem com a referència la comparació entre diferents ingredients d’un àpat, com pastanagues, carabassó, tomàquet, sal, oli… podeu assegurar que la pastanaga i la sal són diferents tot i no ser els dos ingredients del tipus verdura. És a dir, les podeu comparar amb “són diferents”. També podeu dir que la pastanaga i el carabassó són verdures diferents.
En canvi, costa molt definir una relació d’ordre (major o menor) si no es parla en termes de nombres. Si tornem a l’exemple dels ingredients, si no tenim número que quantifiqui aquests ingredients, no podem comparar si és major la pastanaga o el carabassó.
L’excepció és el resultat de la comparació:
>>> True == 1 True
Aquest resultat és així per raons històriques. Tot i que són dades diferents i de diferent tipus, es manté el valor de True com a 1 i de False com a zero. Per definició, per comparar dos elements hi ha d’haver una relació d’ordre definida (cal saber quin va primer).
Què passa si utilitzeu els operadors < , < , >= i <= entre tipus de dades diferents o amb dades que no són numèriques? No té sentit, i es produeix un error (amb l’excepció del cas anterior).
Observeu la taula. Hi ha l’operació, el que ens ha dictat la intuïció (que espero que a tots us digui el mateix) i en l’última columna hi ha el que ens respon l’intèrpret. Comproveu cada cas, i llegiu les explicacions quan el processador accepta una cosa que no té sentit.
| Expressió | Sentit comú | Python |
|---|---|---|
2 > ‘hola’ | No té sentit | Error |
True > False | No té sentit | True |
2 > False | No té sentit | True |
‘hola’ > False | No té sentit | Error |
‘adeu’ > ‘hola’ | No té sentit | False |
1 == True | Fals | True |
Per què aquests resultats? Vegeu-ho cas per cas:
>>> 2 > 'hola' Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: '>' not supported between instances of 'int' and 'str'
En aquest cas, no es poden comparar nombres i cadenes i es produeix un error.
>>> True > False True
Les dades booleanes no tenen un ordre definit (no són una major que l’altra). El més lògic seria no fer comparacions entre booleanes. L’intèrpret ho permet perquè identifica True amb 1 i False amb 0. Però millor si no utilitzeu comparacions que no tenen sentit.
>>> 2 > False True
Continua sense tenir sentit, però l’explicació és la mateixa que en el cas anterior.
>>> 'hola' > False Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: '>' not supported between instances of 'str' and 'bool'
No es poden comparar strings i booleans, de la mateixa manera que no pot comparar strings i enters.
>>> 'adeu' > 'hola' False
Aquest cas tot i semblar que no tingui sentit, és correcte. Hi ha una relació d’ordre definida entre les cadenes que permet comparar-les.
Ara ja enteneu els resultats següents, tot i que és recomanable no utilitzar aquestes comparacions:
>>> False == 1 False >>> False == 0 True >>> True == 5 False
Pas 3: prioritat dels operadors relacionals
En una mateixa operació pot haver-hi una combinació de tots els tipus d’operadors que hem vist fins ara. Hi pot haver operadors aritmètics al mateix temps que operadors de comparació. Els aritmètics tenen prioritat, respectant el seu ordre.
Tots els operadors de comparació tenen la mateixa prioritat i s’han de resoldre després dels operadors aritmètics.
Com sempre, davant d’operadors amb la mateixa prioritat, es comença d’esquerra a dreta. Els parèntesis permeten modificar totes les prioritats.
Exemple de prioritat dels operadors aritmètics
S’han de resoldre els operadors aritmètics abans que els relacionals, de manera que si fem els càlculs aritmètics, obtenim:
1 + 4 >= 1 + 5 * 7
5 >= 1 + 35
A continuació:
5 >= 36
La resposta serà la dada booleana False.
Exemples de prioritat dels operadors aritmètics
Penseu el resultat de les següents expressions i verifiqueu-lo amb l’intèrpret interactiu.
1 + 2 * 3 < (1 + 2) * 3 2 * (5 % 2) >= 2 a = 2 != -2 * (4 % 2) a
Un cop fet, haureu obtingut els següents resultats. Ho veurem pas per pas:
- En el primer cas, veureu que si feu les operacions aritmètiques, arribareu a l’expressió
7 < 9, que és certa.
>>> 1 + 2 * 3 < (1 + 2) * 3 True
- A la segona expressió, si feu les operacions aritmètiques, arribareu a l’expressió
2 >= 2, que és certa.
>>> 2 * (5 % 2) >= 2 True
- Finalment, a aquesta última operació hem fet una assignació. En les assignacions, primer cal fer el càlcul de l’operació de la dreta i assignar el resultat a la variable de l’esquerra. En calcular el valor de l’operació cal primer buscar els resultats aritmètics i després el valor de la comparació. Per últim, s’assigna aquest valor a la variable a.
En aquest cas, el resultat aritmètic seria el resultat de -2 * (4 % 2) que és -2 * (0) i, per tant, 0. La comparació que es fa a continuació serà 2 != 0 . El resultat (cert) és el que assignem a la variable a.
>>> a = 2 != -2 * (4 % 2) >>> a True
Fixeu-vos que les variables poden contenir dades de qualsevol mena, també booleanes.
Es pot donar el cas que l’expressió estigui mal construïda i us trobeu que, així i tot, es pot continuar. En aquests casos heu de pensar que hi ha un error. No és recomanable intentar desxifrar les respostes del processador en operacions que no siguin lògiques: el Python intenta solucionar molts problemes però de vegades els resultats són difícils d’interpretar.
A continuació teniu un exemple:
Exemple d'operació mal construïda
El parèntesi modifica la prioritat, i serà el primer que s’ha de resoldre. El resultat serà
(2 <= 10) + 3
True , de manera que al final s’ha de calcular.
True + 3
L’operador + no té sentit que estigui definit entre booleans, ni entre nombres i booleans. Encara que el processador ho executi i doni 4 com a resultat, és una expressió que s’ha de considerar que està mal definida.
Cal que us acostumeu a utilitzar expressions ben construïdes perquè altres llenguatges, que probablement aprendreu en un futur, són molt més restrictius que el Python.
Pas 4: Operadors lògics
Les dades de tipus booleà també es poden combinar utilitzant operadors, donant com a resultat una altra dada. En aquest cas també serà un booleà.
Els operadors que operen sobre dades booleanes s’anomenen operadors lògics. Només actuen entre dades de tipus booleà i el resultat és una altra dada booleana.
Existeixen 3 operadors lògics en Python: l’operador and , l’operador or i el not .
Operador and
and és un operador binari (que actua sobre dues dades), i permet expressar el fet que dues coses siguin certes alhora. Coincideix amb la nostra idea de de conjunció, és a dir “i”.
Exemple d'ús de l'operador and
Si avui és dimecres 20 d’octubre, avalueu la següent expressió:
“Avui és dimecres i estem en el mes d’octubre”.
Tots coincidireu que el que és una sentència certa. A la proposició “avui és dimecres” li diem a. El que diu la proposició a és cert.
A la proposició “estem en el mes d’octubre” li diem b. El que diu la proposició b és cert.
“Avui és dimecres i estem en el mes d’octubre” es formularia com: a and b . El seu valor també és cert.
Comproveu el següent amb l’intèrpret interactiu:
>>> a = True >>> b = True >>> a and b True
Heu unit dos fets (o diguem-ne el concepte booleà sobre la certesa de dos fets) amb un operador.
Donat que els valors booleans només són dos, és fàcil fer una taula on hi hagi tots els casos possibles. Això es diu taula de la veritat.
Una taula de la veritat dels operadors lògics és una taula on es recullen totes les possibles combinacions que es poden donar entre les dades booleanes i un operador en concret. La taula recull les combinacions i el resultat de cada una.
Observeu la taula
| a | b | a and b |
|---|---|---|
| True | True | True |
| True | False | False |
| False | True | False |
| False | False | False |
A continuació a taula teniu uns exemples semblants a l’anterior perquè vegeu intuïtivament perquè els resultats són aquests. En aquests exemples i en els dels següents operadors, suposarem que avui és dimecres 20 d’octubre.
| Cas per a | Valor a | Cas per b | Valor b | Cas combinat | Valor a and b |
|---|---|---|---|---|---|
| avui és dimecres | True | estem al mes d’octubre | True | avui és dimecres i estem al mes d’octubre | True |
| avui és dimecres | True | és el mes de gener | False | avui és dimecres i és el mes de gener | False |
| avui és dissabte | False | estem al mes d’octubre | True | avui és dissabte i estem al mes d’octubre | False |
| avui és dissabte | False | és el mes de gener | False | avui és dissabte i és el mes de gener | False |
Operador or
or és un operador binari que permet expressar el fet que almenys una de les dues sentències és certa. Coincideix amb la idea de “o” no excloent, és a dir, que si cap de les dues proposicions és certa, la resultant tampoc.
A taula podeu veure els possibles valors d’expressions construïdes amb l’operador or.
| a | b | a or b |
|---|---|---|
| True | True | True |
| True | False | True |
| False | True | True |
| False | False | False |
A continuació, a la taula teniu uns exemples perquè vegeu intuïtivament perquè els resultats són aquests. Continuem suposant que avui és dimecres 20 d’octubre.
| Cas a | Valor de a | Cas b | valor de b | Cas a or b | Valor a or b |
|---|---|---|---|---|---|
| avui és dimecres | True | estem al mes d’octubre | True | avui és dimecres o estem al mes d’octubre | True |
| avui és dimecres | True | és el mes de gener | False | avui és dimecres o és el mes de gener | True |
| avui és dissabte | False | estem al mes d’octubre | True | avui és dissabte o estem al mes d’octubre | True |
| avui és dissabte | False | és el mes de gener | False | avui és dissabte i és el mes de gener | False |
Operador not
not és un operador unari que permet expressar el contrari d’un fet. Si una cosa és certa, el seu contrari és fals i viceversa.
En ser un operador unari (es nega una sola cosa), la seva taula de veritat és molt simple: taula
| a | not a |
|---|---|
| True | False |
| False | True |
A la taula taula teniu l’exemple corresponent al dimecres 20 d’octubre:
| a | not a |
|---|---|
| avui és dimecres | avui no és dimecres |
| avui és no dimecres | avui no és no dimecres |
Si us fixeu en l’última proposició, intuïtivament esteu establint la base de l’àlgebra de Boole. Quan dic “avui no és no dimecres” és el mateix que “avui és dimecres”. De la mateixa manera: not False
és el mateix que True .
La doble negació és una afirmació.
Pas 5: prioritat dels operadors
Intenteu pensar quin és el resultat de la següent expressió:
not 5 <= 3 + 2 % 5 and False or 2 != 3
Que difícil! Executeu-la mitjançant l’intèrpret interactiu i comproveu si l’heu encertada o no (hi ha un 50% de possibilitats).
Està clar que quan interactuen diferents tipus de dades i d’operadors en una mateixa expressió, cal saber quins hem de resoldre abans que els altres, és a dir, quins tenen més prioritat. En el nostre dia a dia no hem de resoldre aquest tipus de problemes i és possible que no sapiguem per on començar.
Els operadors aritmètics sempre són els que s’han de resoldre primer, seguits dels relacionals i finalment pels lògics.
Però atenció, perquè de la mateixa manera que tots els aritmètics no tenen la mateixa prioritat, els lògics tampoc.
La màxima prioritat entre els operadors lògics és per al not , després ve l’ and i finalment l’ or .
Exemple de prioritat dels operadors
Aquesta és la resolució pas a pas de l’exemple:
not 5 <= 3 + 2 % 5 and False or 2 != 3
- Resoldre els operadors aritmètics, segons la seva prioritat: l’expressió quedarà reduïda a:
- not 5 <= 5 and False or 2 != 3
- Resoldre els operadors relacionals. L’operació quedarà:
- not True and False or True
- Resoldre els operadors lògics. Primer el
not:- False and False or True
- Resoldre els operadors lògics. En segon lloc, l'
and:- False or True
- Resoldre els operadors lògics. Finalment l'
or:- True
Comproveu amb l’intèrpret que realment és així:
>>> not 5 <= 3 + 2 % 5 and False or 2 != 3 True
Feu a mà els passos en el següent exemple i comproveu amb l’intèrpret que ho heu fet bé:
>>> 7 < 5 or not 5 > 5 and 2 != 3 True
Tingueu en compte que sempre es poden utilitzar els parèntesis per a modificar l’ordre quan ho necessiteu, i és una bona pràctica posar parèntesis, encara que no calguin, en l’ús dels operadors lògics; utilitzar-ne de sobres en els aritmètics, però, és lleig. A més, i com en quasi tots els operadors aritmètics, quan es troben diversos operadors amb la mateixa prioritat cal començar a resoldre per l’esquerra.
Ja sabeu que el Python és capaç d’empassar-se expressions mal construïdes lògicament, sense detectar cap error i proporcionar un resultat que segurament no tindrà res a veure amb el que necessiteu. En aquests casos, heu de detectar quan una expressió està mal construïda abans d’enviar-la al processador.
Quan en una operació hi intervenen operadors de comparació o lògics, per saber si està o no ben construïda cal que verifiqueu el següent:
- Les comparacions (
>,<,>=,⇐) només tenen sentit entre dades del mateix tipus. De moment només les fareu servir entre dades numèriques. - Els operadors lògics només estan definits entre dades de tipus booleà. Si en una expressió apareix un operador lògic que connecta dades de qualsevol altre tipus, està mal definida (independentment que el processador l’executi i en doni un resultat).
Exemple d'expressió mal construïda
La prioritat dels operadors indica que s’ha de començar per la comparació. El resultat obtingut serà:
2 > 3 or 5
L’operador
False or 5
or només pot actuar entre dades booleanes, mai sobre el nombre 5. L’intèrpret ho executa i en dona un resultat, però no cal ni que l’intenteu interpretar.
Pas 6: peculiaritats del Python
Fixeu-vos en aquesta expressió i el resultat:
>>> -2 < -1 < 0 True
Està ben feta? Els operadors tenen la mateixa prioritat, el que indica que hem de començar per l’esquerra. Si apliqueu aquesta norma, primer caldria avaluar -2 < -1 que és cert. Per tant, hauríeu d’obtenir:
>>> True < 0 False
Però no esteu obtenint False , esteu obtenint True. Per què el que heu après fins ara no funciona? Si mireu ara l’expressió inicial fent servir el sentit comú matemàtic:
Sembla lògic que sigui una expressió certa, perquè matemàticament és correcta: -2 és inferior a -1, i 1 és inferior a 0. El Python, però, intenta entendre el que voleu dir i en fa una interpretació perquè coincideixi amb el llenguatge matemàtic. Python fa els següents passos interns perquè pugueu utilitzar aquesta expressió.
L’expressió matemàtica
és equivalent a dir que el -2 és menor que el -1, i que el -1 és menor que el 0.
Si construïu l’expressió lògica equivalent, obteniu:
-2 < -1 and -1 < 0
Que és exactament el que voleu dir amb l’expressió matemàtica.
El Python modifica internament l’expressió matemàtica,
que és correcta com expressió matemàtica, però que està mal construïda lògicament.
En aquest cas a < b < c la canvia per a < b and b < c.
Tot i que Python accepti construccions com l’anterior, millor si us acostumeu a escriure-ho correctament seguint les normes universals de la lògica que són les que utilitzen quasi tots els llenguatges de programació.
Pas 7: expressions booleanes
Ja sabeu escriure condicions (o expressions) booleanes, i podeu utilitzar-les per expressar amb un llenguatge rigorós oracions del nostre llenguatge parlat. Per exemple, per definir les especificacions d’entrada d’un programa.
També les utilitzareu per a fer programes amb estructures condicionals o repetitives, que segons el resultat d’una expressió booleana (és a dir, segons si és cert o fals) hauran de fer un recorregut o un altre.
Per veure les possibilitats que tenen les expressions booleanes, seguirem un parell d’exemples de traduir a expressió booleana algunes oracions “parlades”.
En el primer cas, fareu la traducció de la majoria d’edat a expressió booleana. En concret, si edat és una variable entera que conté l’edat d’una persona, quina és l’expressió booleana que determina que aquesta persona és major d’edat? Aquesta és una expressió senzilla i segur que ja intuïu la resposta.
Però una bona manera d’assegurar-vos que l’expressió lògica és correcta, és utilitzant una taula amb entrades semblants a un joc de proves: amb casos que comprenguin totes les possibilitats i els casos límit. A més, les expressions booleanes s’aniran complicant, i tenir habilitat en la creació de la taula d’entrades i sortides us resultarà molt útil. Comencem, doncs, per aquest cas més evident.
Per aquesta expressió lògica, podeu triar aquests exemples com a representatius: taula:
| Edat | Resultat de l’expressió |
|---|---|
| 3 | False |
| 18 | True |
| 65 | True |
És probable que hàgiu pensat que l’expressió pot ser:
edat >= 18
Només cal comprovar la taula per verificar que és correcta:
>>> edat = 3 >>> edat >= 18 False >>> edat = 18 >>> edat >= 18 True >>> edat = 65 >>> edat >= 18 True
En el segon exemple, avaluarem l’expressió lògica que avalua la condició d’any de traspàs. Un any és de traspàs (o bixest) si és múltiple de 4, excepte si és múltiple de 100. Els anys múltiples de 100 en general no són de traspàs, excepte en els casos que ho siguin de 400. Per exemple, els anys 2000 i 2024 són de traspàs, i, en canvi, el 2025 i el 2100 no ho són.
Si a i b són variables que contenen dades enteres, la condició a és múltiple de b s’escriu: a % b == 0. Que a sigui múltiple de b, és el mateix que dir que si a es divideix entre b, el residu és 0.
Podeu indicar si la següent expressió booleana, on a és una variable de tipus enter que conté un número que representa un any, tradueix de manera fidedigna si l’any és o no de traspàs?
(a % 4 == 0) and (a % 100 != 0)
Per començar, cal fer una taula amb els valors que volem que l’expressió acompleixi. Podeu utilitzar els mateixos que els exemples que tenim. El resultat seria semblant al següent:
| a | Valor |
|---|---|
| 2100 | False |
| 2025 | False |
| 2024 | True |
| 2000 | True |
Cal comprovar si l’expressió que heu d’avaluar acompleix o no la taula:
>>> a = 2100 >>> (a % 4 == 0) and (a % 100 != 0) False >>> a = 2025 >>> (a % 4 == 0) and (a % 100 != 0) False >>> a = 2024 >>> (a % 4 == 0) and (a % 100 != 0) True >>> a = 2000 >>> (a % 4 == 0) and (a % 100 != 0) False
Podeu observar que en el cas de l’any 2000 l’expressió no el detecta com a any de traspàs. Això vol dir que l’expressió no és correcta.
En els exercicis aprendreu a fer les taules que abastin tots els casos. L’habilitat requerida és la mateixa que per a fer els jocs de prova.
Aspectes clau dels booleans i expressions booleanes
Hi ha un tipus de dades que són els valors booleans. Aquestes dades permeten recollir els conceptes de cert i fals.
Els valors booleans només poden tenir dos valors: True i False.
Hi ha dues famílies d’operadors que generen dades de tipus booleà, els operadors relacionals i els operadors lògics.
Els operadors relacionals. Poden actuar sobre dades de diversos tipus i el resultat és un booleà.
Els operadors lògics. Només actuen entre dades booleanes i el resultat és un altre booleà.
Heu ampliat el coneixement sobre dades i operadors de Python. A continuació teniu una relació dels tipus de dades i dels operadors que ja coneixeu:
Operadors numèrics:
int(enter). Exemple: 2float(float). Exemple:2.02str(cadena). Exemple2,‘hola’bool(booleà). Només poden tenir 2 valors:TrueiFalse.
Conjunts d’operadors:
- Operadors aritmètics (
+,-,*,/,/ /,%,* *). Actuen sobre dades de tipus numèric i el resultat és una altra dada numèrica. - Operadors relacionals (
>,<,>=,>=,==,!=). Actuen bàsicament sobre dades de tipus numèric i el resultat és una dada de tipus booleà. - Operadors lògics (
and,or,not). Actuen sobre dades de tipus booleà i el resultat és un altre booleà.
Tots els tipus de dades que coneixem es poden combinar amb tots aquests tipus d’operadors (de moment, deixeu les cadenes a banda), sempre que seguim les normes de la lògica i respectem els tipus de dada amb els quals opera cada un.
Quan construïu o avalueu expressions, és imprescindible tenir en compte l’ordre de precedència dels operadors. Teniu una referència a taula.
| Operació | Operador | Tipus | Associativitat | Precedència |
|---|---|---|---|---|
| Exponenciació | ** | Binari | Per la dreta | 1 |
| Identitat | + | Unari | - | 2 |
| Canvi de signe | - | Unari | - | 2 |
| Multiplicació | * | Binari | Per l’esquerra | 3 |
| Divisió | / | Binari | Per l’esquerra | 3 |
| Divisió entera | // | Binari | Per l’esquerra | 3 |
| Mòdul | % | Binari | Per l’esquerra | 3 |
| Suma | + | Binari | Per l’esquerra | 4 |
| Resta | - | Binari | Per l’esquerra | 4 |
| Igual que | == | Binari | - | 5 |
| Diferent a | != | Binari | - | 5 |
| Major que | > | Binari | - | 5 |
| Menor que | < | Binari | - | 5 |
| Major o igual | >= | Binari | - | 5 |
| Menor o igual | ⇐ | Binari | - | 5 |
| Negació | not | Unari | Per l’esquerra | 6 |
| Conjunció | and | Binari | Per l’esquerra | 7 |
| Disjunció | or | Binari | Per l’esquerra | 8 |
Les expressions booleanes ens permeten descriure de manera rigorosa i inequívoca condicions que expressem amb el llenguatge parlat.



