Python Quiz 9 – Cómo identificar números pares en Python

Pyquiz 9 - Cómo identificar números pares en Python

Pregunta principal del PyQuiz:

>>> nums = set()
>>> for x in range(5):
...     if not x % 2:
...         nums.add(x)
...
>>> print(nums)
- ?? -
# A - {0, 2, 4}
# B - {1, 3, 5}
# C - {1, 2, 3, 4, 5}

Concepto y explicación

En esta pregunta hay diferentes aspectos a tener en cuenta.

La lógica principal de la pregunta es:

  • Creación de un conjuntos para guardar valores.
  • Iteración sobre un range.
  • Comprobación por cada elemento si es par o no.
  • Adición del elemento par al conjunto de números.
  • Impresión por pantalla de los números guardados.

La lógica principal es simple y la parte principal radica en saber cómo identificar si un número es par o no.

Identificar si un número es par o impar usando operación módulo

La forma más simple y utilizada para calcular si un número es par o impar es utilizando la operación módulo.

El operador % es el encargado de realizar la operación de módulo, que devuelve el resto de la división entre dos números:

>>> 3 % 2
1
>>> 17 % 3
2
>>> 17 // 3
5
>>> 17 / 3
5.666666666666667
>>> 19 / 10, 19 // 10, 19 % 10
(1.9, 1, 9)
>>> 16 / 5, 16 // 5, 16 % 5
(3.2, 3, 1)

Como se puede ver en los ejemplos, la operación es muy rápida y simple pero ¿cómo se podría utilizar la operación módulo para obtener números pares?.

Dada la dualidad de los números pares e impares, en los que si un número x es par, el siguiente es impar y el siguiente es par, se puede ver que hay una gran relación entre ellos.

La mágia aparece si se piensa en qué ocurre cuando a un número se le aplica la función módulo de 2. En este caso los valores devueltos pueden ser 0, si el número es divisible por 2, o 1 si el número no es divisible entre 2 (dado que al dividirlo entre 2 sobre una unidad).

Siguiendo esta lógica obtenemos una fórmula para calcular si un número es par (divisible entre 2) o impar (no es divisible entre 2):

>>> for x in range(15):
...     print(f"{x} mod 2 es: {x % 2} -> {'par' if x % 2 == 0 else 'impar'}")
...
0 mod 2 es: 0 -> par
1 mod 2 es: 1 -> impar
2 mod 2 es: 0 -> par
3 mod 2 es: 1 -> impar
4 mod 2 es: 0 -> par
5 mod 2 es: 1 -> impar
6 mod 2 es: 0 -> par
7 mod 2 es: 1 -> impar
8 mod 2 es: 0 -> par
9 mod 2 es: 1 -> impar
10 mod 2 es: 0 -> par
11 mod 2 es: 1 -> impar
12 mod 2 es: 0 -> par
13 mod 2 es: 1 -> impar
14 mod 2 es: 0 -> par

Como se puede ver en el ejemplo, si se comprueba si el módulo 2 de un número devuelve 0, significa que es par.

Para simplificar la comprobación se puede aplicar el operador not a la comprobación y simplificarla como if not x % 2 para comprobar si x es par, dando la operación utilizada en la pregunta.

Esto ocurre porque todos los valores distintos de 0 se evalúan como verdadero, y 0 se evalúa como falso. Al buscar que la ecuación devuelva 0, hay que comprobar que not(valor_devuelto) para que devuelva verdadero.

Para saber si un número es impar sólo hay que hacer la operación contraria de si es par.

División entre 2 para detectar números pares o impares

La forma más lógica de saber si un número es divisible entre 2 sin que quede ningún resto. Para obtener este resultado nos basamos en que la división entera de un número entre 2 y su multiplicación por 2 debe de ser el número original, de lo contrario, el número no es par.

>>> def is_even(x):
...     return (x // 2) * 2 == x
...
>>> def is_odd(x):
...     return not(is_even(x))
...
>>> for x in range(5):
...     print(f"{x} es {'par' if is_even(x) else 'impar'}")
...
0 es par
1 es impar
2 es par
3 es impar
4 es par

Operaciones a nivel de bits para detectar números pares o impares

Otra forma de calcular si un número es par se puede obtener analizando el número binario que representa el entero.

Todos los número pares tienen como primer número un 0 mientras que los impares lo tienen a 1.

Por tanto aplicando una máscara a nivel de bit en el primer bit del número en su formato binario se puede saber si ese número es par o no.

>>> bin(5)
'0b101'
>>> bin(6)
'0b110'
>>> bin(7)
'0b111'
>>> bin(8)
'0b1000'
>>> def is_even(x):
...     return x & 1 == 0
...
>>> for x in range(10):
...    print(f"{x} es {'par' if is_even(x) else 'impar'}")
...
0 es par
1 es impar
2 es par
3 es impar
4 es par
5 es impar
6 es par
7 es impar
8 es par
9 es impar

Solución

Por tanto la solución correcta es la A:

A) {0, 2, 4}




Libros recomendados para aprender Python

Estos son los libros que pueden ayudarte a aprender Python, aprender a programar, tipos de datos, algoritmia y mucho más.

Libro Python a fondo Disponible en:

Compartir

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Publicar un comentario