Tema Intro Python
Tema Intro Python
• Creación de guiones
• Escribir el código en un fichero.py
• Añadir al inicio #!/usr/bin/python3
• Darle permiso de ejecución
Interacción
• Intérprete
$ python3
Python 3.5.2 |Anaconda 4.0.0 (64-bit)|
(default, Jul 2 2016, 11:16:01)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-1)] on linux
Type "help", "copyright", "credits" or "license"
for more information.
>>> print(’¡Hola! y ¡Adiós!’)
¡Hola! y ¡Adiós!
>>> exit()
$
Entornos de programación
• Entorno de programación:
• Editar programas
• Interactuar con el intérprete
• Desarrollo de proyectos
• Depuración
• Algunos de los más conocidos:
• Idle
• Spyder
• IPython+Jupyter
• Pydev
• PyCharm
• Emacs+Python-mode
Guiones
• Guión (script):
#!/usr/bin/python3
# Escribe por pantalla el mensaje: ¡Hola! y ¡Adiós!
print(’¡Hola! y ¡Adiós!’)
• Ejecución:
$ ./ejemplo.py
¡Hola! y ¡Adiós!
$
• Comentarios en Python: # y triples comillas
Tipos de datos numéricos
• Números (son inmutables)
>>> 2+2
4
>>> (50-5*6)/4
5.0
>>> a = (1+2j)/(1+1j)
>>> a.real
1.5
>>> ancho = 20
>>> alto = 5*9
>>> area = ancho * alto
>>> area
900
>>> area *= 2
>>> area
1800
• Mutable vs inmutable. Asignaciones aumentadas
• Las variables en Python siempre son referencias a objetos
Booleanos
• Inmutables:
>>> a=("Madrid","Paris","Roma","Berlin","Londres")
>>> b=a
>>> b
(’Madrid’, ’Paris’, ’Roma’, ’Berlin’, ’Londres’)
>>> a[3]="Atenas"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: ’tuple’ object does not support assignment
>>> a+="Atenas",
>>> a
(’Madrid’,’Paris’,’Roma’,’Berlin’,’Londres’,’Atenas’)
>>> b
(’Madrid’, ’Paris’, ’Roma’, ’Berlin’, ’Londres’)
Tuplas
• Tuplas en lado izquierdo de asignaciones:
>>> a,b,c=(1,2,3)
>>> a
1
>>> b
2
>>> c
3
>>> a,b=b,a # ¡¡intercambio en una sola instrucción!!
>>> a
2
>>> b
1
• Desempaquetado
>>> a,*b =(1,2,3,4)
>>> a
1
>>> b
[2, 3, 4]
>>> *a,b = [1,2,3,4]
>>> a
[1, 2, 3]
>>> b
4
Listas
• Secuencias ordenadas de elementos, separados por
comas y entre corchetes
>>> ["a","b","c","d"]
[’a’, ’b’, ’c’, ’d’]
>>> [2]
[2]
>>> []
[]
• Operaciones similares a las de tuplas y cadenas
>>> bocadillo = [’pan’, ’jamon’, ’pan’]
>>> 2*bocadillo[:2] + [’huevo’] + [bocadillo[-1]]
[’pan’, ’jamon’, ’pan’, ’jamon’, ’huevo’, ’pan’]
>>> triple = 2*bocadillo + ["tomate",’pan’]
>>> triple
[’pan’, ’jamon’, ’pan’, ’pan’, ’jamon’, ’pan’,
’tomate’, ’pan’]
>>> "tomate" in triple
True
>>> len(triple)
8
Listas
• Programa signo.py:
x = int(input(’Escribe un entero: ’))
if x < 0:
print(’Negativo:’, x)
elif x == 0:
print(’Cero’)
else:
print(’{0} es positivo:’.format(x))
• El papel de la indentación en Python
• Ejecución:
Escribe un entero:34
34 es positivo
Estructuras de control (instrucción for)
• Programa media.py:
l, suma, n = [1,5,8,12,3,7], 0, 0
for e in l:
suma += e
n +=1
print(suma/n)
• Programa primos.py:
primos = []
for n in range(1, 20, 2):
for x in range(2, n):
if n % x == 0:
print(n, ’es’, x, ’*’, n//x)
break
else:
primos.append(n)
• Salida:
9 es 3 * 3
15 es 3 * 5
• Variable primos: [1, 3, 5, 7, 11, 13, 17, 19]
Estructuras de control (instrucción while)
• Programa fibonacci.py:
a, b = 0, 1
while b < 10:
print(b,end=’,’)
a,b = b,a+b
• Programa busca-indice.py
ind =0
busco = "premio"
lst = ["nada","pierdo","premio","sigue"]
while ind < len(lst):
if lst[ind] == busco:
break
ind += 1
else: ind = -1
• Las instrucciones pass, continue, break y return
Algunos patrones de iteración
>>> i = [5]
>>> def f(x=i): return x
>>> f()
>>> [5]
>>> i.append(8)
>>> f()
>>> [5,8]
>>> i = []
>>> f()
>>> [5,8]
Argumentos de funciones
• Expresiones lambda:
>>> lambda x,y: x+y*3
<function <lambda> at 0x7f1415e022f8>
>>> (lambda x,y: x+y*3)(2,3)
11
>>> (lambda x,y: x+y*3)("a","b")
’abbb’
• Funciones que devuelven funciones:
>>> def incremento(n): return lambda x: x+n
>>> f2 = incremento(2)
>>> f2(5)
7
• Funciones que reciben funciones como argumento:
>>> def aplica (f,l): return [f(x) for x in l]
>>> aplica (incremento(5),[1,2,3])
[6, 7, 8]
Entrada y salida en ficheros
• Apertura de ficheros con open:
>>> f=open("fichero.txt","r")
>>> f
<_io.TextIOWrapper name=’fichero.txt’ mode=’r’ encoding=’UTF-8’>
• Contenido de fichero.txt:
Esta es la primera línea
Vamos por la segunda
La tercera ya llegó
Y finalizamos con la cuarta
La quinta la escribo yo
• Escritura con write en modo ’w’:
>>> f=open("fichero.txt","w")
>>> f.write("Reescribo la primera línea\n")
27
>>> f.write("Y también la segunda\n")
21
>>> f.close()
• Contenido de fichero.txt:
Reescribo la primera línea
Y también la segunda
Clases
import math
class Punto(object):
>>> p1=Punto()
>>> p2=Punto(3,4)
>>> p1
<__main__.Punto object at 0x75e510>
>>> str(p1)
’(0, 0)’
>>> str(p2)
’(3, 4)’
>>> p1.x
0
>>> p2.y
4
>>> p1 == p2
False
>>> p2.distancia_al_origen()
5.0
>>> p1.x=3
>>> str(p1)
’(3, 0)’
>>> p1.y=1
>>> p1.distancia_al_origen()
3.1622776601683795
Clases: observaciones importantes
class Circulo(Punto):
def circunferencia(self):
return 2 * math.pi * self.radio
def __eq__(self, otro):
return self.radio == (otro.radio and
super().__eq__(otro,self))
def __str__(self):
return "Círculo({0.radio!r}, {0.x!r}, {0.y!r})".format(self)
Herencia en clases
• Circulo es una especialización de Punto:
• Hereda los atributos de datos x e y y el método
distancia_al_origen.
• Reimplementa __init__, __str__, __eq__
• Introduce el nuevo atributo de dato radio y los métodos
distancia_del_borde_al_origen, area y
circunferencia
• Sesión:
>>> p=Punto(3, 4)
>>> c=Circulo(1,3,4)
>>> str(p)
’(3, 4)’
>>> str(c)
’Circulo(1, 3, 4)’
>>> p.distancia_al_origen()
5.0
>>> c.distancia_al_origen()
5.0
>>> c.distancia_del_borde_al_origen()
4.0
Y mucho más ...
>>> np.zeros((2,3))
array([[ 0., 0., 0.],
[ 0., 0., 0.]])
>>> np.arange(3,15,2)
array([ 3, 5, 7, 9, 11, 13])
>>> np.random.random((2,3))
array([[ 0.32302603, 0.73977163, 0.88106385],
[ 0.0545251 , 0.58705542, 0.69806017]])
• Reorganización de un array:
>>> ar=np.arange(2,10,2)
>>> print(ar)
[2 4 6 8]
>>> ar.reshape(2,2)
array([[2, 4],
[6, 8]])
Anexo: la biblioteca numpy
• Operaciones con arrays:
>>> A=np.array([[1,2,3],[4,5,6]])
>>> B=np.arange(5,11).reshape((2,3))
>>> B*=3
>>> B
array([[15, 18, 21],
[24, 27, 30]])
>>> A+B
array([[16, 20, 24],
[28, 32, 36]])
>>> B>30
array([[False, False, False],
[False, False, False]], dtype=bool)
>>> A*B
array([[ 5, 12, 21],
[32, 45, 60]])
>>> np.dot(A,B.T)
array([[ 38, 56],
[ 92, 137]])
>>> A.min()
1
>>> B.max()
10
• Y muchas más. . .
Anexo: la biblioteca numpy
• Indexado y slicing
>>> D=np.arange(15).reshape((3,5))
>>> D
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
>>> D[:,:3:2]
array([[ 0, 2],
[ 5, 7],
[10, 12]])
>>> D[:5:2,:]
array([[ 0, 1, 2, 3, 4],
[10, 11, 12, 13, 14]])
>>> D[:,2]
array([ 2, 7, 12])
>>> D[1,:]
array([5, 6, 7, 8, 9])
• Iteración:
>>> for l in D:
... print(l)
...
[0 1 2 3 4]
[5 6 7 8 9]
[10 11 12 13 14]
Anexo: la biblioteca numpy
• Indexación con arrays:
>>> E=np.arange(15)**2
>>> print(E)
[ 0 1 4 9 16 25 36 49 64 81 100 121 144 169 196]
>>> i=np.array([2,3,0,6])
>>> j=np.array([[6,1,9],[4,2,4],[3,7,1]])
>>> E[i]
array([ 4, 9, 0, 36])
>>> E[j]
array([[36, 1, 81],
[16, 4, 16],
[ 9, 49, 1]])
• Indexación booleana:
>>> G=np.random.random((2,4))
>>> G
array([[ 0.85048059, 0.75127774, 0.11999384, 0.13635253],
[ 0.77174629, 0.74731828, 0.30906228, 0.31300011]])
>>> I=G>0.5
>>> I
array([[ True, True, False, False],
[ True, True, False, False]], dtype=bool)
>>> G[I]
array([ 0.85048059, 0.75127774, 0.77174629, 0.74731828])
>>> G[I]=0
>>> G
array([[ 0. , 0. , 0.11999384, 0.13635253],
[ 0. , 0. , 0.30906228, 0.31300011]]