2012-03-11 28 views
7

Hago ejercicio en Learn Python de la manera difícil, y estoy teniendo un momento muy difícil envolviendo mi cerebro en torno al hecho de que todo depende de que una función se ejecute solo porque se ha asignado como un valor a un variable. Escribí un pequeño script para confirmar que se trata de cómo funciona, y lo hace:¿Por qué foo = function() ejecuta la función en Python?

def pants(): 
    print "Put on some pants!" 

def shorts(): 
    print "And don't forget your underwear!" 

zap = pants() 
thing = shorts() 

cuyos resultados serán:

Put on some pants! 
And don't forget your underwear! 

Así que, obviamente esto sucede, pero no puedo entender por qué el lenguaje funciona de esa manera: cuál es la lógica detrás del lenguaje que hace que esta sea una forma valiosa de operar. Creo que sería útil para mí entender por qué esto es, en lugar de simplemente "así es como funciona".

Para mayor claridad: Pregunto (supongo) por qué la función se está ejecutando, cuando todo lo que hago es asignarla como un valor para algo. Las instrucciones de impresión están allí, así que puedo ver que la función realmente está ejecutándose.

Es el hecho de que no soy en realidad nunca se ejecuta

pantalones() cortos()

que me está confundiendo.

Para crear una analogía torturado, si me-hornear galletas en casa eran "cookies()", y que eran para hacer las galletas de los sábados, que con el tiempo pueda creer que

sábado = galletas()

pero sólo pensando "bueno, el sábado es el día de la galleta" no es lo mismo que galletas que cuecen realidad ... ¿por qué no simplemente decir

sábado cookies (=)

realidad hornear el co okies, en lugar de simplemente configurar el sábado con la variable "cookies()" para un uso posterior?

+5

Probablemente se esté confundiendo '' print' con return'. – JJJ

+2

Creo que Juhana podría tener razón. ¿Estás esperando que 'zap' tenga un valor de "Ponte unos pantalones"? Si es así, cambie 'print' a 'return' y luego 'print zap' después de haber sido asignado. – chooban

+1

Sí, claramente sus expectativas están desalineadas con el idioma. ¿Que estabas esperando? –

Respuesta

16

Cuando utiliza los paréntesis () se llama a la función. Si desea asignar la función a la variable para reutilizarla, debe eliminar los paréntesis.

Ejemplo:

def pants(): 
    print "Put on some pants!" 

def shorts(): 
    print "And don't forget your underwear!" 

zap = pants 
thing = shorts 

Y luego cuando se quiere llamar a esas funciones:

zap() 
thing() 
+0

Entonces, ¿la presencia de() "convierte" las cosas en funciones en los ojos de Python, y Python intenta ejecutar esas funciones inmediatamente para obtener su valor de retorno? – JeanSibelius

+1

No, lo que los "convierte" en funciones es cuando los declaras. En Python, todo es un objeto. Una función es un objeto "invocable". Como un objeto, puede asignarlo a una variable, a otro objeto como una propiedad, pasarlo como un parámetro, etc. Luego, cuando ** lo ** llama, ejecuta su procedimiento. Para obtener información más detallada, sugiero que lea sobre [el modelo de datos] de Python (http://docs.python.org/reference/datamodel.html). –

+1

Sumando a mi comentario anterior: la presencia de '()' le dice a Python que ** llame ** al objeto. Si es una función, se ejecutará; si no lo es, generará una excepción que indica que el objeto no se puede llamar. Que la función devuelva algo o no depende de usted y de lo que debe hacer. Si desea asignar el resultado de una función a una variable, entonces necesita usar 'return' como se señaló en las otras respuestas. Si solo desea imprimir algo, puede usar 'print' y no necesita devolver nada. –

2

zap = pants() vinculará el valor de retorno de la función a la variable, por lo tanto, por supuesto, la función se ejecuta si la vincula a una variable.

def foo(): 
    return 1 

var = foo() 
print var 

imprimirá 1.

Espero que esto ayude.

Editar: Si espera que el valor de la variable "se ponga en algunos pantalones", de hecho está confundiendo print y return, como señalaron las personas en los comentarios.

5

Aunque parezca que sus funciones no devuelven nada, lo hacen de hecho. Citando the Python.org documentation:

La declaración de devolución regresa con un valor de una función. return sin un argumento de expresión devuelve None. Caer al final de una función también devuelve None.

lo tanto, sus funciones realmente tener este aspecto:

def pants(): 
    print "Put on some pants!" 
    return None 

def shorts(): 
    print "And don't forget your underwear!" 
    return None 

Sus asignaciones asignan a zap cualquier pants devolverá (es decir el valor de pants()), y a cualquier thingshorts devoluciones. En su caso, ambos son None, pero por supuesto las funciones se deben ejecutar para resolver esto (*). Después de todo, podría ser que pants vuelve 42 durante los años bisiestos, y que shorts vuelve cada vez 'Foobar' algunas generador de números aleatorios "rollos" una 6.


(*) Inciso: Que las funciones "se deben ejecutar" deben no ser considerado universalmente verdadero En un pure setting, y dejando de lado los detalles de Python (de los que sé muy poco), un compilador puede darse cuenta de que ambas funciones son idénticamente None, y no hacen llamadas cuando se ejecuta el programa. Pero una función que imprime algo (o inspecciona si el año actual es bisiesto o tira un dado) no será pura.

1

Cuando el intérprete ve un nombre de función seguido de() sabe que se supone que debe ejecutar esa función.

Lo que estás haciendo ahí es decir "asigna el resultado de estas funciones a estas variables".

Pero como no devuelve ningún valor de esas funciones, no está viendo nada en las variables.

Sin embargo, debido a que tiene una instrucción de impresión allí, está viendo al intérprete ejecutar esas funciones cuando intenta asignar la variable a los resultados de esa función.

0

Sus funciones son llamadas por el paréntesis después del nombre:

zap = pants() 

Este llama a la función pantalones y pone el resultado en zap. Si hubiera hecho esto en su lugar:

zap = pants 

luego zap ahora se referirían a la propia función de los pantalones.

Y si usted acaba de escribir

pants() 

entonces la función de los pantalones también llamará, pero el resultado (que es None) nunca se han puesto en una variable.

6

Así que, obviamente, esto sucede, pero no puedo entender por qué el lenguaje funciona de esa manera: cuál es la lógica detrás del lenguaje que hace que esta sea una forma valiosa de operar. Creo que sería útil para mí seguir adelante para entender por qué es esto, en lugar de simplemente "así es como funciona".

El lenguaje necesita alguna manera de distinguir entre la función y el acto de llamar a la función. Eso es lo que proporcionan los paréntesis.

f = foo 

Ahora f está obligado a la función en sí. La función foo se puede ejecutar por f().

f = foo() 

Este llama a la función foo y se une el valor de retorno a f.

Tenga en cuenta que la vinculación o no del valor de retorno a un nombre es irrelevante. Simplemente escribiendo

foo() 

también ejecutará la función pero el valor de retorno simplemente se ignorará.

+0

Entonces, si estoy entendiendo correctamente, Python intentará ejecutar cualquier cosa con() después de ello como una función, independientemente de la mayoría de los contextos, utilizando el valor de retorno de la función en lugar de la función() si la función es algo que se supone que representa una variable en su contexto actual? – JeanSibelius

0

Desde su pregunta lo que piensa que quiere zap tendrá el valor "Put on some pants!" y thing tendrá el valor "And don't forget your underwear!". Si ese es su problema, hablemos de eso. De lo contrario, no es necesario leer más, ya que acabo de hablar de todo eso.

Vamos a hacerlo un poco divertido. Cuando defines una función, eres como crear una máquina que hace lo que quieres que haga. Ahora pensemos en una máquina que cuando le das algo de comida, te las corta y ... ¡no hace nada! ¡Quiero decir que hice esa máquina para cortar alimentos y nada más! No recuperarás tu comida picada, pero de hecho cortó tu comida como la hiciste.

Ahora, cuando quiera recuperar su comida picada, cree otra máquina que tome su comida, la corte y se la devuelva. Máquina fructífera, ¿no? ;-)

Todas son válidas para funciones de programación o matemáticas (¡aunque no conozco ninguna función nula en matemática !: P). Cuando está creando la función, tiene que decirle si solo hace algún trabajo o si hace algún trabajo y devuelve el resultado. La forma de contar una función es la declaración return. En sus funciones, acaba de decir que haga algo. Y eso es print "......" también lo hacen las funciones. Llamas a with() al final y el hace su trabajo, lo imprime. Pero como dije, si no le dices que devuelva un resultado, no lo hará. Y como no devuelve ningún resultado, no se le asignará nada con la variable (no lo confunda con None). Cuando escribió esas líneas (si está en el intérprete) o ejecuta el guión, verá esas líneas impresas, pero su zap y thing no tiene valores.

Entonces, ¿cómo solucionarlo? Diles que devuelvan las líneas a las variables. Para decirle a las funciones que hagan eso, reemplace las declaraciones print con return declaraciones.Y no importa que experimentar lo que sabes, saber acerca de lo que sabe acerca de su conocimiento es verdadero :-)

espero que ayude :-)

Cuestiones relacionadas