Python - Algoritme

Un algoritme és un conjunt de sentències que resolen una tasca.

Introducció

Per podre resoldre una tasca, s’ha d’executar un conjunt instructions de manera:

  • Sequencial. Una a continuació de l’altre
  • Condicional. Si és compleix o no una condició.
  • Iterativa. Diverses vegades el mateix conjunt d’instruccions mentre es compleixi una condició.

Pots veure que un algoritme està format per condicions que determinen quines instruccions s’executen i quantes vegades s’executen.

A Computació vas coneixer els tipus int, float i string.

Ara toca presentar el tipus bool.

Obre un terminal tal com s’explica a de Powershell - Introducció.

Inicia l’intèrpret de Python en mode interactiu:

uv run python

Condició

Una condició consisteix en una comparació dos valors (o dues variables).

El resultat d’aplicar una condició a un cas concret és un valor de tipus bool que indica si la condició es compleix o no es compleix.

Per representar el resultat d’una condició utilizes una variable de tipus bool perquè en el món de Python una condició es compleix o no es compleix.

El tipus bool només té dos valors: True i False.

>>> type(True)
<class 'bool'>
>>> type(False)
<class 'bool'>

Una variable pot tenir un valor de tipus bool.

>>> a = True
>>> a
True

==

Pots comparar sí dos valors són iguals amb l’operador ==.

>>> 100 == 100
True
>>> 50 == 100
False
>>> "hola" == "hola"
True
Activitat

Primer pensa 😺, i després verifica quin és el resultat de les condicions que es mostren a continuació:

200 == 200
200 == 100
"rosa" == "rossa"
"flor" == "flor"
2 == 2.0
2 == 2.1
"3" == 3
"hola" == "hello"
"Hola" == "hola"

Pots veure que per Python una majúscula i una minúscula són lletres diferents.

Per tant "A" no és igual a "a".

!=

Pots comparar sí dos valors no són iguals amb l’operador !=.

>>> 2.0 != 2.1
True
>>> 2.0 != 2.0
False

Pots veure que el resultat sempre és el contrari de l’operador ==.

On l’operador == diu True, l’operador != diu False.

Activitat

És molt important que llegeixis el codi amb el teu llenguatge natural:

3 == 3              # 3 és igual a 3? Si!
3 != 3              # 3 no és igual a 3? No!
"hola" != "hola"    #
2 != 2.0            #
"hola" != "hello"   #

>

L’operador > serveix per comparar si el número de l’esquerra és major que el de la dreta

>>> 50 > 40
True
Activitat

Quin és el resultat de les condicions que es mostren a continuació?

300 > 100
300 > 300
100 > 300
200 > 200.0
25.2 > 25.1
"hello" > "bye"
"bye" > "hello"

PENDENT

x > y      # x és major que y
x < y      # x és menor que y
x >= y     # x és major o igual que y
x <= y     # x és menor o igual que y

Un altre error és enlloc d’escriure >= o <=, escriure => o =<:

>>> 3 => 3
  File "<stdin>", line 1
    3 => 3
    ^
SyntaxError: cannot assign to literal

Execució sequencial

Crea un projecte amb uv init:

uv init algo

Instal·la PyCharm.

Obre el projecte amb pycharm:

pycharm algo

Si recordes de Computació, per defecte l’intèrpret de Python executava totes les sentències d’un script.

A continuació modifica el codi de main.py (borra el que hi ha).

Per exemple, tens la variable name:

name = "Elena"

A continuació escriu una condició que el name és igual a "Laura".

name = "Elena"
name == "Laura"

I saluda a Laura amb una 🦋 si name és igual a "Laura":

name = "Elena"
name == "Laura"
print(f"Hola {name}! 🦋")
print("👻")

Executa el codi:

El resultat és:

Hola Elena! 🦋
👻

Sort que el missatge no era f"Hola {name}! ❤️❤️❤️" 😅

En aquest codi, hi ha una condició, però cap element que avalui la condició i executi diferents sentències en funció de la condició.

Per tant, només té un únic flux d’execució.

name = "Elena"

name == "Laura"

Hola Laura! 🦋

👻

Execució condicional

Una execució condicional només s’executa si es compleix una condició …

Per tant, en una execució condicional l’intèrpret de Python no executa totes les sentències.

if

Una expressió condicional comença amb la paraula if seguit de la condició i finalitza amb ::

if <condition> :

A continuació de la sentència condicional hi ha un bloc de codi que només s’executarà si la condició és True.

name = "Elena"
if name == "Laura":
    print(f"Hola {name}! 🦋")
print("👻")

L’intèrpret de Python reconeix les sentències que formen part d’aquest bloc perquè estan sagnades amb el mateix nombre d’espais en blanc.

Activitat

Quines sentències formen part del bloc que s’executarà si name és igual a "Laura"?

Tal com està el codi, s’executaran aquestes sentències?

Ara l’script té dos fluxos d’execució possibles en funció del valor de la variable name:

True

False

name = "Elena"

name == "Laura"

👻

Hola Laura! 🦋

Una sentència if sempre crea dos fluxos possibles d’execució.

Per qué possibles? Per exemple, en aquest codi sempre s’executarà el mateix flux d’execució perquè el valor de la variable name és fix.

Per tal que aquest script tingui utilitat el valor de la variable name ha de ser indeterminat.

name = input("Con et dius? ")
if name == "Laura":
    print("Hola Laura! 🦋")
print("👻")

True

False

name = ?

name == "Laura"

👻

Hola Laura! 🦋

Ara ja pots executar el codi:

Activitat

A continuació tens un diagrama de flux d’un algoritme que permet comprar un iPhone per un preu de 600 € (o més 👻):

True

False

money = ?

iphone = 600

money >= iphone

Bye!

You have a new iPhone

Escriu el codi Python corresponent:

else

Amb la sentència condicional if creas un flux d’execució de sentències que s’executaran si la condició és True.

Però si la condició és False, i vols executar un conjunt de sentències si la condició és False, has d’utilitzar l’expressió else com pots veure a continuació.

Modifica el codi de main.py:

donation = int(input("Donatiu? "))
if donation > 5:
    print("Generós 😀")
else:
    print("Garrepa 🤨")
print("🦋")

Ara els dos fluxos d’execució executen codi específic a cada condició:

True

False

donation = ?

donation > 5

👻

Generós 🥳

Garrepa 🤨

Activitat

Abans has escrit un script que permet comprar un iPhone per un preu de 600 € (o més 👻).

Modifica l’script de tal manera que informi a l’usuari del preu que ha de pagar si no ofereix prou diners.

Ara si volem comprar l’iPhone per menys diners del que costa ens avisa que no pot ser perquè l’iPhone val 600 €.

$ uv run main.py
Euros: 34
iPhone cost 600 euros!
Bye!

Imbricació

Mitjançant una estructura if-else pots crear un o dos blocs de codi imbricats en el bloc de codi principal.

I aquests blocs al seu torn també poden tenir blocs de codi imbricats mitjançant estructures if-else dins d’ells.

En la tasca anterior vas crear un script que permet compra un iPhone.

Però aquest script no torna el canvi, i això al comprador no li deu fer gens de gràcia 🤨.

Pots modificar el codi de main.py per tal que torni el canvi:

money = int(input("Euros: "))
iphone = 600

if money >= iphone:
    print("You have a new iPhone!")
    if money > iphone:
        print(f"Your change is {money - iphone} euros")
    print("Great buy!")
else:
    print(f"The iPhone costs {iphone} euros!")

print("Bye!")

Si ara compres un iPhone per mes de 600 euros, l’script torna el canvi:

$ uv run shop.py
Euros: 800
You have a new iPhone!
Your change is 200 euros
Great buy!
Bye!

Blocs de codi

Python pot distingir els diferents blocs en què està estructurat l’script perquè totes les sentències d’un mateix bloc estan sagnades amb el mateix nombre d’espais en blanc:

Pots veure que hi ha quatre blocs d’execució, un de principal i els altres imbricats dins del principal o dins d’un altre.

Això s’anomena programació estructurada:

  • Un programa és una estructura de blocs uns dins dels altres, que s’executen de manera condicional.

  • Cada bloc és un conjunt de sentències que s’executa una després de l’altre.

Fluxes d’execució

Cada expressió if introdueix un nou flux d’execució!

Com que l’script té dos expression if, el programa té 3 fluxos d’execució possibles.

A continuació tens el diagrama de flux:

True

True

False

False

money ?

iphone = 600

money >= iphone

iPhone cost 600 euros!

Bye!

You have a new iPhone!

money > iphone

Your change is ... euros)

Great buy!

Execució iterativa

En moltes ocasions, ens interessa executar una mateixa sentència moltes vegades mentre es compleixi una condició.

L’expressió while repeteix un bloc de codi sempre que una condició es compleix.

És com dir-li a Python: “Repeteix això mentre alguna cosa sigui veritat”.

while <condició>:
    # codi a repetir

Vegem-ho amb un exemple senzill: per exemple, mostrar els números de l’1 al 5.

i = 1
while i <= 5:
    print(f"El número és {i}")
    i += 1
print("Adeu!")
El número és: 1
El número és: 2
El número és: 3
El número és: 4
El número és: 5
Adeu!

Igual que passa amb l’expressió if, l’expressió while introdueix un flux alternatiu.

La diferència és que aquest nou flux genera un bucle que finalitza quan la condició ja no és compleix.

A continuació tens el diagrama de flux corresponent.

False

True

i=1

i <= 5

Adeu!

El numero és ...

i +=1

A continuació tens un programa que demana a l’usuari números fins que introdueixi un 0.

result = 0
number = None

print("Anem a sumar números!")
while number != 0:
    number = int(input())
    result += number
    print(f"{result} + ", end="")

A continuació tens un exemple d’execució de l’script:

Anem a sumar números!
45
45 + 56
101 + 88
189 + 0
189 +
Activitat

Crea un script guess.py que ha d’endevinar un número entre 1 i 100.

import random
number = random.randint(1, 100)
guess = None

print("Guess a number: ", end="")
while ...

Condicions complexes

Una condició complexa està formada per la unió de condicions simples mitjançant operadors lògics.

Obre una sessió interactiva amb l’intèrpret de Python:

uv run python

and

L’operador and compara dos bool i torna True només si els dos valors són True.

>>> True and True
True
>>> True and False
False

Completa la taula de la veritat:

aba and b
TrueTrueTrue
TrueFalseFalse
FalseTrue
FalseFalse

Per exemple, tens un script que només permet treballar a aquelles persones majors de 15 anys i menors de 68.

Si només utilitzes condicions simples has d’escriure el programa amb if imbricats:

age = int(input("Age? "))
if age > 15:
    if age < 68:
        print("Pots treballar!")
    else:
        print("No pots treballar")
else:
    print("No pots treballar")

La condició “majors de 15 anys i menors de 68” es pot escriure literalment en Python:

>>> age = 30
>>> age > 15 and age < 68
True

Es tracta d’una condició complexa formada per dos condicions simples:

>>> age = 30
>>> age > 15
True
>>> age < 68
True
>>> True and True
True

Per tant, pots reescriure l’script amb una condició complexa:

age = int(input("Age? "))
if age > 15 and age < 68:
    print("Pots treballar!")
else:
    print("No pots treballar")

Segur que la IDE et fa el suggeriment que pots simplificar l’expressió condicional:

age = int(input("Age? "))
if 15 < age < 68:
    print("Pots treballar!")
else:
    print("No pots treballar")

or

L’operador or compara dos bool i torna True si algún valor és True.

>>> True and True
True

Completa la taula de la veritat:

aba or b
TrueTrueTrue
TrueFalse
FalseTrue
FalseFalse

A continuació tens un exemple amb or:

answer = input('Do you...? (yes/no): ')
if answer == 'yes' or answer == 'y':
    print('Yes!')

Es tracta d’una condició complexa formada per dos condicions simples:

>>> answer = "yes"
>>> answer == "yes"
True
>>> answer == "y"
False
>>> True or False
True

not

L’operador not nega la condició:

>>> not True
False

Completa la taula de la veritat:

anot a
TrueFalse
False

Activitats

PENDENT