Contenido
Control de Excepciones¶
Se pueden clasificar los errores en dos tipos: errores de sintaxis y excepciones. El primero surge cuando escribimos de forma incorrecta en Python. El segundo puede presentarse aún si se tiene una sintaxis correcta. En particular, nos preocuparemos por controlar las excepciones.
SyntaxError. Se genera cuando el analizador encuentra un error de sintaxis.
if 5 > 6
print('Hello world')
File "<ipython-input-1-50e4c63b882d>", line 1
if 5 > 6
^
SyntaxError: invalid syntax
Una excepción es un error que ocurre mientras se ejecuta un programa, lo que hace que el programa se detenga abruptamente
ZeroDivisionError. Se genera cuando el segundo argumento de una operación de división o módulo es cero.
100/0
---------------------------------------------------------------------------
ZeroDivisionError Traceback (most recent call last)
<ipython-input-2-bbe761e74a70> in <module>
----> 1 100/0
ZeroDivisionError: division by zero
NameError. Se genera cuando no se encuentra un nombre local o global
pi * 12 - 23
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-7-10a326fd1f79> in <module>
----> 1 pi * 12 - 23
NameError: name 'pi' is not defined
from IPython.display import IFrame, HTML, display
IFrame("https://slides.com/ra_fa/labcdpcide/fullscreen#/4/2", width =1000, height=700)
Se tienen varias formas de manejar a las excepciones, la más sencilla es la forma try/except
# Bajo cualquier tipo de excepción que ocurra dentro de ´try´ se ejecuta lo ue esta dentro del ´except´
b = 100
a = 10
try:
print("el resultado es:", b/a)
except:
print("Deda de jugar con la división compa")
for _ in range(4):
print(_)
el resultado es: 10.0
0
1
2
3
# Se especifica un manejo para una excepción
# Se especifica un manejo distinto para las demás excepciones
b = 100
a = 10
try:
print("el resultado es:", b/w)
except ZeroDivisionError: # pueden ser varias al mismo tiempo
print("Deda de jugar con la división compa")
except:
print("Quien sabe que estes haciendo pero deja de jugar")
for _ in range(4):
print(_)
Quien sabe que estes haciendo pero deja de jugar
0
1
2
3
# Si no se encuentra la excepción a manejar el programa
# termina abruptamente (as usual)
b = 100
a = 0
try:
print("el resultado es:", b/w)
except ZeroDivisionError: # pueden ser varias al mismo tiempo
print("Deda de jugar con la división compa")
for _ in range(4):
print(_)
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-12-223352a5d311> in <module>
3
4 try:
----> 5 print("el resultado es:", b/w)
6
7 except ZeroDivisionError: # pueden ser varias al mismo tiempo
NameError: name 'w' is not defined
Podemos agregar una sentencia opcional: try/except/else
Bajo esa situación la sintaxis es la siguiente
try:
statement
statement
etc.
except ExceptionName:
statement
statement
etc.
else:
statement
statement
etc.
Las sentencias dentro del else se ejecutan después de las sentencias dentro de try, solo si no se generaron excepciones.
Podemos agregar una sentencia opcional: try/except/finally
Bajo esa situación la sintaxis es la siguiente
try:
statement
statement
etc.
except ExceptionName:
statement
statement
etc.
finally:
statement
statement
etc.
Las sentencias dentro de ´finally´ se ejecutan como intruciones finales del ´try´ o de la excepción (no importa loq ue pase se ejecutarán). Usualmente cuando se incluye es para limpiar, como cerrar archivos u otros recursos.
Existen variantes de los manejos anteriores, por ejmplo:
Pueden utilizarse al estructura: try/except/else/finally con sintaxis similar a las anteriores
Dentro del finally puede existir un try/except
Apéndice¶
pass
print('hola')
pass
print('adios')
hola
adios
Comparar enteros con cadenas
La actualización del lenguaje
a = 3
if a > 'comida' :
print('hola')
print('adios')
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-23-a1cc169af910> in <module>
1 a = 3
2
----> 3 if a > 'comida' :
4 print('hola')
5
TypeError: '>' not supported between instances of 'int' and 'str'
Variables tipo Range
a = range(5)
for _ in a:
print(_ ,a)
type(a)
0 range(0, 5)
1 range(0, 5)
2 range(0, 5)
3 range(0, 5)
4 range(0, 5)
range
Algunos ejercicios
http://spcp.wikidot.com/tareas
** Ordenamiento de arreglos**
https://brilliant.org/wiki/sorting-algorithms/
Zen de Python
Un listado de los principios de diseño y la filosofía de Python que son útiles para entender y usar el lenguaje.
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!