Acabo de aprender (estoy aprendiendo) cómo funcionan los parámetros de función en Python, y comencé a experimentar con él sin razón aparente, cuando esto:

def jiskya(x, y):
    if x > y:
        print y
    else:
        print x

print(jiskya(2, 3))

Dar la salida:

>>>
2
None

¿De dónde vino el None? ¿Y qué es eso?

46
Grant 14 ago. 2011 a las 02:17

6 respuestas

La mejor respuesta

Es el valor de retorno de la función, que imprime. Si no hay una declaración de devolución (o solo un return sin un argumento ), se agrega un return None implícito al final de una función.

Probablemente desee devolver los valores en la función en lugar de imprimirlos:

def jiskya(x, y):
    if x > y:
        return y
    else:
        return x

print(jiskya(2, 3))
45
Antti Haapala 27 nov. 2016 a las 11:34

Está realizando dos impresiones, la primera en el corpus de su función y la segunda imprime el resultado de la función, que en realidad es Ninguno.

Deberías hacer algo como esto:

def yourfunction(x, y):
    if x > y:
        return y
    else:
        return x

Entonces

>>> print yourfunction(2, 3)
2
1
Alexis Métaireau 13 ago. 2011 a las 22:20

El problema es que escribiste print jiskya(2,3). Está pasando el valor de retorno de jiskya a la función print. jiskya en sí mismo imprime x o y, razón por la cual ve el 2. Pero luego el print en la declaración print jiskya(2, 3) se ejecuta sin argumento.

Para el intérprete, esta es una simplificación de lo que sucede:

print jiskya(2,3)
>> Executing jiskya with arguments 2, 3
>> jiskya evaulates `print x`
>> 2 is printed
>> Function jiskya exits with no return value
print None
>> None is printed
0
Jared Ng 13 ago. 2011 a las 22:19

¿De dónde vino la 'Ninguna'?

La función.

¿Y qué es eso?

Es lo que devolvió la función.

En Python, cada función devuelve algo. Podría "ser varias cosas" usando una tupla, o podría "ser nada" usando None, pero debe devolver algo. Así es como lidiamos con el hecho de que no hay forma de especificar un tipo de retorno (lo que no tendría sentido ya que no se especifican tipos para nada más). Cuando se interpreta como una cadena para imprimir, None se reemplaza con la cadena "Ninguno".

None es un objeto especial que se supone que representa la ausencia de cualquier cosa real. Su tipo es NoneType (es una instancia de esa clase). Siempre que no devuelva nada explícitamente, devuelve Ninguno implícitamente.

Escribió la función para imprimir uno de los dos valores x o y, pero no devolver nada. Entonces None fue devuelto. Luego le pediste a Python que imprimiera el resultado de llamar a la función. Entonces llamó a la función (imprimir uno de los valores), luego imprimió el valor de retorno, que era None, como el texto "Ninguno".

2
Karl Knechtel - away from home 13 ago. 2011 a las 22:25

Ok, para comenzar cuando haces esto:

print(jiskya(2, 3))

Obtienes algo más o menos equivalente a esto:

print(print(2))

¿Entonces qué está pasando? print(2) está imprimiendo 2 y devuelve None que se imprime en la llamada externa. Lo suficientemente directo.

Ahora mira esto:

def hello():
    return 2

Si lo haces:

print(hello())

Obtienes 2 porque si imprimes una función obtienes el valor return. (El valor return se denota con return someVariable.

Ahora, aunque print no tiene paréntesis como la mayoría de las funciones, es una función un poco especial a ese respecto. ¿Qué devuelve la impresión? Nada. Entonces, cuando print print someVariable, obtendrá None como la segunda parte porque el valor de retorno de la impresión es None.

Así como otras han declarado:

def jiskya(x, y):
    if x > y:
        print(y)
    else:
        print(x)

Debería reescribirse:

def jiskya(x, y):
    if x > y:
        return y
    else:
        return x
9
Antti Haapala 27 nov. 2016 a las 11:37

Sí, básicamente está utilizando declaraciones de impresión en su función como una forma de devolver información. No deberías hacer esto. Imprimir NO es lo mismo que una declaración de devolución. Si simplemente desea que su función dé su respuesta sin ninguno, simplemente escriba jiskya (2, 3) en su lugar. Verá lo que arroja la función porque tiene declaraciones de impresión en la función. Si, en cambio, escribiste "return" en tu función, no te daría nada sin la "impresión" que precede a la llamada a la función.

1
de1337ed 13 ago. 2011 a las 22:25