En la primera parte vimos los **tipos de datos** de Python. En este segundo capítulo cubrimos los **operadores**, el **control de flujo** (if, for, while) y las **funciones**.
📚 **Esta entrada es parte de la serie _Guía completa de Python_**, dividida en tres capítulos que se leen en orden:
> * Parte 1: Tipos de datos
* 👉 **Parte 2: Operadores, control de flujo y funciones**
* Parte 3: Clases, objetos y temas avanzados
3. Operadores
3.1. Operadores aritméticos
Operador suma +
InputPython3 + 5Copied
8
Operador de resta -
InputPython3 - 5Copied
-2
Operador multiplicación *
InputPython3 * 5Copied
15
Operador de división /
InputPython3 / 5Copied
0.6
Operador módulo %. Devuelve el resto de una división
InputPython25 % 2Copied
1
Operador exponente **
InputPython5 ** 2Copied
25
Operador división entera //
InputPython25 // 2Copied
12
3.2. Operadores de comparación
Operador es igual ==
InputPython1 == 1Copied
True
Operador es diferente !=
InputPython1 != 2Copied
True
Operador es mayor que >
InputPython3 > 2Copied
True
Operador es menor que <
InputPython2 < 3Copied
True
Operador es mayor o igual que >=
InputPython3 >= 3Copied
True
Operador es menor o igual que <=
InputPython3 <= 3Copied
True
3.3. Operadores lógicos
Operador and
InputPythonTrue and TrueCopied
True
Operador or
InputPythonTrue or FalseCopied
True
Operador not
InputPythonnot FalseCopied
True
3.4. Operadores de identidad
Operador is
InputPython5.3 is 5.3Copied
True
Operador is not
InputPython5.3 is not 5Copied
True
3.5. Operadores de pertenencia
Operador in
InputPythonx = ["apple", "banana"]"banana" in xCopied
True
Operador not in
InputPythonx = ["apple", "banana"]"orange" not in xCopied
True
3.6. Operadores bit a bit
Operador AND &
InputPythona = 60 # 60 = 0011 1100b = 13 # 13 = 0000 1101c = a & b; # 12 = 0000 1100cCopied
12
Operador OR |
InputPythona = 60 # 60 = 0011 1100b = 13 # 13 = 0000 1101c = a | b; # 61 = 0011 1101cCopied
61
Operador XOR ^
InputPythona = 60 # 60 = 0011 1100b = 13 # 13 = 0000 1101c = a ^ b; # 49 = 0011 0001cCopied
49
Operador NOT ~
InputPythona = 60 # 60 = 0011 1100c = ~a; # -61 = 1100 0011cCopied
-61
Operador de desplazamiento hacia la izquierda <<
InputPythona = 60 # 60 = 0011 1100c = a << 2; # 240 = 1111 0000cCopied
240
Operador de desplazamiento hacia la derecha >>
InputPythona = 60 # 60 = 0011 1100c = a >> 2; # 15 = 0000 1111cCopied
15
3.7. Operadores de asignación
Operador `=
InputPythona = 5aCopied
5
Operador +=. x += y es equivalente a x = x + y
InputPythona += 5aCopied
10
Operador -=. x -= y es equivalente a `x = x - y
InputPythona -= 5aCopied
5
Operador *=. x *= y es equivalente a `x = x * y
InputPythona *= 3aCopied
15
Operador /=. x /= y es equivalente a `x = x / y
InputPythona /= 3aCopied
5.0
Operador %=. x %= y es equivalente a `x = x % y
InputPythona = 25a %= 2aCopied
1
Operador //=. x //= y es equivalente a `x = x // y
InputPythona = 25a //= 2aCopied
12
Operador **=. x **= y es equivalente a `x = x ** y
InputPythona = 5a **= 2aCopied
25
Operador &=. x &= y es equivalente a `x = x & y
InputPythona = 60 # 60 = 0011 1100b = 13 # 13 = 0000 1101a &= b; # 12 = 0000 1100aCopied
12
Operador |=. x |= y es equivalente a x = x | y
InputPythona = 60 # 60 = 0011 1100b = 13 # 13 = 0000 1101a |= b; # 61 = 0011 1101aCopied
61
Operador ^=. x ^= y es equivalente a x = x ^ y
InputPythona = 60 # 60 = 0011 1100b = 13 # 13 = 0000 1101a ^= b; # 49 = 0011 0001aCopied
49
Operador >>=. x >>= y es equivalente a `x = x >> y
InputPythona = 60 # 60 = 0011 1100a <<= 2; # 240 = 1111 0000aCopied
240
Operador <<=. x <<= y es equivalente a x = x << y
InputPythona = 60 # 60 = 0011 1100a >>= 2; # 15 = 0000 1111aCopied
15
4. Control de flujo
Para poder utilizar las herramientas de control de flujo es necesario añadir la sentencia, dos puntos : y en una nueva línea escribir el código con indentación.
A diferencia de otros lenguajes, Python necesita la indentación (añadir un espacio en blanco) para definir el código dentro de una herramienta de control de flujo
4.1. If
Mediante if podemos crear condicionales
InputPythonif len('MaximoFN') == 8:print('MaximoFN tiene 8 caracteres')Copied
MaximoFN tiene 8 caracteres
Si queremos crear más de una condición podemos usar elif
InputPythonif len('MaximoFN') < 8:print('MaximoFN tiene menos de 8 caracteres')elif len('MaximoFN') == 8:print('MaximoFN tiene 8 caracteres')Copied
MaximoFN tiene 8 caracteres
Si lo que queremos es que se ejecute algo en caso de que no se cumpla ninguna de las condiciones indicadas, podemos usar else
InputPythonif len('MaximoFN') < 8:print('MaximoFN tiene menos de 8 caracteres')elif len('MaximoFN') > 8:print('MaximoFN tiene más de 8 caracteres')else:print('MaximoFN tiene 8 caracteres')Copied
MaximoFN tiene 8 caracteres
Si queremos escribir todo en una sola línea
InputPythonif len('MaximoFN') == 8: print('MaximoFN tiene 8 caracteres')Copied
MaximoFN tiene 8 caracteres
Igual, si queremos escribir todo en una línea, pero con varias condiciones
InputPythonprint('MaximoFN tiene menos de 8 caracteres') if len('MaximoFN') < 8 else print('MaximoFN tiene más de 8 caracteres') if len('MaximoFN') > 8 else print('MaximoFN tiene 8 caracteres')Copied
MaximoFN tiene 8 caracteres
Si por ejemplo queremos hacer la estructura del if pero no queremos, de momento, codificar una de las condiciones, podemos usar pass
InputPythonif len('MaximoFN') < 8:print('MaximoFN tiene menos de 8 caracteres')elif len('MaximoFN') > 8:passelse:print('MaximoFN tiene 8 caracteres')Copied
MaximoFN tiene 8 caracteres
4.2. While
El bucle while se ejecuta mientras la condición sea True
InputPythoni = 0string = 'MaximoFN'while len(string) > i:print(string[i], end='')i += 1Copied
MaximoFN
Si queremos que el bucle pare por alguna condición, usamos break
InputPythoni = 0string = 'MaximoFN'while len(string) > i:if string[i] == 'F':breakprint(string[i], end='')i += 1Copied
Maximo
Si queremos que una de las iteraciones no se ejecute por alguna razón, usamos continue
InputPythoni = 0string = 'Maximo FN'while len(string) > i:if string[i] == ' ':i += 1continueprint(string[i], end='')i += 1Copied
MaximoFN
Mediante else se puede ejecutar un bloque de código si la condición del while no es True
InputPythoni = 0string = 'MaximoFN'while len(string) > i:print(string[i], end='')i += 1else:print(" Se ha terminado el while")Copied
MaximoFNSe ha terminado el while
4.3. For
El bucle for se usa para ejecutar código mientras se itera por una secuencia; esta secuencia puede ser cualquier elemento iterable de Python (string, lista, tupla, range, diccionario, set)
InputPythonstring = 'MaximoFN'for x in string:print(x, end='')Copied
MaximoFN
InputPythonlista = ['M', 'a', 'x', 'i', 'm', 'o', 'F', 'N']for x in lista:print(x, end='')Copied
MaximoFN
InputPythontupla = ('M', 'a', 'x', 'i', 'm', 'o', 'F', 'N')for x in tupla:print(x, end='')Copied
MaximoFN
InputPythonstring = 'MaximoFN'for i in range(len(string)):print(string[i], end='')Copied
MaximoFN
InputPythondiccionario = {"letra1": "M","letra2": "a","letra3": "x","letra4": "i","letra5": "m","letra6": "o","letra7": "F","letra8": "N",}for x in diccionario.values():print(x, end='')Copied
MaximoFN
También se puede iterar por los sets, pero como son elementos no ordenados, no tendremos control del orden de ejecución
InputPythonset_ = {'M', 'a', 'x', 'i', 'm', 'o', 'F', 'N'}for x in set_:print(x, end='')Copied
NximoaMF
Si queremos que el bucle pare por alguna condición usamos break
InputPythonstring = 'MaximoFN'for x in string:if x == 'F':breakprint(x, end='')Copied
Maximo
Si queremos que una de las iteraciones no se ejecute por alguna razón, usamos continue
InputPythonstring = 'Maximo FN'for x in string:if x == ' ':continueprint(x, end='')Copied
MaximoFN
Mediante else se puede ejecutar un bloque de código si la condición del while no es True
InputPythonstring = 'MaximoFN'for x in string:print(x, end='')else:print(" Se ha terminado el for")Copied
MaximoFNSe ha terminado el for
Si por ejemplo queremos hacer la estructura del for pero no queremos, de momento, codificar su interior podemos usar pass
InputPythonstring = 'MaximoFN'for x in string:passprint('Interior del for no codificado')Copied
Interior del for no codificado
5. Funciones
Una función es una porción de código que se puede ejecutar tantas veces como quieras. Se le puede pasar argumentos y puede devolver datos como resultado
Para definir una función se comienza con la palabra reservada def, seguido del nombre de la función, paréntesis (), dos puntos : y a continuación en una nueva línea indentado el código de la función
InputPythondef funcion():print('MaximoFN')Copied
Para llamar a la función, solo es necesario escribir su nombre
InputPythonfuncion()Copied
MaximoFN
A las funciones se les pueden pasar todos los argumentos que se quieran, dentro de los paréntesis y separados por comas
InputPythondef funcion(string1, string2):print(string1 + ' ' + string2)funcion("Hola", "MaximoFN")Copied
Hola MaximoFN
Cuando se llama a la función hay que pasarle el mismo número de argumentos que se han declarado, si se pasan más o menos obtendríamos un error.
Si no sabemos los argumentos que va a recibir la función se puede usar *args, es decir, poniendo un * antes de los argumentos se indica que el número de argumentos es libre.
Al hacer esto, se le pasa una tupla (recordemos que es inmutable) con los argumentos
InputPythondef funcion(*argumentos):numero_argumentos = len(argumentos)for i in range(numero_argumentos):print(argumentos[i], end=' ')funcion("funcion", "con", "varios", "argumentos", "sin", "especificar", "cuantos")Copied
funcion con varios argumentos sin especificar cuantos
En caso de no saber el orden de los argumentos de una función, podemos indicar el argumento que le queremos pasar, indicándole su nombre
InputPythondef funcion(argumento1, argumento2, argumento3):print(argumento1 + ' '+ argumento2 + ' ' + argumento3)funcion(argumento3 = "MaximoFN", argumento1 = "Blog", argumento2 = "de")Copied
Blog de MaximoFN
En caso de querer pasar los argumentos con su nombre, pero en caso de no saber cuántos argumentos se van a pasar, se puede usar **kwargs. En este caso se le pasará un diccionario con los argumentos
InputPythondef funcion(**kargumentos):print("Autor del blog: " + kargumentos["autor"])funcion(blog = "Blog", pertenencia = "de", autor = "MaximoFN")Copied
Autor del blog: MaximoFN
Si queremos que algún argumento tenga un valor por defecto lo podemos indicar entre los paréntesis de la función. De esta manera, si a la hora de llamar a la función no se pasa dicho argumento, éste en la función tendrá el valor por defecto
InputPythondef funcion(argumento1, argumento2, argumento3 = "MaximoFN"):print(argumento1 + ' '+ argumento2 + ' ' + argumento3)funcion("Blog", "de")Copied
Blog de MaximoFN
Se puede pasar cualquier tipo de dato como argumento. Por ejemplo, si se pasa una lista como argumento, dentro de la función, dicho argumento será tratado como una lista
InputPythondef funcion(argumento):longitud_lista = len(argumento)for i in range(longitud_lista):print(argumento[i], end=' ')funcion(["Blog", "de", "MaximoFN"])Copied
Blog de MaximoFN
Las funciones pueden devolver datos, esto se hace mediante la palabra reservada return
InputPythondef funcion(argumento):longitud_lista = len(argumento)string = ""for i in range(longitud_lista):string = string + argumento[i] + ' 'return stringprint(funcion(["Blog", "de", "MaximoFN"]))Copied
Blog de MaximoFN
Pueden devolver más de un dato
InputPythondef funcion(argumento):longitud_lista = len(argumento)string0 = argumento[0]string1 = argumento[1]string2 = argumento[2]return string0, string1, string2dato0, dato1, dato2 = funcion(["Blog", "de", "MaximoFN"])print(dato0 + ' ' + dato1 + ' ' + dato2)Copied
Blog de MaximoFN
Si uno de los datos devueltos no nos interesa, podemos pasar de él mediante `_
InputPythondef funcion(argumento):longitud_lista = len(argumento)string0 = argumento[0]string1 = argumento[1]string2 = argumento[2]return string0, string1, string2_, _, dato_de_interes = funcion(["Blog", "de", "MaximoFN"])print(dato_de_interes)Copied
MaximoFN
Si, por ejemplo, queremos hacer la estructura de la función, pero no queremos, de momento, codificar el interior, podemos usar pass
InputPythondef funcion():passfuncion()Copied
Una función puede llamarse a sí misma, a esto se le llama recursión o recursividad de la función.
Por ejemplo, podemos usar esta cualidad para calcular el factorial de un número
InputPythondef factorial(n):if n == 0 or n == 1:return 1else:return n * factorial(n-1)factorial(5)Copied
120
5.1. Built-in functions
Hay una serie de funciones ya definidas en Python que se pueden usar, como por ejemplo la función abs(), que devuelve el valor absoluto
InputPythonabs(-5)Copied
5
A continuación se muestra una lista de estas funciones
InputPythonimport builtinsdir(builtins)Copied
['ArithmeticError','AssertionError','AttributeError','BaseException','BlockingIOError','BrokenPipeError','BufferError','BytesWarning','ChildProcessError','ConnectionAbortedError','ConnectionError','ConnectionRefusedError','ConnectionResetError','DeprecationWarning','EOFError','Ellipsis','EnvironmentError','Exception','False','FileExistsError',...'slice','sorted','staticmethod','str','sum','super','tuple','type','vars','zip']
5.2. Documentación de una función
Se puede añadir una explicación de una función que creemos mediante un comentario al inicio de la función; de esta manera, cuando llamemos a la built-in function help() nos mostrará dicha explicación.
InputPythondef funcion():"Esta es la explicación de la función"Nonehelp(funcion)Copied
Help on function funcion in module __main__:funcion()Esta es la explicación de la función
Otra opción para ver la explicación de la función es usar el método __doc__ de la función
InputPythonfuncion.__doc__Copied
'Esta es la explicación de la función'
5.3. Decoradores
Los decoradores son una funcionalidad de Python que permite añadir características nuevas a una función
Se crea una función decoradora que tiene como parámetro otra función. Entonces la función decoradora añade la característica nueva a la función que recibe
InputPythondef decorador(parametro_funcion):"""Agrega barritas arriba y abajo de la funcion"""def envoltorio():"""Aplica las barritas al texto"""print("==================")parametro_funcion()print("==================")return envoltoriodef funcion():print("MaximoFN")funcion_envoltorio = decorador(funcion)print('Función sin decoradores: ')funcion()print(' Función con decoradores: ')funcion_envoltorio()Copied
Función sin decoradores:MaximoFNFunción con decoradores:==================MaximoFN==================
Pero otra manera más potente de usar los decoradores es mediante el uso de @ y el nombre del decorador antes de la función.
Es decir, primero se define el decorador y, a continuación, se llama a una función con el decorador definido
InputPythondef decorador2(parametro_funcion2):"""Agrega barritas arriba y abajo de la funcion"""def envoltorio2():"""Aplica las barritas al texto"""print("==================")parametro_funcion2()print("==================")return envoltorio2@decorador2def funcion2():print("MaximoFN")print('Función con decoradores: ')funcion2()Copied
Función con decoradores:==================MaximoFN==================
5.4. *args y **kwargs
*args y **kwargs son argumentos opcionales que se pueden usar al definir una función en Python. La sintaxis es la siguiente:
def mi_funcion(arg1, arg2, *args, **kwargs):
# código de la función aquí5.4.1. *args
*args se usa para enviar un número variable de argumentos a una función. Al usar *args, puedes enviar una cantidad variable de argumentos a la función sin tener que especificar el número exacto de argumentos que necesita la función. Los argumentos se reciben en la función como una tupla.
InputPythondef saludo(saludo, *nombres):for nombre in nombres:print(f"{saludo}, {nombre}")saludo("Hola", "Alicia", "Roberto", "Carlos")Copied
Hola, AliciaHola, RobertoHola, Carlos
5.4.2. **kwargs
**kwargs se usa de la misma manera, pero para enviar un número variable de argumentos con palabras clave (keyword arguments) a una función. Al usar **kwargs, puedes enviar una cantidad variable de argumentos a la función y especificar el valor de cada argumento usando su nombre. Los argumentos se reciben en la función como un diccionario.
InputPythondef saludo(saludo, **personas):for key, value in personas.items():print(f"{saludo} {key}, tu edad es {value} años")saludo("Hola", Juan=22, Maria=32, Pedro=25)Copied
Hola Juan, tu edad es 22 añosHola Maria, tu edad es 32 añosHola Pedro, tu edad es 25 años
6. Funciones adicionales
6.1. Funciones *lambda*
Una función *lambda* es una pequeña función anónima.
Una función *lambda* puede tomar cualquier número de argumentos, pero solo puede tener una expresión.
Las funciones *lambda* se definen de la siguiente manera:
lambda arguments : expressionInputPythonx = lambda a : a + 10print(x(5))Copied
15
InputPythonx = lambda a, b, c : a + b + cprint(x(5, 6, 2))Copied
13
El poder de *lambda* se muestra mejor cuando se usa como una función anónima dentro de otra función.
InputPythondef myfunc(n):return lambda a : a * nmydoubler = myfunc(2)mytripler = myfunc(3)print(f"mydoubler: {mydoubler(11)}")print(f"mytripler: {mytripler(11)}")Copied
mydoubler: 22mytripler: 33
6.2. Función map
La función map permite aplicar a cada elemento de una estructura iterable una función
InputPythonlista = [1, 2, 3]def funcion_mas_1(valor):return valor + 1lista_modificada = list(map(funcion_mas_1, lista))lista_modificadaCopied
[2, 3, 4]
Esto es equivalente a usar list comprehension
InputPythonlista_modificada = [funcion_mas_1(x) for x in lista]lista_modificadaCopied
[2, 3, 4]
6.3. Función filter
La función filter permite seleccionar los elementos de una estructura iterable que cumplan con una condición
InputPythonlista = [1, 2, 3, 4, 5, 6, 7]def esPar(valor):return valor % 2 == 0lista_filtrada = list(filter(esPar, lista))lista_filtradaCopied
[2, 4, 6]
Esto es equivalente a usar list comprehension
InputPythonlista_filtrada = [x for x in lista if esPar(x)]lista_filtradaCopied
[2, 4, 6]
6.4. Función reduce
La función reduce permite realizar tareas acumulativas sobre estructuras iterables
InputPythonfrom functools import reducelista = [1, 22, 33]def acumular(valor, acumulador):print(f'valor = {valor}, acumulador = {acumulador}, acumulacion = {valor + acumulador}')return valor + acumuladoracumulacion = reduce(acumular, lista)print(f' acumulacion = {acumulacion}')Copied
valor = 1, acumulador = 22, acumulacion = 23valor = 23, acumulador = 33, acumulacion = 56acumulacion = 56
6.5. Función zip
Con la función zip se puede combinar varias estructuras iterables en una sola, es decir, permite agrupar varios elementos de las estructuras *Ax* en una sola estructura *B*. La estructura *B* está formada por tuplas de los elementos de las estructuras *Ax*
InputPythonnombres = ["Manolo", "Andres", "Fernando"]altura = [181, 178, 180]my_zip = list(zip(nombres, altura))my_zipCopied
[('Manolo', 181), ('Andres', 178), ('Fernando', 180)]
6.5. Generadores
Supongamos que queremos iterar sobre una secuencia de números, pero de una manera especial que no nos ofrece ningún tipo de bucle. Esto lo podemos solucionar con los generadores. Para poder hacer esto, la función generadora no tiene que devolver el valor con return, sino con yield para que sepa que tiene que seguir iterando
InputPythondef iterador_custom(N):for i in range (N):if i % 3 == 0:yield igenerador = iterador_custom(20)for i in generador:print(i)Copied
0369121518
Acabamos de hacer un iterador por números múltiplos de 3
6.6. High order functions
Podemos crear funciones que reciben otras funciones como parámetros, de manera que la función que recibe otra función como parámetro se llama función de orden superior (high order function). Veamos un ejemplo
InputPythondef increment(x):return x + 1def hof(f, x):return 2*f(x)print(hof(increment, 3))Copied
8
---
➡️ **Continúa en la Parte 3: clases, objetos y temas avanzados**, donde darás el salto a la programación orientada a objetos y a los módulos.