En esta charla veremos con detalle algunas de las construcciones más pythonicas y las posibilidades de expresar de forma clara, concisa y elegante cosas que en otros lenguajes nos obligarían a dar muchos rodeos.
A veces es fácil olvidar algunos recursos como que una función puede devolver varios valores, cómo manipular listas y diccionarios de forma sencilla, contextos, generadores... En esta charla veremos de forma entretenida y práctica cómo mejorar nuestro nivel de Python "nativo".
6. # Cadenas muy largas
my_very_big_string = 'For a long time I used to go to bed early. ' +
'Sometimes, when I had put out my candle, my eyes would close ' +
'so quickly that I had not even time to say Im going to sleep.'
my_very_big_string = '''For a long time I used to go to bed early.
Sometimes, when I had put out my candle, my eyes would close
so quickly that I had not even time to say Im going to sleep.'''
my_very_big_string = ('For a long time I used to go to bed early. '
'Sometimes, when I had put out my candle, my eyes would close '
'so quickly that I had not even time to say Im going to sleep.')
7. if stylesage.find('Fashion') != -1:
pass
# Comprobar si una cadena contiene otra
stylesage = 'Fashion meets Big Data'
if 'Fashion' in stylesage:
pass
8. >>> name = 'Alicia'
>>> cats = 2
>>> print('My name is ' + name + ' and I have ' + str(cats) + ' cats')
# Usa String Formatting!!
11. >>> if x >= start and x <= end:
>>> pass
>>> if len(items) != 0:
>>> pass
>>> if lang == 'Spanish':
... welcome = 'Bienvenido'
... else:
... welcome = 'Welcome'
>>> if start <= x <= end:
>>> pass
>>> if items:
>>> pass
>>> welcome = 'Bienvenido'
... if lang == 'Spanish' else 'Welcome'
12. Truth Value Testing
Los siguientes valores serán evaluados como False en una comparación:
● None
● False
● Cero en cualquier tipo numérico, por ejemplo: 0, 0L, 0.0, 0j
● Cualquier secuencia vacía, por ejemplo: '', (), []
● Los diccionarios vacíos: {}
● Las instancias de cualquier clase, si esta define los métodos __nonzero__() o __len__(),
cuando estos métodos devuelven cero o False
En cualquier otro caso, serán evaluados como True
13. >>> values = [True, True, False, False]
>>> i = 0
>>> flag = False
>>> while not flag and i < len(values):
... flag = values[i]
... i += 1
>>> flag
False
>>> any(values)
True
# ¿algún True en la lista?
>>> all(values)
False
14. >>> values = range(10) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> i = 0
>>> flag = False
>>> while not flag and i < len(values):
... flag = (values[i] == 0)
... i += 1
>>> flag
True
>>> any(values)
True
# ¿algún 0 en la lista?
>>> all(values)
False
16. >>> b, a = a, b>>> temp = a
>>> a = b
>>> b = temp
>>> l = ['David', 'Pythonista', '555-55-55']
>>> name = l[0]
>>> title = l[1]
>>> phone = l[2]
>>> name, title, phone = l
>>> name, _, phone = l
25. >>> A = {1, 2, 3, 3}
>>> B = {3, 4, 5, 6, 7}
>>> A
set([1, 2, 3])
>>> B
set([3, 4, 5, 6, 7])
>>> A | B
set([1, 2, 3, 4, 5, 6, 7])
>>> A & B
set([3])
>>> A - B
set([1, 2])
>>> A ^ B
set([1, 2, 4, 5, 6, 7])
26. >>> A
Counter({2: 2, 1: 1})
>>> B
Counter({2: 2, 3: 1})
>>> C.most_common()
[(3, 4), (1, 2), (2, 2), (4, 1), (5, 1),
(6, 1), (7, 1)]
>>> C.most_common(1)
[(3, 4)]
>>> C.most_common(3)
[(3, 4), (1, 2), (2, 2)]
>>> A = collections.Counter([1, 2, 2])
>>> B = collections.Counter([2, 2, 3])
>>> C = collections.Counter([1, 1, 2, 2, 3, 3, 3, 3, 4, 5, 6, 7])
>>> A | B
Counter({2: 2, 1: 1, 3: 1})
>>> A & B
Counter({2: 2})
>>> A + B
Counter({2: 4, 1: 1, 3: 1})
28. >>> a = ['Hello', 'world', '!']
>>> for i, x in enumerate(a):
... print '{}: {}'.format(i, x)
>>> a = ['Hello', 'world', '!']
>>> i = 0
>>> for x in a:
... print '{}: {}'.format(i, x)
... i += 1
# Imprimir los elementos de una lista y su índice
29. >>> squares = [x * x for x in range(10)]>>> even_squares = []
>>> for x in range(10):
... even_squares.append(x * x)
>>> even_squares = []
>>> for x in range(10):
... if x % 2 == 0:
... even_squares.append(x * x)
>>> even_squares = [x * x for x in range(10)
... if x % 2 == 0]
# Obtener todos los cuadrados de los números del 0 al 9
# Obtener todos los cuadrados de los números pares del 0 al 9
30. >>> zip(names, surnames)
[('John', 'Cleese'), ('Eric', 'Idle'),
('Terry', 'Gilliam')]
>>> names = ['John', 'Eric', 'Terry']
>>> surnames = ['Cleese', 'Idle', 'Gilliam']
>>> people = []
>>> for i in range(len(names)):
... people.append((names[i], surnames[i]))
>>> print(people)
[('John', 'Cleese'), ('Eric', 'Idle'),
('Terry', 'Gilliam')]
# Obtener en una sola lista los pares nombre-apellido
41. >>> m = {x: x ** 2 for x in range(5)}
>>> m
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
>>> m = {x: 'A' + str(x) for x in range(5)}
>>> m
{0: 'A0', 1: 'A1', 2: 'A2', 3: 'A3', 4: 'A4', 5}
>>> # Invertir las clave-valor
>>> m = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
>>> {v: k for k, v in m.items()}
{1: 'a', 2: 'b', 3: 'c', 4: 'd'}
48. # internamente un assert es...
>>> if __debug__:
... if not expression1:
... raise AssertionError(expression2)
# por eso nunca hay que hacer...
>>> def delete_product(prod_id, user):
>>> assert user.is_admin(), 'Comprueba si es administrador'
>>> assert store.has_product(prod_id), 'Comprueba si existe'
>>> store.get_product(prod_id).delete()
53. Referencias Python Tricks: The Book
A Buffet of Awesome Python Features
30 Python Language Features and Tricks
You May Not Know About
PYTHON TIPS web