Python: introducció ràpida
Per començar a programar en Python i coneixent pràviament les bases de l'algorismica, us proposo uns consells ràpids:
Contingut
Consola i scripts
Python és un llenguatge interpretat i es pot invocar la consola des de la shell:
enric@pepino:~$ python Python 2.7.3 (default, Apr 20 2012, 22:44:07) [GCC 4.6.3] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> a=1 >>> print a 1
Per sortir feu servir CTRL+D o quit()
Per millorar la consola de Python i afegir "autocompletion" amb <TAB>, us podeu llegir l'article Python prompt.
Si volem fer un script (arxiu .py) es pot executar:
- Cridant el fitxer de text (script) amb l'intèrpret:
$ python elmeuscript.py
- Executant-ho com un shell script: cal insertar una línia al principi del script amb la ruta a l'intèrpret i necessitarà permisos d'execució.
Shell script
Creem l'arxiu:
#!/usr/bin/python
i = 7
print i
canviem permisos i l'executem:
$ chmod 755 elmeuscript.py $ ./elmeuscript.py
Accents i demés: codificació UTF-8 de l'arxiu
Python no ens deixarà posar accents i caràcters especials. Si volem poder treballar amb cadenes en el nostre idioma convé canviar-ho al principi de l'arxiu amb:
#!/usr/bin/python
# -*- coding: utf-8 -*-
print "mira què bé"
Si no posem la 2a línia, el script ens donarà un error en executar-ho.
Blocs per indentació, res de claus {}
Els blocs de sentències funcionen amb indentació (és a dir, tabuladors/espais al principi de línia), el que és molt adequat per establir un estil clar i net de programació.
De pas: observa (1) l'assignació múltiple, (2) el condicional i (3) els booleans son amb majúscula (True i False):
a , b = 1, 2 # en Python podem fer assignacions de diverses variables alhora
if a == b:
print "son iguals"
c = True
else:
print "son diferents"
c = False
Cal tenir en compte que:
- Els inicis de bloc els marquen els dos punts ":" de les sentències de control (condicionals, bucles) i de les funcions.
- Tant ens fa posar un tabulador com 3 o 4 espais, la única regla és que la indentació sigui coherent al llarg del bloc.
- Si estem copiant exemples de tutorials i similars, i després afegim codi, serà convenient ajustar el tipus d'indentació de l'editor per tal que sigui coherent. En el cas de l'editor geany (recomanat) es pot canviar a:
Document -> Tipus de sagnat
Variables dinàmiques
En Python, igual que en molts llenguatges interpretats, no cal declarar el tipus de les variables. Es pot crear una variable quan es vulgui i del tipus que es vulgui i es pot canviar al llarg de l'execució. Per exemple:
>>> a = 1 >>> type(a), a (<type 'int'>, 1) >>> a = "cosa" >>> type(a), a (<type 'str'>, 'cosa')
Entrada de dades per teclat
Tenim bàsicament dues funcions:
- input() : s'interpreta l'entrada com a sentència Python
- raw_input() : s'interpreta com una cadena de caràcters
Per exemple:
>>> xx = raw_input() 3+2 <- entrada de teclat >>> xx '3+2'
raw_input() manté l'entrada de teclat com un string (cadena de caràcters). En canvi:
>>> xx = input() 3+2 <- entrada de teclat >>> xx 5
Com podem veure, amb input() s'ha interpretat el "3+2" i s'ha efectuat la suma. També podriem entrar variables:
>>> a = 55 >>> b = input() a <- entrada de teclat >>> b 55
En aquest cas, el que entrem pel teclat "a" s'ha interpretat com la variable i per tant "b" valdrà el mateix que la variable "a".
Per entrar contrassenyes
Finalment podem importar una funció "getpass" del mòdul del mateix nom, per entrar passwords sense que es mostri per pantalla:
import getpass
password = getpass.getpass("Entra la teva contrassenya: ")
Per suposat, ara no feu "print password"... ;P
Funcions
Les funcions es defineixen amb la paraula clau def:
def suma(a,b):
resultat = a + b
return resultat
print suma(3,6)
Condicionals i bucles
Referències a wikibooks de
- Condicionals: "if" i
"switch"(switch no hi és en Python però al link trobareu hàbils maneres de simular-ho). - Bucles: "while" i "for"
Ja hem vist un exemple de condicional "if" més amunt. Important remarcar que els condicionals es poden fer de la manera curta amb:
num = int(input())
res = -num if num<0 else num
Fixa't en:
- l'entrada per teclat input(), també podria ser raw_input() per entrar caràcters.
- hem filtrar l'entrada per tal que num sigui un sencer (int). Si volguéssim un flotant caldria fer
num = float(raw_input())
Bucles
Per fer un bucle típic numèric (no és el més habitual en Python):
for i in range(3,11,2):
print i
És curiós oi? Això és perquè Python, com a bon llenguatge orientat a objectes i d'alt nivell, itera a través de llistes d'objectes. La instrucció:
>>> range(3,11,2) [3, 5, 7, 9]
crea una llista de nombres imparells des de l'inici (3) fins el final (11) saltant de (2) en (2).
Ja veurem quan ens ocupem dels obejctes que el bucle "for ... in ..." és molt més elegant en les aplicacions que ens interessen.
Dins dels bucles tenim unes clàusules que ens permeten major control:
- break : com en C, finalitza i surt del bucle més proper.
- continue : salta directament a la següent iteració del bucle.
Pots llegir aquí un exemple de break i continue.
Formatació de strings (cadenes de caràcters)
Per imprimir variables dins d'una cadena de caràcters es pot fer de diverses maneres. La primera seria concatenant amb "+":
nom = "Manolo"
missatge = "El guanyador del premi és " + nom + ". Felicitats!"
L'altra seria intercal·lant les variables amb %, similar al C, i posant els arguments entre parèntesi (és una tupla, ho veurem més tard) després d'un "%":
nom = raw_input("Digues el teu nom: ")
edat = input ("Digues la teva edat: ")
print "Hola %s, tens %d anys." % (nom, edat)
Els principals valors que pot prendre son:
- %s: string
- %d: decimal (sencer)
- %f: float (punt flotant, nombres reals).
- Per controlar el nº de decimals podem posar el modificar ".<nombre_de_decimals>" entre el % i la "f", per exemple:
pi = 3.14159
print "pi = %.3f" % pi
...imprimirà només 3 decimals, és a dir (al tanto que arrodoneix!):
pi = 3.142
Pas d'arguments per comanda
Si volem els arguments indicats a la línia de comandes, com per exemple:
$ python hello.py enric Hola, enric.
... podem fer-ho a important el mòdul sys:
import sys
params = sys.argv # argv és una llista amb tots els arguments que passem
nom = params[1]
print "Hola, %s." % (nom)
Coses de strings
Per omplir (padding) un string es pot fer:
>>> a = "p" * 5 >>> a 'ppppp'
Per separar un string en parts ho podem fer amb split (equival al "explode" del PHP):
>>> a = 'xxxx.xxxx.abcd' >>> a.split(".") ['xxxx', 'xxxx', 'abcd']
Per transformar a majúscules o minúscules:
>>> a = "cOsES"
>>> a.upper()
'COSES'
>>> a.lower()
'coses'
La llibreria string té coses interessants:
>>> import string
>>> string.uppercase
'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
>>> string.lowercase
'abcdefghijklmnopqrstuvwxyz'
Per saber més prova amb dir(string) o mira aquí:
Arxius
Per accedir a arxius d'escriptura o lectura, podeu llegir els següents articles:
- Tutorial: http://docs.python.org/tutorial/inputoutput.html#reading-and-writing-files
- Referència: http://docs.python.org/library/stdtypes.html#file-objects
- Un altre tutorial: http://www.tutorialspoint.com/python/python_files_io.htm
Exercicis
Aquests exercicis estan pensat per introduïr-se al Python i les seves estructures bàsiques de control. En general no s'han de fer servir els mètodes d'objectes ja que els veurem més endavant.
Hi ha exercicis que son repetits només que entrant les dades per línia de comandes enlloc de demanar-les a l'usuari en mode interactiu. En aquests casos cal fer una funció que resolgui l'operació enlloc de tenir les instruccions al cos principal del script.
- Fes un script "pow.py" que demani 2 nombres naturals, a i b, i calculi la potència ab sense utilitzar la llibreria matemàtica.
- Fes un script "powcmd.py" que realitzi el mateix que l'anterior, però que li entrem a i b per la línia de comandes.
- Fes un script "busca.py" que demani 2 cadenes de caràcters frase i element, i que busqui quantes vegades apareix element dins de la cadena frase, sense utilitzar les funcions de strings.
- Fes un script "buscacmd.py" que faci el mateix que l'anterior, però que li entrem frase i element per la línia de comandes.
- Fes un script que demani nom, cognom, lloc i data de naixement, i mostri per pantalla les dades personals formatades dins d'una frase més el signe del zodíac de la persona. Per exemple: "Sr./Sra. Josep Pérez, nascut a Andorra l'any 1991, té a Taure com a signe solar del zodíac."
- ...
- Fes un script "usuaris.py" que demani per la consola usuari i contrasenya, i els enregistri en un arxiu "dades.txt".
- La contrasenya s'ha de xifrar amb la llibreria "crypt". Busca com fer-ho.
- Completa l'anterior exercici dels usuaris. Ha de tenir un menú que permeti realitzar les següents funcions:
- Entrar un nou usuari i enregistrar les dades a "dades.txt"
- Llistar usuaris i la contrasenya xifrada.
- Esborrar l'arxiu de dades per començar de nou.