Python: introducció ràpida

De Cacauet Wiki
Salta a la navegació Salta a la cerca

Per començar a programar en Python i coneixent pràviament les bases de l'algorismica, us proposo uns consells ràpids:

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:

  1. Cridant el fitxer de text (script) amb l'intèrpret:
     $ python elmeuscript.py
  2. 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:


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.

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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."

Exercicis amb arxius

  1. Fes un script "usuaris.py" que demani per la consola usuari i contrasenya, i els enregistri en un arxiu "dades.txt".
    • L'arxiu de dades ha de contenir l'usuari i la contrasenya a la mateixa línia, per tal que sigui "human friendly" i poder ser editat a mà. Es suggereix separar els camps amb tabulador o una coma.
    • Hem d'evitar noms d'usuari amb espais o caràcters que no siguin alfanumèrics. Si s'entra algun nom usuari així, cal donar un error i no entrar el registre.
    • La contrasenya no pot aparèixer a la consola quan s'introdueix (seria insegur).
    • La contrasenya s'ha de xifrar amb la llibreria "crypt". Busca com fer-ho. OJU: no la confonguis amb la "crypto", que és molt més complerta i complexa d'utilitzar.
  2. Completa l'anterior exercici dels usuaris. Ha de tenir un menú que permeti realitzar les següents operacions. IMPORTANT: aquest exercici l'heu d'implementar intentant modularitzar el codi utilitzant funcions.
    • Entrar un nou usuari i enregistrar les dades a "usuaris.txt"
    • Llistar usuaris i la contrasenya xifrada.
    • Esborrar l'arxiu de dades per començar de nou.
    • Sortir de l'aplicació.
  3. Fes un script "personal.py" que demani per la consola nom, cognom i data de naixement (dia, mes, any). El menú de l'aplicació ha de realitzar:
    • Entrar una persona i enregistrar les dades a "personal.txt"
    • Llista de personal
    • Llista amb filtre (demanar string que ha d'aparèixer al nom o cognom).
    • Llista ordenada per data de naixement.
    • Esborrar l'arxiu de dades per començar de nou
    • Sortir de l'aplicació