Blog personal

Gonzalo Murillo

Category: Python

¿Cuál es la forma más Pythonica de abrir un fichero?

En Python se habla de que algo es “Pythonic” o “Pythonica” como yo lo he traducido,  cuando cumple con la filosofía del lenguaje Python.

¿Y cuál es dicha filosofía?

Muy sencillo, si abrimos el interprete de Python y tecleamos “import this”, lo veremos:

>>> import this

The Zen of Python, by Tim Peters

Beautiful is better than ugly.

Explicit is better than implicit.

Simple is better than complex.

Complex is better than complicated.

Flat is better than nested.

Sparse is better than dense.

Readability counts.

Special cases aren’t special enough to break the rules.

Although practicality beats purity.

Errors should never pass silently.

Unless explicitly silenced.

In the face of ambiguity, refuse the temptation to guess.

There should be one– and preferably only one –obvious way to do it.

Although that way may not be obvious at first unless you’re Dutch.

Now is better than never.

Although never is often better than *right* now.

If the implementation is hard to explain, it’s a bad idea.

If the implementation is easy to explain, it may be a good idea.

Namespaces are one honking great idea — let’s do more of those!

>>>

Así que algo es “Pythonic” o “Pythonico” si cumple el Zen del lenguaje Python.

Partiendo de esa premisa, ¿cuál es la forma más “Pythonica” de usar ficheros?

Supongamos que queremos leer de un fichero.
La primera forma en la que pensamos, sería algo así:

f = open('file.txt')
a = f.read()
print a
f.close()

Sin embargo esta forma, no es considerada Pythonica

¿Por qué motivo?

Porque si ocurre una excepción el fichero no será cerrado.
¿Cuál es entonces la forma “Pythonica” de hacer esto?

Con la sentencia with

with open(‘file.txt) as f:
for line in f:
print(f)

Lo que asegura with es que si se produce cualquier excepción dentro del bloque with, el fichero se cerrará, y por eso se considera la forma Pythonica de hacerlo.

Función enumerate en Python

La función enumerate es una función incorporada al propio lenguaje Python que permite añadir un contador a un elemento iterable.

Veamos un ejemplo:

Supongamos que tenemos la siguiente lista que contiene frutas

frutas=[‘pera’,’manzana’,’platano’,’ciruela’,’fresa’]

Queremos recorrerla, e indicar el número de ocupa esa posición dentro de la lista.

¿Cómo conseguimos hacer esto en Python?

Con la función incorporada enumerate

for pos, fruta in enumerate(frutas):
print(pos,fruta)

Si ejecutamos el código anterior, obtenemos la siguiente salida:

/usr/bin/python2.7
(0, ‘pera’)
(1, ‘manzana’)
(2, ‘platano’)
(3, ‘ciruela’)
(4, ‘fresa’)

Como podemos apreciar el contador empieza en 0. Si queremos que el contador empiece en otro número cualquiera, podemos indicárselo a la función enumerate.

Supongamos que queremos que empiece en 1, en lugar de en 0.

Tendríamos que indicárselo a la función enumerate de la siguiente forma:

for pos, fruta in enumerate(frutas,1):
print(pos,fruta)

Esto cambiaría la salida del programa del siguiente modo:

/usr/bin/python2.7
(1, ‘pera’)
(2, ‘manzana’)
(3, ‘platano’)
(4, ‘ciruela’)
(5, ‘fresa’)

Process finished with exit code 0

Como podemos ver el contador en este lugar empieza en 1, y no en 0.

Bucles en Python al estilo C

La forma habitual de recorrer los elementos de un conjunto en Python es la siguiente

for variable in secuencia:
	Declaración1
	Declaración2	
	...
	Declaraciónn

Así por ejemplo, si tenemos una lista, y queremos visualizar todos sus elementos, la forma de hacerlo sería la siguiente:

lista=[1,2,3,4,5,6,7,8,9,10]

for elemento in lista:

print(elemento)

Al ejecutar el anterior script Python, obtendríamos lo siguiente:

/usr/bin/python2.7
1
2
3
4
5
6
7
8
9
10

Process finished with exit code 0

Es decir, se ha recorrido cada elemento en la lista, y cada uno de ellos se ha visualizado por pantalla.

No obstante, los que venimos del lenguaje de programación C, estamos acostumbrados a la siguiente construcción de bucle…

for(i=0;i<n;i++)

{

printf(“%d”,i)

}

¿Cómo se migra esa construcción tan característica del lenguaje C a Python?

Necesitamos conocer la función incorporada al lenguaje Python range()

La función range se usa para generar una lista de progresiones aritméticas.

Su sintaxis es: range (inicio, fin, paso)

Un ejemplo:

rango=range(1,10)
print(rango)

¿Qué creéis que mostrará la ejecución del anterior script?

A priori, podría pensarse que mostrará una lista de números del 1 al 10 ¿verdad?
No es el caso, lo que muestra es una lista de números del 1 al 9, tal y como sigue:

/usr/bin/python2.7
[1, 2, 3, 4, 5, 6, 7, 8, 9]

El valor de fin en la función range, es el número inmediatamente superior al que queremos obtener en la progresión.

Combinando range con for.

Así que la manera de imitar el comportamiento de un bucle for en Python es combinar for y range.

Vamos a migrar el siguiente bucle C a Python

for (i=0;i<=10;i=i+2)

{

}

Dicho bucle en Python se escribiría del siguiente modo

for i in range(0,11,2):

¡A programar!

© 2018 Blog personal

Theme by Anders NorenUp ↑