Introducción
A medida que sus programas empiecen a crecer, querrá organizarse. Esta sección presenta brevemente las funciones y los módulos de biblioteca. También se introduce el manejo de errores con excepciones.
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í
A medida que sus programas empiecen a crecer, querrá organizarse. Esta sección presenta brevemente las funciones y los módulos de biblioteca. También se introduce el manejo de errores con excepciones.
Utilice funciones para el código que desee reutilizar. Aquí hay una definición de función:
def sumcount(n):
'''
Devuelve la suma de los primeros n enteros
'''
total = 0
while n > 0:
total += n
n -= 1
return total
Para llamar a una función.
a = sumcount(100)
Una función es una serie de instrucciones que realizan una tarea y devuelven un resultado. La palabra clave return
es necesaria para especificar explícitamente el valor de retorno de la función.
Python viene con una gran biblioteca estándar. Los módulos de biblioteca se acceden utilizando import
. Por ejemplo:
import math
x = math.sqrt(10)
import urllib.request
u = urllib.request.urlopen('http://www.python.org/')
data = u.read()
Veremos las bibliotecas y los módulos con más detalle más adelante.
Las funciones informan de errores como excepciones. Una excepción hace que una función se detenga y puede hacer que todo su programa se detenga si no se maneja.
Pruebe esto en su intérprete interactivo de Python.
>>> int('N/A')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: 'N/A'
>>>
Para fines de depuración, el mensaje describe lo que sucedió, dónde ocurrió el error y una traza que muestra las otras llamadas a funciones que condujeron al fracaso.
Las excepciones pueden ser capturadas y manejadas.
Para capturar, use la instrucción try - except
.
for line in file:
fields = line.split(',')
try:
shares = int(fields[1])
except ValueError:
print("Couldn't parse", line)
...
El nombre ValueError
debe coincidir con el tipo de error que se está intentando capturar.
A menudo es difícil saber exactamente qué tipos de errores pueden ocurrir con anticipación, dependiendo de la operación que se está realizando. Por mejor o por peor, el manejo de excepciones a menudo se agrega después de que un programa se ha detenido inesperadamente (es decir, "oh, olvidamos capturar ese error. Deberíamos manejarlo!").
Para lanzar una excepción, use la instrucción raise
.
raise RuntimeError('What a kerfuffle')
Esto hará que el programa se detenga con una traza de excepción. A menos que sea capturado por un bloque try-except
.
% python3 foo.py
Traceback (most recent call last):
File "foo.py", line 21, in <module>
raise RuntimeError("What a kerfuffle")
RuntimeError: What a kerfuffle
Intente definir una función simple:
>>> def greeting(name):
'Issues a greeting'
print('Hello', name)
>>> greeting('Guido')
Hello Guido
>>> greeting('Paula')
Hello Paula
>>>
Si la primera declaración de una función es una cadena de texto, sirve como documentación. Intente escribir un comando como help(greeting)
para verla mostrada.
Tome el código que escribió para el programa pcost.py
en el Ejercicio 1.27 y conviértalo en una función portfolio_cost(filename)
. Esta función toma un nombre de archivo como entrada, lee los datos del portafolio en ese archivo y devuelve el costo total del portafolio como un número de punto flotante.
Para usar su función, cambie su programa de modo que se vea más o menos así:
## pcost.py
def portfolio_cost(filename):
"""
Computes the total cost (shares*price) of a portfolio file
"""
total_cost = 0.0
with open(filename, "rt") as f:
rows = f.readlines()
headers = rows[0].strip().split(",")
for row in rows[1:]:
row_data = row.strip().split(",")
nshares = int(row_data[1])
price = float(row_data[2])
total_cost += nshares * price
return total_cost
import sys
if len(sys.argv) == 2:
filename = sys.argv[1]
else:
filename = input("Enter a filename:")
cost = portfolio_cost(filename)
print("Total cost:", cost)
Cuando ejecute su programa, debería ver la misma salida que antes. Después de ejecutar su programa, también puede llamar a su función de manera interactiva escribiendo esto:
$ python3 -i pcost.py
Esto le permitirá llamar a su función desde el modo interactivo.
>>> portfolio_cost('portfolio.csv')
44671.15
>>>
Poder experimentar con su código de manera interactiva es útil para probar y depurar.
¿Qué pasa si intenta usar su función en un archivo con algunos campos faltantes?
>>> portfolio_cost('missing.csv')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "pcost.py", line 11, in portfolio_cost
nshares = int(fields[1])
ValueError: invalid literal for int() with base 10: ''
>>>
En este momento, se enfrenta a una decisión. Para que el programa funcione, puede limpiar el archivo de entrada original eliminando las líneas incorrectas o puede modificar su código para manejar las líneas incorrectas de alguna manera.
Modifique el programa pcost.py
para capturar la excepción, imprimir un mensaje de advertencia y continuar procesando el resto del archivo.
Python viene con una gran biblioteca estándar de funciones útiles. Una biblioteca que podría ser útil aquí es el módulo csv
. Debería usarlo siempre que tenga que trabajar con archivos de datos CSV. Aquí hay un ejemplo de cómo funciona:
>>> import csv
>>> f = open('portfolio.csv')
>>> rows = csv.reader(f)
>>> headers = next(rows)
>>> headers
['name','shares', 'price']
>>> for row in rows:
print(row)
['AA', '100', '32.20']
['IBM', '50', '91.10']
['CAT', '150', '83.44']
['MSFT', '200', '51.23']
['GE', '95', '40.37']
['MSFT', '50', '65.10']
['IBM', '100', '70.44']
>>> f.close()
>>>
Una de las cosas buenas del módulo csv
es que se ocupa de una variedad de detalles de bajo nivel, como la citación y la división correcta por comas. En la salida anterior, notará que ha quitado las comillas dobles de los nombres en la primera columna.
Modifique su programa pcost.py
para que use el módulo csv
para el análisis y pruebe a ejecutar los ejemplos anteriores.
En el programa pcost.py
, el nombre del archivo de entrada se ha fijado en el código:
## pcost.py
def portfolio_cost(filename):
...
## Su código aquí
...
cost = portfolio_cost('portfolio.csv')
print('Total cost:', cost)
Eso está bien para aprender y probar, pero en un programa real probablemente no harías eso.
En cambio, es posible que pasaras el nombre del archivo como argumento a un script. Intenta cambiar la parte inferior del programa de la siguiente manera:
## pcost_1.33.py
import csv
def portfolio_cost(filename):
"""
Computes the total cost (shares*price) of a portfolio file
"""
total_cost = 0.0
with open(filename, "rt") as f:
rows = csv.reader(f)
headers = next(rows) ## Omite la fila de encabezados
for row in rows:
if len(row) < 3:
print("Saltando fila no válida:", row)
continue
try:
nshares = int(row[1])
price = float(row[2])
total_cost += nshares * price
except (IndexError, ValueError):
print("Saltando fila no válida:", row)
return total_cost
import sys
if len(sys.argv) == 2:
filename = sys.argv[1]
else:
filename = 'portfolio.csv'
cost = portfolio_cost(filename)
print('Total cost:', cost)
sys.argv
es una lista que contiene los argumentos pasados en la línea de comandos (si los hay).
Para ejecutar su programa, tendrás que ejecutar Python desde la terminal.
Por ejemplo, desde bash en Unix:
$ python3 pcost.py portfolio.csv
Total cost: 44671.15
bash %
¡Felicitaciones! Has completado el laboratorio de Funciones. Puedes practicar más laboratorios en LabEx para mejorar tus habilidades.