<jupyter_start><jupyter_text>Control de flujo Las principales estrucuras para control de flujo en Python son:* if, elif, else* for* while* try / except__Nota__: Las estructuras de control de flujo terminan siempre con __:__ (dos puntos) y van seguidas de una sangría.  if, elif, elseDe la misma manera que en otros lenguajes de programación los bloques `if` - `else` nos permiten que el programa ejecute operaciones distintas según el valor de una condición.    if :            elif :            else:<jupyter_code>a = 6
if a > 5:
    print('Muy alto')
elif a < 5:
    print('Muy bajo')
else:
    print('Valor correcto')<jupyter_output>Muy alto<jupyter_text>No hay límite para el número de `elif` y tanto estos como el `else` son opcionales. Sobre las condiciones:* Aunque tipicamente utilizaremos condiciones con valores __True__ y __False__ los valores booleanos de otros objetos pueden ser declarados explicitamente. * En el caso particular de los valores enteros (__int__) el valor __0__ es evaluado como __False__ y cualquier otro como __True__. * Para listas y tuples podemos usar sus métodos __any()__ y __all()__. Se debe de tener especial cuidado con los operadores __==__, __<__, __!=__, etc. cuando se opera con listas y tuples. * Otros operadores que pueden ser útiles: __is__, __not__, __in__.  forLos ciclos `for` nos permiten repetir un procedimiento sobre un conjunto de valores que (normalmente) conocemos con anterioridad.<jupyter_code>f = "Fantástico"
for i in range(10):
    print(f[i])<jupyter_output>F
a
n
t
á
s
t
i
c
o<jupyter_text>Sólo como una anotación: 'range()' es un **generador**: un objeto sobre el que se puede iterar y entrega un elemento a cada iteración. Los **generadores** se pueden convertir en listas o tuples usando:<jupyter_code>print(range(10))
print([i for i in range(10)])<jupyter_output>range(0, 10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]<jupyter_text>Sin embargo, es comun en Python accesar directamente los elementos de la cadena, lista o tuple para iterar sobre ellos.<jupyter_code>for letra in f:
    print(letra)<jupyter_output>F
a
n
t
á
s
t
i
c
o<jupyter_text>whileLos bloques `while` nos sirven para hacer un cilco cuando no sabemos de antemano el número de veces que se repetirá.<jupyter_code>import random
a = 0
while a != 5:
    a = int(random.random() * 10)
    print(a)<jupyter_output>8
5<jupyter_text>try - exceptLos bloques `try` - `except` nos permiten __detener__ errores que pudieran pasar en el código (normalmente errores esperados) y hacer que nuestro código los resuelva, lo ignore o, en todo caso, sea más específico en el mensaje de error hacia el usuario.<jupyter_code>a = 0
try:
    # haremos algo ilegal
    fff = 100 / a
except:
    raise ValueError('La variable a tiene no puede ser igual a cero.')
a = 0
try:
    # haremos algo ilegal
    fff = 100 / a
except:
    # En lugar de generar un error asignamos un valor alto a fff
    fff = 100000000

print(fff)
a = 0
try:
    # haremos algo ilegal
    ggg = 100 / a
except:
    # O simplemente lo ignoramos
    pass<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.07586657946370176, 'fraction_numerical': 0.016350555918901243, 'mean_word_length': 4.238013698630137, 'pattern_counts': {'":': 0, '<': 22, '<?xml version=': 0, '>': 21, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 1, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '6', 'dir': 'jupyter-structured-clean-dedup', 'id': '580389', 'license': 'CNRI-Python', 'n_tokens_mistral': 1096, 'n_tokens_neox': 1058, 'n_words': 425, 'path': 'Sesion 1/C-Control de Flujo.ipynb', 'repo_name': 'ochoadavid/TallerDePython', 'size': '3058'}