Nota
Pots trobar aquest material en format pàgina web a la plataforma readthedocs
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ó:
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
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.Assigna un nombre real a una variable anomenada
nombre
i mostra per pantalla un missatge que indica sinombre
es troba en el rang (-1.0, 1.0) o no.La formula per resoldre una equació de segon grau és la següent:
x
= (-b
± √(b
² - 4ac
)) / (2a
). Fes un codi on assignis els coeficientsa
,b
ic
i mostris per pantalla els valors dex
.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 buclewhile
.
[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:
Quin és el preu màxim de cada producte?
Quin és el producte més car?
Quin dia són més cares les taronges?
Si el preu de mercat és tres vegades més (x3), fes un nou diccionari amb el “preuMercat”.
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.
Isaac Lera and Gabriel Moya Universitat de les Illes Balears isaac.lera@uib.edu, gabriel.moya@uib.edu