Introducción
En esta parte analizamos con más detenimiento la práctica de escribir scripts de Python.
This tutorial is from open-source community. Access the source code
💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí
En esta parte analizamos con más detenimiento la práctica de escribir scripts de Python.
Un script es un programa que ejecuta una serie de instrucciones y luego se detiene.
## program.py
instrucción1
instrucción2
instrucción3
...
Hasta este momento, la mayoría de los programas que hemos escrito han sido scripts.
Si escribes un script útil, crecerá en características y funcionalidad. Es posible que desees aplicarlo a otros problemas relacionados. Con el tiempo, podría convertirse en una aplicación crítica. Y si no te das cuenta, podría convertirse en un gran desastre. Entonces, vamos a organizarnos.
Los nombres siempre deben estar definidos antes de ser utilizados posteriormente.
def square(x):
return x*x
a = 42
b = a + 2 ## Requiere que `a` esté definido
z = square(b) ## Requiere que `square` y `b` estén definidos
El orden es importante. Casi siempre se ponen las definiciones de variables y funciones cerca de la parte superior.
Es una buena idea poner todo el código relacionado con una sola tarea en un solo lugar. Utiliza una función.
def read_prices(filename):
prices = {}
with open(filename) as f:
f_csv = csv.reader(f)
for row in f_csv:
prices[row[0]] = float(row[1])
return prices
Una función también simplifica las operaciones repetidas.
oldprices = read_prices('oldprices.csv')
newprices = read_prices('newprices.csv')
Una función es una secuencia nombrada de instrucciones.
def funcname(args):
instrucción
instrucción
...
return resultado
Cualquier instrucción de Python se puede utilizar dentro.
def foo():
import math
print(math.sqrt(2))
help(math)
No hay instrucciones especiales en Python (lo que la hace fácil de recordar).
Las funciones se pueden definir en cualquier orden.
def foo(x):
bar(x)
def bar(x):
instrucciones
## O
def bar(x):
instrucciones
def foo(x):
bar(x)
Las funciones solo deben definirse antes de ser utilizadas (o llamadas) durante la ejecución del programa.
foo(3) ## foo debe estar ya definido
En términos de estilo, probablemente sea más común ver funciones definidas de manera de abajo hacia arriba.
Las funciones se tratan como bloques de construcción. Los bloques más pequeños/simples van primero.
## myprogram.py
def foo(x):
...
def bar(x):
...
foo(x) ## Definido anteriormente
...
def spam(x):
...
bar(x) ## Definido anteriormente
...
spam(42) ## El código que utiliza las funciones aparece al final
Las funciones posteriores se basan en las funciones anteriores. Una vez más, esto solo es un punto de estilo. Lo único que importa en el programa anterior es que la llamada a spam(42)
vaya al final.
Idealmente, las funciones deben ser una caja negra. Solo deben operar sobre las entradas pasadas y evitar variables globales y efectos secundarios misteriosos. Tus objetivos principales: Modularidad y Previsibilidad.
Es una buena práctica incluir documentación en forma de una cadena de documentación (doc-string). Las cadenas de documentación son cadenas escritas inmediatamente después del nombre de la función. Son utilizadas por help()
, entornos de desarrollo integrados (IDEs) y otras herramientas.
def read_prices(filename):
'''
Lee los precios de un archivo CSV con datos de nombre,precio
'''
prices = {}
with open(filename) as f:
f_csv = csv.reader(f)
for row in f_csv:
prices[row[0]] = float(row[1])
return prices
Una buena práctica para las cadenas de documentación es escribir un resumen corto en una sola oración de lo que hace la función. Si se necesita más información, incluir un ejemplo corto de uso junto con una descripción más detallada de los argumentos.
También puedes agregar sugerencias opcionales de tipo a las definiciones de funciones.
def read_prices(filename: str) -> dict:
'''
Lee los precios de un archivo CSV con datos de nombre,precio
'''
prices = {}
with open(filename) as f:
f_csv = csv.reader(f)
for row in f_csv:
prices[row[0]] = float(row[1])
return prices
Las sugerencias no tienen ningún efecto operativo. Son puramente informativas. Sin embargo, pueden ser utilizadas por IDEs, verificadores de código y otras herramientas para hacer más.
En la sección 2, escribiste un programa llamado report.py
que imprimía un informe mostrando el rendimiento de una cartera de acciones. Este programa consistía en algunas funciones. Por ejemplo:
## report.py
import csv
def read_portfolio(filename):
'''
Lee un archivo de cartera de acciones en una lista de diccionarios con claves
name, shares y price.
'''
portfolio = []
with open(filename) as f:
rows = csv.reader(f)
headers = next(rows)
for row in rows:
record = dict(zip(headers, row))
stock = {
'name' : record['name'],
'shares' : int(record['shares']),
'price' : float(record['price'])
}
portfolio.append(stock)
return portfolio
...
Sin embargo, también había porciones del programa que simplemente realizaban una serie de cálculos preestablecidos. Este código aparecía cerca del final del programa. Por ejemplo:
...
## Imprime el informe
headers = ('Name', 'Shares', 'Price', 'Change')
print('%10s %10s %10s %10s' % headers)
print(('-' * 10 +'') * len(headers))
for row in report:
print('%10s %10d %10.2f %10.2f' % row)
...
En este ejercicio, vamos a tomar este programa y organizarlo un poco más sólidamente en torno al uso de funciones.
Modifica tu programa report.py
de modo que todas las operaciones principales, incluyendo cálculos y salida, se realicen mediante una colección de funciones. Específicamente:
print_report(report)
que imprima el informe.Toma la última parte de tu programa y encapsúlala en una función única portfolio_report(portfolio_filename, prices_filename)
. Haz que la función funcione de modo que la siguiente llamada a la función cree el informe como antes:
portfolio_report('/home/labex/project/portfolio.csv', '/home/labex/project/prices.csv')
En esta versión final, tu programa no será más que una serie de definiciones de funciones seguidas de una única llamada a la función portfolio_report()
al final (que ejecuta todos los pasos involucrados en el programa).
Al convertir tu programa en una única función, se vuelve fácil ejecutarlo con diferentes entradas. Por ejemplo, prueba estas declaraciones de manera interactiva después de ejecutar tu programa:
>>> portfolio_report('/home/labex/project/portfolio2.csv', '/home/labex/project/prices.csv')
... mira la salida...
>>> files = ['/home/labex/project/portfolio.csv', '/home/labex/project/portfolio2.csv']
>>> for name in files:
print(f'{name:-^43s}')
portfolio_report(name, '/home/labex/project/prices.csv')
print()
... mira la salida...
>>>
Python hace muy fácil escribir código de scripting relativamente no estructurado donde simplemente tienes un archivo con una secuencia de declaraciones. En general, es casi siempre mejor utilizar funciones siempre que sea posible. En algún momento, ese script va a crecer y desearás haber tenido un poco más de organización. Además, un hecho poco conocido es que Python ejecuta un poco más rápido si se utilizan funciones.
¡Felicidades! Has completado el laboratorio de scripting. Puedes practicar más laboratorios en LabEx para mejorar tus habilidades.