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!