<jupyter_start><jupyter_text>**CONTINUACIÓN DE LOS EJEMPLOS DEL USO DE LISTA DE COMPRENSIÓN**---COMPRENSIÓN DE CONJUNTOS---La comprensión es muy similar a la que veniamos manejando con lista. La única diferencia es que se usa los {}Recordemos que los conjuntos también denominados *sets* no permiten duplicas, es decirm cada elemento es único. Si se llaga añadir un elemento repetido, no arrojará error, pero no se mostrará en el print<jupyter_code>sa = "ema ama a mama"
sa2 = {i for i in sa if i == "m"}
print(sa2)<jupyter_output>{'m'}<jupyter_text>Ahora, veamos a continuación el caso de diccionarios de comprensión. La única diferencia que tiene respecto a las listas o conjuntos de comprensión es la especificación de llaves o claves(key)<jupyter_code>lista1 = ['nombre', 'apellido', 'ciudad']
lista2 = ['Ana', 'Rodriguez', 'Popayan']

dict = {i:j for i, j in zip(lista1, lista2)}
print(dict)<jupyter_output>{'nombre': 'Ana', 'apellido': 'Rodriguez', 'ciudad': 'Popayan'}<jupyter_text>Podemos observar que anadiendo : asignamos un valor a la llave declarada, a su vez, usamos zip() el cual tiene como función iterar dos listas en paralelo. Es decir con zip podemos convertir dos listas en un diccionario y el for se manejaria iterando los valores en simultaneo. **OTRAS ESTRUCTURAS DE CONTROL**---1. Switch2. Break3. Continue4. Complemento de iteración (Enumarate).**1. Switch**Es una herramienta que permite ejecutar diferentes secciones de código dependiendo de las condiciones impuestas. Su función es muy similar a usar if anidados o varios por separado al mismo tiempo.Sin embargo en python no hay un switch directo.**2. Break**Nos permite alterar el comportamiento de los ciclos de While y For. Directamente su función es la de finalizar los ciclos.<jupyter_code>x = "Andrea"
for i in  x:
  if i == "e":
    print("Se obtuvo la letra e")
    break
print(i)
x = 15
while True:
  x -= 1
  print(x)
  if x == 0:
    break
print("Se finaliza el ciclo")
#Uso de break con los ciclos anidados:
for i in range(1,8):
  for j in range(1,8):
    break
  print(i,j)

#El break no afecta el for externo, rompe el ciclo anidado en su conjunto pero no afecta directamente el ciclo exterior<jupyter_output>1 1
2 1
3 1
4 1
5 1
6 1
7 1<jupyter_text>**3. Continue**Se salta todo el código restante en la iteración actual y vuelve al principio en caso que queda elementos por iterar.Diferencias entre break y continue: La principal diferencia es que continue no rompe el ciclo, si no que pasa a la iteración pendiente<jupyter_code>x = "Andrea"
for i in x:
  if i == "r":
    continue
  print(i)
x = 15
while x > 0:
  x -= 1
  if x == 3:
    continue
  print(x)<jupyter_output>14
13
12
11
10
9
8
7
6
5
4
2
1
0<jupyter_text>** 4. enumerate**Python nos permite iterar colecciones de objetos y elementos de la misma forma. Sin embargo hay una opción que es que en algunas situaciones que queramos acceder a un elemento ordenado podemos hacerlo nombrabdo el indice de cada elemento llamado.<jupyter_code>w = ["sa", "se", "si", "so", "su"]
indice = 1
for i in w:
  print(indice, i)
  indice +=1
w = ["sa", "se", "si", "so", "su"]
for indice, i in enumerate(w):
  print(indice, i)

x = list(enumerate(w))
print(x)<jupyter_output>0 sa
1 se
2 si
3 so
4 su
[(0, 'sa'), (1, 'se'), (2, 'si'), (3, 'so'), (4, 'su')]<jupyter_text>**Uso zip()**---Si pasamos dos listas a zip, el resultado será una tupla donde cada elemento tendrá todos y cada uno de los elementos de las entradas<jupyter_code>a = [1,2,3]
b = ["a", "b", "c"]
x = ("q", "w", "e")
z = (10, 20, 30)
c = zip(a, b)
print(list(c))


for i, j, k, l in zip(a,b, x,z):
  print(i,j,k,l)
c = [(1, 'a'), (2, 'b'), (3, 'c')]
a, b = zip(*c)
print(a)
print(b)<jupyter_output>(1, 2, 3)
('a', 'b', 'c')<jupyter_text>**FUNCIONES**---La función nos permite ordenar de manera adecuada la generación de objetos y bloques por ciclos y demás estructura.La sintaxis es la siguiente:def nombre_funcion(argumentos):  códigonombre_funcion(argumentos2)<jupyter_code>def f(a):
  return 2 * a

y = f(3)
print(y)<jupyter_output>6<jupyter_text>Las funciones no solo realaizan una operación en sus entradas (argumentos de inicio). Sino también parten de los siguientes principios:**1. Reusabilidad:** Si tenemos un fragmento usado en muchos sitios y se guarda en una función. Nos evitará tener códigos repetidos, además de la conveniencia que tiene por ser facimente editable.**2. Modularidad:** Permite legibilidad de forma más sencilla, es decir, los largos bloques de código se pueden agrupar en módulos o funciones y la lectura va a ser mucho más sencilla.<jupyter_code># Ejemplo 1: Función sin argumentos de entrada ni parámetros de salida:

def s(): # Declaración de función
  print("Hi Gabriela")
s() #Al cerrar la deficion de la funcion me va a ejecutar el código
#Ejemplo 2: Incluir argumentos de entrada y salida
def s(apellido):
  print("Hi Gabriela", apellido)
s("León")
# Ejemplo 3: Usando dos argumentos de entrada y salida y operacion matematico
def suma(a,b):
  return a+b
suma(3,5)
# Ejemplo 4: Reusabilidad del código
suma(a=4, b=20)
# Ejemplo 5: Argumentos fijos desde el inicio
def suma(a, b, c, d=1):
  return a+b+c+d
suma(2,3,4)
# Ejemplo 6: Argumentos de longitud variable

def suma(number):
  total = 0
  for i in number:
    total += i
  return total
suma([1,3,5,4])<jupyter_output><empty_output><jupyter_text>Se realizó la suma de todos los números de entrada. Para ello la declaración de los argumentos de salida seria como una lista.La forma de sintaxis anterior es valida, sin embargo, tenemos un solo argumento que es una lista de números.Si declaramos un argumento con *, esto hará que el argumento en guarfafo como tupla manera automática.<jupyter_code>def suma(*number):
  print(type(number))
  total = 0
  for i in number:
    total += i
  return total

suma(1,3,5,4)<jupyter_output><class 'tuple'>
{'fraction_non_alphanumeric': 0.10390277302293735, 'fraction_numerical': 0.02019856213625471, 'mean_word_length': 4.650870406189555, 'pattern_counts': {'":': 2, '<': 30, '<?xml version=': 0, '>': 31, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '9', 'dir': 'jupyter-structured-clean-dedup', 'id': '538476', 'license': 'MIT', 'n_tokens_mistral': 2258, 'n_tokens_neox': 2198, 'n_words': 846, 'path': 'Clase6.ipynb', 'repo_name': 'GabyLeon10100/MujeresDigitales', 'size': '5842'}