¿Cómo agregar una declaración impresa en una expresión complicada?

Resuelto DCR asked hace 8 meses • 2 respuestas

Tengo el siguiente código:

prime_numbers = [
    number
    for number in range(2, 101) 
    if all(number % div != 0 for div in range(2, int(number**0.5) + 1))
]

¿Cómo agregaría una declaración impresa para el número?

DCR avatar Feb 16 '24 03:02 DCR
Aceptado

Técnicamente, dado que la veracidad de print(number)es False( print()regresar None), puedes disfrutar de su efecto y usar un orpara obtener el resultado aún en la lista.

prime_numbers = [
    print(number) or number
    for number
    in range(2, 101)
    if all(
        number % div != 0
        for div
        in range(2, int(number**0.5) + 1)
    )
]
print(prime_numbers)

Dandote:

2
3
5
7
11
13
17
19
23
29
31
37
41
43
47
53
59
61
67
71
73
79
83
89
97
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]

Sin embargo, se desaconseja la comprensión de efectos secundarios como este (al menos para mí). Es posible que desee utilizar un forbucle más tradicional.

Ver también: ¿Es Pythonic usar listas por comprensión solo para efectos secundarios?

JonSG avatar Feb 15 '2024 20:02 JonSG

Puedes hacerlo así.

def my_print (thing):
    print(str(thing))
    return thing

prime_numbers = [my_print(number) for number in range(2, 101) if all(number % div != 0 for div in range(2, int(number**0.5) + 1))]

Pero estoy de acuerdo con otros que dicen que la expresión debería eliminarse. Eso lo hace más legible. Y también puede permitirle utilizar un algoritmo más eficiente para enumerar números primos que la división de prueba.

btilly avatar Feb 15 '2024 20:02 btilly