Introducción a Python (3)


Manipulando datos


Números

Enteros

In [1]:
2 + 2
Out[1]:
4
In [2]:
(50 + 30) * 5
Out[2]:
400
In [3]:
7 / 2
Out[3]:
3.5
In [4]:
7 % 3
Out[4]:
1
In [5]:
8271620372012 ** 16
Out[5]:
480230242785895041523601081047580269312718942941866053961384580763944229024067667717573401492913853961842995096084912848441403451269527097736198573582491135229983829269574216050363217514543552009868637372416

Float

In [6]:
3 * 4.5 / 2.9
Out[6]:
4.655172413793103
In [7]:
27 / 4.2
Out[7]:
6.428571428571428

Decimal

In [8]:
from decimal import Decimal
dos = Decimal(2)
dos.sqrt()
Out[8]:
Decimal('1.414213562373095048801688724')
In [9]:
from decimal import getcontext
getcontext().prec = 55
dos.sqrt()
Out[9]:
Decimal('1.414213562373095048801688724209698078569671875376948073')

Otras bases

In [10]:
0xb
Out[10]:
11
In [11]:
hex(11)
Out[11]:
'0xb'
In [12]:
0b101
Out[12]:
5
In [13]:
bin(4)
Out[13]:
'0b100'
In [14]:
0o10
Out[14]:
8
In [15]:
oct(8)
Out[15]:
'0o10'

Strings (cadenas)

In [16]:
"Un «string» es una cadena de caracteres"
Out[16]:
'Un «string» es una cadena de caracteres'
In [17]:
"""Que el código que escribimos funcione, es una excepción.
-- Manuel Kaufmann"""
Out[17]:
'Que el código que escribimos funcione, es una excepción.\n-- Manuel Kaufmann'
In [18]:
"Me gusta decir 'Dale' para confirmar"
Out[18]:
"Me gusta decir 'Dale' para confirmar"
In [19]:
"¡Quiero usar \"la misma\" comilla dentro de la cadena!"
Out[19]:
'¡Quiero usar "la misma" comilla dentro de la cadena!'

Operaciones

In [20]:
"Hola" + " mundo!"
Out[20]:
'Hola mundo!'
In [21]:
"Eco " * 5
Out[21]:
'Eco Eco Eco Eco Eco '
In [22]:
len("¿cuánto mide esta cadena?")
Out[22]:
25
In [23]:
"Camión y moño expresado en UTF-8".encode('utf-8')
Out[23]:
b'Cami\xc3\xb3n y mo\xc3\xb1o expresado en UTF-8'
In [24]:
'¿Cuántas a tiene esta cadena?'.count('a')
Out[24]:
5

Acceso a strings

In [25]:
frase = "¡Hola mundo!"
frase
Out[25]:
'¡Hola mundo!'

In [26]:
frase[1]
Out[26]:
'H'
In [27]:
frase[-3]
Out[27]:
'd'
In [28]:
frase[1:5]
Out[28]:
'Hola'
In [29]:
frase[6:]
Out[29]:
'mundo!'
In [30]:
frase[6:-1]
Out[30]:
'mundo'
In [31]:
frase_con_espacios = '¡ H o l a   M u n d o !'
frase_con_espacios
Out[31]:
'¡ H o l a   M u n d o !'
In [32]:
frase_con_espacios[::2]
Out[32]:
'¡Hola Mundo!'

Listas

In [33]:
lista = [2, 'auto', 5.32, Decimal(2)]
lista
Out[33]:
[2, 'auto', 5.32, Decimal('2')]
In [34]:
lista[2]
Out[34]:
5.32
In [35]:
lista[-1]
Out[35]:
Decimal('2')
In [36]:
lista[:-2]
Out[36]:
[2, 'auto']

Operaciones

In [37]:
lista + [125, 'camión']
Out[37]:
[2, 'auto', 5.32, Decimal('2'), 125, 'camión']
In [38]:
lista[1] = "bicicleta"
lista
Out[38]:
[2, 'bicicleta', 5.32, Decimal('2')]
In [39]:
lista[1] = ['auto', 'moto', "bicicleta", 'camión']
lista
Out[39]:
[2, ['auto', 'moto', 'bicicleta', 'camión'], 5.32, Decimal('2')]
In [40]:
del lista[2]
lista
Out[40]:
[2, ['auto', 'moto', 'bicicleta', 'camión'], Decimal('2')]

Métodos

In [41]:
vehiculos = lista[1]
vehiculos
Out[41]:
['auto', 'moto', 'bicicleta', 'camión']
In [42]:
vehiculos.sort()  # in place
vehiculos
Out[42]:
['auto', 'bicicleta', 'camión', 'moto']

¿Se modificó la variable "lista"?

In [43]:
lista[1]
Out[43]:
['auto', 'bicicleta', 'camión', 'moto']

¿Porqué sucede esto?

In [44]:
vehiculos.index('camión')
Out[44]:
2
In [45]:
vehiculos.append('patineta')
vehiculos
Out[45]:
['auto', 'bicicleta', 'camión', 'moto', 'patineta']

Conjuntos

In [46]:
numeros = {1, 2, 3, 4, 1, 5, 2, 7, 2, 4, 6}
numeros
Out[46]:
{1, 2, 3, 4, 5, 6, 7}
In [47]:
otros_numeros = {4, 7, 1, 9, 2, 8}
In [48]:
otros_numeros.update([5, 6, 5, 3, 1, 6, 9])  # in place
otros_numeros
Out[48]:
{1, 2, 3, 4, 5, 6, 7, 8, 9}

Métodos y operaciones

In [49]:
numeros.intersection(otros_numeros)
Out[49]:
{1, 2, 3, 4, 5, 6, 7}
In [50]:
numeros & otros_numeros
Out[50]:
{1, 2, 3, 4, 5, 6, 7}
In [51]:
numeros.union(otros_numeros)
Out[51]:
{1, 2, 3, 4, 5, 6, 7, 8, 9}
In [52]:
numeros | otros_numeros
Out[52]:
{1, 2, 3, 4, 5, 6, 7, 8, 9}
In [53]:
numeros.difference(otros_numeros)
Out[53]:
set()
In [54]:
numeros - otros_numeros
Out[54]:
set()

Diccionarios

In [55]:
diccionario = {'entero': 1, 'lista': ['cadena', 92, 4.2], 3: 'tres'}
diccionario
Out[55]:
{3: 'tres', 'lista': ['cadena', 92, 4.2], 'entero': 1}

Las llaves pueden ser cualquier objeto inmutable

In [56]:
otro_diccionario = {3.4: 'tres punto cuatro', 2000: 'dos mil', (3, 4): 'version de Python'}
otro_diccionario
Out[56]:
{2000: 'dos mil', 3.4: 'tres punto cuatro', (3, 4): 'version de Python'}
In [57]:
otro_diccionario[(3, 4)]
Out[57]:
'version de Python'
In [58]:
otro_diccionario[3.4]
Out[58]:
'tres punto cuatro'
In [59]:
del diccionario['lista']
diccionario
Out[59]:
{3: 'tres', 'entero': 1}

Métodos

In [60]:
'entero' in diccionario
Out[60]:
True
In [61]:
diccionario.keys()
Out[61]:
dict_keys([3, 'entero'])
In [62]:
diccionario.values()
Out[62]:
dict_values(['tres', 1])
In [63]:
diccionario.items()
Out[63]:
dict_items([(3, 'tres'), ('entero', 1)])
In [64]:
diccionario.get(3)
Out[64]:
'tres'
In [65]:
diccionario.get(42, 'No tenemos esa *key*')
Out[65]:
'No tenemos esa *key*'
In [66]:
diccionario.pop('entero')
Out[66]:
1
In [67]:
diccionario
Out[67]:
{3: 'tres'}

Tomando decisiones


if

if <condicion>:
    <hago algo>

Ejemplos

In [68]:
condicion = True
if condicion:
    print('Hago algo')
Hago algo
In [69]:
# Test de mayoría de edad
edad = 19
if edad >= 20:
    print('Te puedo vender alcohol')
elif 18 <= edad <= 20:
        print('Andá a Argentina que podés tomar alcohol con 18')
else:
    print('Volvé el año que viene')
Andá a Argentina que podés tomar alcohol con 18
In [70]:
if 'lista' in diccionario:
    print('El diccionario tiene el elemento "lista"')
else:
    print('No encontramos ese elemento')
No encontramos ese elemento
In [71]:
color = input('¿Qué color te gusta?: ')
if color == 'rojo' or color == 'verde':
    print('A mi también')
else:
    print('Qué feo ese color!')
¿Qué color te gusta?: azul
Qué feo ese color!
In [72]:
color = input('¿Qué color te gusta?: ')
colores = ['rojo', 'amarillo', 'violeta', 'azul', 'verde', 'turquesa']
if color in colores:
    if color == 'rojo' or color == 'verde':
        print('A mi también')
    else:
        print('Qué feo ese color!')
else:
    print('Ese no es un color válido')
¿Qué color te gusta?: turquesa
Qué feo ese color!

for

for <elemento> in <iterable>:
    <hago algo>
In [73]:
vehiculos
Out[73]:
['auto', 'bicicleta', 'camión', 'moto', 'patineta']
In [74]:
for vehiculo in vehiculos:
    print('Transporte: ' + vehiculo.capitalize())
Transporte: Auto
Transporte: Bicicleta
Transporte: Camión
Transporte: Moto
Transporte: Patineta
In [75]:
# obteniendo cuadrados
for numero in range(1, 7):
    print(numero ** 2)
1
4
9
16
25
36
In [76]:
for numero in range(1, 7):
    if numero == 3:
        continue  # ¿qué pasa si pongo un "break" acá?
    print(numero ** 2)
else:
    print('Termino sin ningún "break"')
1
4
16
25
36
Termino sin ningún "break"

while

while <condicion>:
    <hago algo>
In [77]:
edad = 12
while edad < 18:
    print('No te puedo vender alcohol')
    edad += 1
print('Cumpliste la mayoría de edad: {} años'.format(edad))
No te puedo vender alcohol
No te puedo vender alcohol
No te puedo vender alcohol
No te puedo vender alcohol
No te puedo vender alcohol
No te puedo vender alcohol
Cumpliste la mayoría de edad: 18 años
In [78]:
respuesta_correcta = 36
respuesta_usuario = int(input('¿Cuánto es 6^2?: '))
while respuesta_usuario != respuesta_correcta:
    respuesta_usuario = int(input('Error. Intenta de nuevo: '))
print('Felicitaciones! La respuesta correcta es: {}'.format(respuesta_correcta))
¿Cuánto es 6^2?: 43
Error. Intenta de nuevo: 33
Error. Intenta de nuevo: 12
Error. Intenta de nuevo: 2
Error. Intenta de nuevo: 5
Error. Intenta de nuevo: 2
Error. Intenta de nuevo: 36
Felicitaciones! La respuesta correcta es: 36

Excepciones

try:
    <codigo que "puede" fallar>
except <excepcion>:
    <codigo que maneja esa excepcion>
In [80]:
17 / 0
---------------------------------------------------------------------------
ZeroDivisionError                         Traceback (most recent call last)
<ipython-input-80-3bf37c425175> in <module>()
----> 1 17 / 0

ZeroDivisionError: division by zero
In [81]:
try:
    print(17 / 0)
except ZeroDivisionError:
    print('No se puede dividir un número por 0')
No se puede dividir un número por 0

Podemos generar nuestra propias excepciones

In [82]:
raise ValueError('Mensaje de error')
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-82-ad5f9844780e> in <module>()
----> 1 raise ValueError('Mensaje de error')

ValueError: Mensaje de error

Organizando el código


Funciones

def <nombre funcion>(<argument 1>, <argumento 2>, ...):
    <codigo de la funcion>
In [83]:
def alcubo(numero):
    return numero ** 3
In [84]:
alcubo(3)
Out[84]:
27

Objetos

In [85]:
alcubo(27)
Out[85]:
19683
In [86]:
alcubo
Out[86]:
<function __main__.alcubo>
In [87]:
f = alcubo
f(3)
Out[87]:
27

Flexibilidad en los argumentos

In [88]:
def ordenar_lista(l, ascendente=True):
    resultado = sorted(l)
    if not ascendente:
        resultado = list(reversed(resultado))
    return resultado

lista = [3, 5, 1, 7, 12, 7, 4]
ordenar_lista(lista)
Out[88]:
[1, 3, 4, 5, 7, 7, 12]
In [89]:
ordenar_lista(lista, True)
Out[89]:
[1, 3, 4, 5, 7, 7, 12]
In [90]:
ordenar_lista(lista, ascendente=False)
Out[90]:
[12, 7, 7, 5, 4, 3, 1]
In [91]:
def multiplica_elementos(*args):
    resultado = 1
    for elemento in args:
        resultado *= elemento
    return resultado

multiplica_elementos(3, 4, 5, 2, 8)  # cantidad de argumentos indefinda
Out[91]:
960
In [92]:
multiplica_elementos(3, 9)
Out[92]:
27
In [93]:
def suma_dos_numeros(a, b):
    return a + b

numeros = [4, 6]
suma_dos_numeros(*numeros)
Out[93]:
10

Clases

In [94]:
import math

class Punto2D(object):
    def __init__(self, x, y):
        self.x = x
        self.y = y
        
    def distancia(self):
        """Distancia al punto desde (0,0)"""
        distancia = math.sqrt(self.x ** 2 + self.y ** 2)
        return distancia
In [95]:
p1 = Punto2D(3, 4)
p1.x
Out[95]:
3
In [96]:
p1.distancia()
Out[96]:
5.0
In [97]:
p2 = Punto2D(7, 12)
p2.y
Out[97]:
12

Módulos

In [98]:
%%file punto.py
import math

class Punto2D(object):
    def __init__(self, x, y):
        self.x = x
        self.y = y
        
    def distancia(self):
        """Distancia al punto desde (0,0)"""
        distancia = math.sqrt(self.x ** 2 + self.y ** 2)
        return distancia
Writing punto.py
In [99]:
import punto

p3 = punto.Punto2D(5, 3)
p3.distancia()
Out[99]:
5.830951894845301

Paquetes

In [100]:
import mipaquete.modulo
print(mipaquete.modulo.FRASE)
---------------------------------------------------------------------------
ImportError                               Traceback (most recent call last)
<ipython-input-100-d6ea12d9a8ec> in <module>()
----> 1 import mipaquete.modulo
      2 print(mipaquete.modulo.FRASE)

ImportError: No module named 'mipaquete'
In [101]:
from mipaquete import modulo
print(modulo.FRASE)
---------------------------------------------------------------------------
ImportError                               Traceback (most recent call last)
<ipython-input-101-f276dab83b0d> in <module>()
----> 1 from mipaquete import modulo
      2 print(modulo.FRASE)

ImportError: No module named 'mipaquete'
In [102]:
from mipaquete.modulo import FRASE
print(FRASE)
---------------------------------------------------------------------------
ImportError                               Traceback (most recent call last)
<ipython-input-102-4d512e061f22> in <module>()
----> 1 from mipaquete.modulo import FRASE
      2 print(FRASE)

ImportError: No module named 'mipaquete'