Nota

Pots trobar aquest material en format pàgina web a la plataforma readthedocs

Open In Colab

Si no funciona el botó, pots copiar i aferrar la següent direcció al teu navegador: https://colab.research.google.com/github/wisaaco/TallerPythonFEE/blob/main/lessons/1/1_PythonIntroduccio.ipynb

1 - El ecosistema de Python

Què és Python?

Python és un llenguatge de programació interpretat on destaca la seva filosofia d’una sintaxi fàcilment interpretable. Va ser creat per Guido van Rossum en 1991.

És un llenguatge dissenyat perquè les aplicacions siguin independents de la plataforma en la qual s’executen. Això significa que un programa escrit en aquest llenguatge s’executarà sense cap mena de modificació en qualsevol sistema informàtic, almenys en qualsevol sistema que suport-hi Python.

Emprar Python en lloc d’aplicacions com R, fulls de càlcul o d’altres tipus fa que l’objectiu implementat, per exemple el tractament de dades, sigui un procés més àgil i eficient. És a dir, es pot treballar amb una gran diversitat de formats de dades al mateix temps i amb un gran volum de mostres per obtenir diferents tipus de resultats: numèrics, visuals estadístics, visuals geogràfics i una altra vegada com a dades intermèdies d’altres processos.

En definitiva, Python es caracteritza pel seu potencial de funcionalitats ja implementades, i per oferir una fluïdesa a tots els nivells computacionals i lògics.

Referències: - Documentació a wikipedia: enllaç

Com executar codi Python?

En aquest curs no descriurem com fer una instal·lació de Python al nostre sistema. Emprarem altres mètodes més còmodes per a un curs d’iniciació.

Maneres d’executar codi de Python:

  • Al seu entorn interactiu.

  • Des d’una terminal del Sistema Operatiu

  • Amb editors de codi: Visual Studio, PyCharm, Sublime, Atom, etc.

  • Amb editors webs interactius basats en Jupyter Notebooks. > en el nostre cas amb Google Colab

Google Colab

Colab és un entorn d’edició i execució de codi Python basat en l’entorn de Jupyter. Jupyter un projecte de codi obert iniciat l’any 2014 que permet l’execució interactiva de petits trossos de codi. Aquesta manera de programar amb interacció contínua facilita l’aprenentatge.

És un servei gratuït de Google i només és necessari tenir compte d’usuari. Per accedir a aquest notebook pitja el següent botó: Open In Colab

Funcionament

Els notebooks es divideixen en cel·les, una cel·la pot contenir codi Python o text en format Markdown (més informació). Això ens dona la capacitat d’emprar els notebooks per generar informes intercalant codi i gràfiques amb text descriptiu.

Aquesta documentació està feta amb Jupyter Notebooks!

Referències a manuals de Markdown:

[1]:
# Això és un comentari d'una cella amb codi.
# Els comentaris són importants per descriure línies de codi complicades.
# Si et trobes a Colab pots executar aquesta cel·la fent: shit+enter o pitjant la icona de triangle

print("Hello World !")
print("Print a list of numbers: %s" % list(range(10)))
Hello World !
Print a list of numbers: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Nocions bàsiques de Python

Abans de fer feina amb dades, és necessari començar amb els elements més bàsics del llenguatge que ens serviran per entendre la lògica d’un programa.

Un programa es pot definir com una seqüència d’operacions que s’han d’aplicar a un conjunt de dades en un ordre determinat per realitzar una tasca específica en un computador.

Dades i variables

Les dades que utilitzen els programes es guarden dins la memòria de l’ordinador mitjançant variables. Com el nom indica, una variable pot canviar de contingut al llarg de l’execució d’un programa.

Tenen tres característiques que les defineixen completament: el seu nom, el seu tipus i el seu valor.

A continuació podem observar com podem crear diferents variables de diferents tipus:

[2]:
caracter = 'a'
estring = "Hello!" # Un string és una cadena de caràcters
enter =  123
decimal = 1.23
complexe = 1+23j
logic = False

print(type(caracter))
print(type(estring))
print(type(enter))
print(type(decimal))
print(type(complexe))
print(type(logic))

# Pots crear totes les variables que vulguis amb format lliure.
# Intenta que les variables tinguin un nom adequat al seu contingut.
# No poden tenir espais, símbols i accents.

nameCognoms = "Pep Vila"
telefono = "97100000"
dni = "34989542A"
pes = 80.3

<class 'str'>
<class 'str'>
<class 'int'>
<class 'float'>
<class 'complex'>
<class 'bool'>

Llistes

Les llistes són un tipus de dades especial que permeten guardar diferents valors en una sola variable. De moment només mostrarem un exemple, més endavant en farem més feina:

[3]:
# Definirem una variable de tipus llista que conté 4 valors
pesos = [1.3, 40.3, 20.0, -1.0]

print(pesos)
[1.3, 40.3, 20.0, -1.0]

Operadors

Un llenguatge de programació ofereix operacions aritmètiques i lògiques relacionades amb el tipus de dades.

En Python, els operadors són símbols especials que indiquen que és necessari realitzar algun tipus de computació. Els valors amb els quals actua un operador es diuen operands.

Ho entendrem amb un petit exemple:

x = 10.0
i = 5
resultat = x + i

En aquest cas, l’operador + ens permet sumar els operands x i i junts i guardar el resultat en la variable del mateix nom. Hem de destacar que en aquest codi hem necessitat definir tres variables diferents.

Un operand pot ser una variable o literal. Definim els literals en un programa com la idea d’expressar un valor que no canvia en el codi font, aquests han de ser d’un dels diferents tipus de dades que hem descrit anteriorment.

A continuació tenim un altre fragment de codi en el qual usem altres operadors i literals de tipus sencer:

a = 10
b = 20
x = 45
r = (a + b - 5) + (x + 10 + 20)

Operadors aritmètics

[4]:
# Els explicarem amb un exemple sobre variables de tipus enter
a = 10
b = 20

resultat = a + b # suma
print(resultat)
print(a-b) # resta
print(-a)  # negació
print(a*b) # multiplicació
print(a/b) # divisió
print(a%b) # modul
print(a//b) # divisió entera
print(a**b) # exponent
print("---")

# Veurem que es poden emprar els mateixos operadors amb altres tipus de dades.

a = 10.3
b = 2.34
resultat_decimal = a + b # suma
print(resultat_decimal)
print(a%b) # modul flotant
print(a//b) # divisió entera
print(a**b) # exponent
print("---")

# Nombres complexes

aj = 1+23j
bj = 23j

print(aj-bj) # resta complexe
print(-aj)  # negació complexe
print(aj*bj) # multiplicació complexe

30
-10
-10
200
0.5
10
0
100000000000000000000
---
12.64
0.9400000000000013
4.0
234.4439909630706
---
(1+0j)
(-1-23j)
(-529+23j)

Operadors de Comparació

[5]:

a = 10 b = 12 print(a==b) # Igualtat print(a!=b) # diferència print(a>b) print(a<b) print(a>=b) print(a<=b) print("---") a = 10.0 b = 10.0 result = a==b print(result)
False
True
False
True
False
True
---
True

Operadors lògics

[6]:

a = 10.0 b = 10.0 c = True f = False print(not(a==b)) print(c or f) print(c and (a==c)) print(True and True) print(False or True) print(not(not(not(True))))
False
True
False
True
True
False

Mostrar informació per pantalla

Com podem intuir amb els exemples amb els operadors la funció print serveix per mostrar informació per pantalla. A continuació il·lustrarem usos més avançats per donar missatges complets a l’usuari:

[7]:
# Print data
a = "HOLA"  # Això és una cadena de caràcters: String
b = 10
c = 3.141618

print("This is the value of a string %s"%a)
print("This is the value of a integer %i"%b)
print("This is the value of a float %f"%c)
print("This is the value of a float %0.2f"%c)

print("---")
print("Print a float as a integer %i"%c)
print("Print a integer as a string %s"%b)

print("---")
print("Print a string as a float %f"%a) # Obtenim un ERROR!!!
This is the value of a string HOLA
This is the value of a integer 10
This is the value of a float 3.141618
This is the value of a float 3.14
---
Print a float as a integer 3
Print a integer as a string 10
---
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Cell In[7], line 16
     13 print("Print a integer as a string %s"%b)
     15 print("---")
---> 16 print("Print a string as a float %f"%a) # Obtenim un ERROR!!!

TypeError: must be real number, not str

Operacions de control

En aquest curs no volem introduir molta complexitat, però és necessari entendre que podem fer certes operacions de control amb les dades: recorreguts de seqüències, comprovacions, etc.

Els operadors condicionals ens permeten realitzar brancaments en el nostre codi.

Tenim la següent construcció que permet tenir dues branques d’execució en el codi:

if <expr>:
    <cos(+)>
else:
    <cos(+)>

L’ <expr> és una expressió de tipus lògic, és a dir s’ha de poder avaluar com a True o False.

[8]:
name = "Pep"
grau = 0.3

if name == "Pep":  # Si el nom és Pep multiplicar per 10
    factor = 10
else:  # Si és diferent llavors multiplicar per 1
    factor = 1

grau = grau * factor
print("Grau d'amistat amb %s es: %f " % (name, grau))
Grau d'amistat amb Pep es: 3.000000

Ens pot ser molt útil fer bucles per iterar sobre les llistes. La seva estructura bàsica és:

for <var> in <iterable>:
    <cos(s)>

Una llista és un iterable però més endavant veurem que hi ha altres tipus de dades que també ho són.

A continuació teniu un exemple:

[9]:
names = ["Pep","Lluis","Paco"] # Llista

for name in names: # Bucle
    grau = 0.3

    if name == "Pep": # Condicional dins el bucle
        factor = 10
    else:
        factor = 1

    grau = grau * factor
    print("Grau d'amistat amb %s es: %f "%(name,grau))
Grau d'amistat amb Pep es: 3.000000
Grau d'amistat amb Lluis es: 0.300000
Grau d'amistat amb Paco es: 0.300000

Potser trobarem aquest altre tipus de bucle, anomenat bucle while o indefinit:

[10]:
names = ["Pep","Lluis","Paco"]

i = 0
while i < len(names):
    print(names[i]) # accedim als elements d'una llista mitjançant el seu índex
    i += 1
Pep
Lluis
Paco

Activitats inicials

  1. Tenim una variable anomenada celsius amb valor 33 i volem saber quants graus Kelvin són. Construeix una expressió que faci aquesta transformació. Simplement, suma 273,15 als graus Celsius per obtenir la temperatura equivalent en Kelvin.

  2. Assigna un nombre real a una variable anomenada nombre i mostra per pantalla un missatge que indica si nombre es troba en el rang (-1.0, 1.0) o no.

  3. La formula per resoldre una equació de segon grau és la següent: x = (-b ± √(b² - 4ac)) / (2a). Fes un codi on assignis els coeficients a, b i c i mostris per pantalla els valors de x.

  4. Escriu un programa que calculi la mitjana de la següent llista de nombres. nombres = [5,7,8,9,3,10]. Versió difícil, empra un bucle while.

[11]:
# Fer els exercicis aquí

Variables més complexes

Al principi del tema hem vist un tipus de variable que organitza la informació de manera ordenada i que és mutable: una llista. Però com ja hem comentat abans, existeixen altres estructures de dades per cobrir diferents necessitats:

  • Tuples: Les tuples són similars a les llistes. Es defineixen especificant els elements entre parèntesis en comptes de claudàtors. Per altra banda, són immutables, no es poden modificar.

  • Diccionaris: Un diccionari consisteix en una col·lecció no ordenada de parells de clau-valor. A diferència de les seqüències, indexades per un rang de nombres, els diccionaris són indexats per claus que poden ser de qualsevol tipus immutable; els strings i els nombres sempre poden ser claus d’un diccionario. Les tuples es poden utilitzar com a claus. No podem emprar llistes com a claus, ja que les llistes es poden modificar.

  • Conjunts: també conegut com a set, és una col·lecció de dades no ordenada i mutable que pot contenir elements únics. En altres paraules, un set no permet elements duplicats i no manté l’ordre dels elements com ho fa una llista o una tupla.

Operadors i funcions

Python ens proveeix de tota una sèrie d’operacions que ens permeten obtenir informació de les llistes, tenim funcions ja programades que ens permetran estalviar molta feina.

Operadors

L’operador in i el modificador not ens permeten saber si un element és o no és a la nostra llista. Aquests dos mètodes serveixen, per exemple, per saber si un element és a una llista abans d’eliminar-ho.

Funcions

Hi ha tot un seguit de funcions ja definides a Python que ens permeten obtenir informació d’una estructura de dades:

  • len: ens retorna un enter amb la longitud de la llista.

  • min: ens retorna el valor més petit de la llista.

  • max: ens retorna el valor més gran de la llista.

[12]:
llistes =  ["Pep","Lluis","Paco"]  # Emprem claudàtor per definir llistes
print(llistes)
print(llistes[0])  # consultem la primera posició

llistes[1] = "Ramon"  # Podem modificar una posició d'una llista

print(len(llistes))  # La funció len ens indica el nombre d'elements de la llista

print("-"*20)

tuples = ("Pep", 33, "3490940A")  # Creació d'una tupla, emprem parèntesi
print(tuples)
print(tuples[1])  # consultem la primera posició

print("-"*20)

diccionaris = { "Pep": "324345C", "Lluis":"493094B", "Paco":"309403A"} # Claus
print(diccionaris)
print(len(diccionaris))
print(diccionaris.keys())
print(diccionaris.values())
print(diccionaris["Pep"])


print("-"*20)

conjunt = set([0,2,2,3,"Pep","Paco","Pep"])
print(conjunt)
print(len(conjunt))
print("Paco" in conjunt)

['Pep', 'Lluis', 'Paco']
Pep
3
--------------------
('Pep', 33, '3490940A')
33
--------------------
{'Pep': '324345C', 'Lluis': '493094B', 'Paco': '309403A'}
3
dict_keys(['Pep', 'Lluis', 'Paco'])
dict_values(['324345C', '493094B', '309403A'])
324345C
--------------------
{0, 2, 3, 'Paco', 'Pep'}
5
True

És molt important conèixer el tipus de cada composició d’una variable i dels seus mètodes associats, el que es coneix amb el nom de built types.

Emprarem la funció type:

[13]:
codiPostal = { "Palma": ["07004","07122"], "Inca": ["07300"]}

print(type(codiPostal))
<class 'dict'>
[14]:
print(type(codiPostal["Palma"]))
<class 'list'>
[15]:
print(type(codiPostal["Palma"][0]))
<class 'str'>
[16]:
if "07122" in codiPostal["Palma"]:
    print("El codi 07122 és el CP de la UIB")
El codi 07122 és el CP de la UIB
[17]:
codiPostal["Sineu"] = ["07510"]
print(codiPostal)
print(len(codiPostal))
{'Palma': ['07004', '07122'], 'Inca': ['07300'], 'Sineu': ['07510']}
3
[18]:
codiPostal["Sineu"].append("07511")

for key in codiPostal:
    print(key, codiPostal[key])
Palma ['07004', '07122']
Inca ['07300']
Sineu ['07510', '07511']

Llibreries

Python inclou moltes funcionalitats de base, però hi ha llibreries que donem molt de potencial. Pràcticament, ja està tot implementat en el nucli de Python i a les seves llibreries.

A Google Colab no cal instal·lar-ne cap, però a una plataforma pròpia si seria necessari. En aquest curs introductori no cobrirem aquest punt.

Llibreria math

Hi ha llibreries incloses en el nucli de Python. Estan instal·lades, però per defecte no es carreguen. Per exemple math és una llibreria estàndard que proporciona un conjunt ampli de funcions i constants matemàtiques. Aquesta llibreria inclou funcions i constants que no estan disponibles per defecte a Python, com ara les funcions trigonomètriques, exponencials, logarítmiques i moltes altres que poden ser útils en càlculs científics i matemàtics.

Documentació a la llibreria math: enllaç.

Per poder emprar-la és necessari carregar-la o en argot informàtic: importar-la. A continuació en teniu un exemple:

[19]:

import math ## codi per carregar la llibreria math preus = [33, 44.2, 12.4, 5.8] print(math.sqrt(preus[0])) # arrel quadrada de 33
5.744562646538029

Llibreria Numpy

Numpy és una llibreria de Python que proporciona suport per a arrays multidimensionals (matrius) i funcions matemàtiques d’alt rendiment per a realitzar operacions numèriques i científiques. És una de les llibreries més importants i més utilitzades en el camp de la computació científica, l’anàlisi de dades i la manipulació de dades numèriques en Python.

Documentació de la llibreria Numpy

[20]:
# Hi ha d'altres llibreries com Numpy que cal instal·lar-les
import numpy as np #np és un alias

preus = np.array(preus)  # transformam una llista al tipus de dades de Numpy, una matriu unidimensional (vector)
print(preus.mean())
print(preus.std())
print(preus.min())
print(preus.max())

23.85
15.449514555480375
5.8
44.2

Numpy permet dur a terme operacions vectorials, el que evita haver de programar bucles:

[21]:
preusIVA = preus * 1.21 # Operacions aritmètiques
print(preusIVA)
[39.93  53.482 15.004  7.018]
[22]:
print(preus>10.0) # Operacions lògiques
print(preus[preus>10.0])
[ True  True  True False]
[33.  44.2 12.4]

Slicing

Python també permet una sintaxi d’indexació avançada que permet extreure subllistes d’una llista. Aquesta tècnica és coneguda com a slicing. Sigui ll una variable que identifica una llista, una expressió de la forma ll[inici:final] retorna la porció de ‘ll’ que comença en la posició inici, i acaba en la posició final-1. És a dir, la posició indexada per final no és inclosa dins aquesta subllista.

En resum, podem fer les següents seleccions:

a[inici:final]  # elements de la llista de la posició inici fins la posició final-1.
a[inici:]       # elements de la llista de la posició inici fins al final de la llista.
a[:final]       # elements de la llista de la primera posició fins la posició final-1.
a[:]            # seleccionam tota la llista

Vegem un exemple de slicing en codi Python:

[23]:
# Seleccio (slicing)
print(preus)
print(preus[3])
print(preus[-1])

print("-"*30)

print(preus[:3])
print(preus[:-1])
print(preus[2:4])
print(preus[6:])
[33.  44.2 12.4  5.8]
5.8
5.8
------------------------------
[33.  44.2 12.4]
[33.  44.2 12.4]
[12.4  5.8]
[]

Activitats de resum

S’ha fet un petit estudi de mercat del preu d’origen de certs productes. Són preus per kilogram durant quatre dies.

Es demana:

  1. Quin és el preu màxim de cada producte?

  2. Quin és el producte més car?

  3. Quin dia són més cares les taronges?

  4. Si el preu de mercat és tres vegades més (x3), fes un nou diccionari amb el “preuMercat”.

  5. Quin és el cost de comprar a “preu de mercat”, 3 KG de taronges i 2,5 KG de cebes el dia 2?

L’objectiu d’aquesta activitat és la consolidació de les estructures bàsiques de Python.

[24]:
preuOrigin = {
              "ceba":  [30.3, 20.3, 25.9, 39.0], # cèntims/kg !!! ALERTA
              "patata":[0.33, 0.43, 0.34, 0.12], # euro/kg
              "taronja":[0.45, 0.56, 0.38, 0.43] # euro/kg
              }
[25]:
# 1.
[26]:
# 2.
[27]:
# 3.
[28]:
# 4.
[29]:
# 5.

Activitat 1.1 del homework

Com a final del dia d’avui i per la setmana que vé heu d’entregar aquesta activitat.

License: CC BY 4.0 Isaac Lera and Gabriel Moya Universitat de les Illes Balears isaac.lera@uib.edu, gabriel.moya@uib.edu