2011-01-24 22 views
10

Tengo cierta confusión sobre su significado o definición.¿Qué es una expresión en Python?

No es eso cierto código que produce o calcular nuevos valores de los datos? (Dice en su libro Zelle)

Entonces me pregunto si un tipo de datos de cadena es una expresión.

Si es así, entonces ¿qué hace eval() cuando su argumento es una cadena?

El libro de Zelle dice eval(<string>) evalúa string como una expresión, ¿qué significa eso exactamente si string ya es una expresión?

Y si string no es una expresión, ¿cómo puede ocurrir después de print?

+1

Relacionados (pero no ** ** un duplicado exacto): [¿Cuál es la diferencia entre una expresión y una declaración?] (Http://stackoverflow.com/questions/4728073/ python-what-is-the-difference-between-an-expression-and-a-statement) –

Respuesta

17

Expresiones representan algo, como un número, una cadena o una instancia de una clase. ¡Cualquier valor es una expresión!

Cualquier cosa que haga algo es una afirmación. Cualquier asignación a una variable o llamada de función es una declaración. Cualquier valor contenido en esa declaración en una expresión.

es una declaración que asigna foo al valor de la expresión "hola". Dado que el código "hello" es una expresión simple, lo que significa que no contiene operaciones, que nada se evalúa, por lo foo se acaba de asignar a "hello". Expresiones más complejas en realidad evaluar las cosas, como la adición de números. El uso de la palabra expresión parece que está haciendo las cosas más confuso. Las expresiones no son más que valores, excepto que pueden tener operaciones como sumar o restar

eval evalúa la cadena como si fuera una expresión de Python. Eval hace una expresión como argumento. Sin embargo, no hay nada especial sobre esto desde cada valor es una expresión. Decir "eval toma un valor como argumento" está diciendo exactamente lo mismo, pero suena mucho más simple.: D

eval("2+2") pasa la cadena "2+2" a la función. La función evalúa la expresión contenida en la cadena, que sale a 4.

El libro de Zelle dice eval(<string>) evalúa cadena como una expresión, ¿qué significa eso exactamente si la cadena es ya una expresión?

Cualquier cadena es una expresión ya que representa un valor. Sin embargo, lo que está en la cadena no tiene ningún impacto en que sea una expresión. Si es un valor, es una expresión. Cuando se "evalúa como una expresión por eval", los caracteres dentro de la cadena se ejecutan como si fueran una expresión de Python.

+2

Buena explicación, excepto que no se pueden 'evaluar' las declaraciones: prueba 'eval (" print hello ")' en Python 2.x. –

+6

Una llamada a función es una expresión en Python. Una expresión cualquiera también es una declaración, una "declaración de expresión". Ver también el enlace a la pregunta relacionada que di más arriba. –

+0

@Sven Estoy usando una definición diferente de una expresión por simplicidad. Pensé que dejar esa información evitaría una complejidad adicional, especialmente porque las expresiones como declaraciones no son muy utilizadas. : D –

1

string es una expresión. Una expresión es cualquier cosa que tenga "un valor". Como 3, 'Hello world', 1 + 1, math.sqrt (9), etc. Los nombres de las funciones también son expresiones.

eval() le da el valor de la expresión que le das a ella como una cadena. Si dices eval ('1 + 1') devuelve 2. Entonces devuelve el mismo que se devolvería si simplemente escribes: 1 + 1.

+1

Además de eso: Cada método/función que devuelve un valor cuenta también como una expresión. Entonces eval en sí mismo es una expresión, por ejemplo. – poke

+0

@poke: Eso es un poco engañoso. _Every_ method/function devuelve un valor. Si no devuelve nada explícitamente, devuelve 'None'. (Por supuesto, en la práctica, una llamada a función particular puede generar, 'sys.exit', girar para siempre en un bucle infinito, etc. en lugar de regresar. Pero eso no hace que esa función llame a expresión ni a expresión, más que' 1/0'.) – abarnert

+0

@abarnert Es difícil decir ahora lo que quise decir en ese entonces, pero creo que quise decir que todas esas cosas también cuentan como una expresión, no solo las estáticas estándar con algún operador básico en el medio. – poke

2

"Expresión" puede ser un término poco confuso una vez que llegue lejos de pensar acerca de cómo propias obras guión analizador de Python. El standard documentation hace una distinción entre las expresiones y los "átomos", pero creo que hace que su terminología bastante restrictiva (el diagrama BNF en 5.11 implica que para ser algo expresión debe ser una forma lambda o una expresión condicional, creo. mi BNF está oxidado.)

átomos, por el contrario, parecen cubrir como @kynnysmatto dice 'todo lo que tiene 'un valor''. Tal vez "cualquier cosa que pueda estar entre paréntesis, y luego desde fuera del paréntesis es indistinguible de su valor correspondiente" podría ser una mejor definición de un átomo.

Cuando Zelle analiza las expresiones en el contexto de, p. Ej. eval (foo), creo que implica:

  • foo es un identificador, que es un tipo de átomo
  • pero foo es un identificador de algo
  • este "algo" es similar a una cuerda , probablemente una cadena real
  • en el interior de eval(), esta cadena también constituye una "expresión" de Python, es decir, algo que Python puede analizar y darle sentido.

tl; dr: "expresión" como la terminología podría entenderse mejor en términos de análisis de código; cuando se programa a sí mismo, puede que le resulte mejor pensar en términos de "átomos".

2

TL; DR: Las expresiones son combinaciones de valores y operadores y siempre se evalúan hasta en un único valor. Una declaración es cualquier otra instrucción. Algunas declaraciones contienen expresiones.

Un expresión es una instrucción que combina valores y operaciones y siempre se evalúa a un solo valor.

Por ejemplo, esta es una expresión:

>>> 2 + 2 

Los 2s son valores enteros y el + es el operador matemático. Esta expresión se evalúa hasta el valor entero simple 4.

Técnicamente, esto es también una expresión:

>>> 4 

Como una expresión, se evalúa hasta el valor único 4.

Cuando digo valores y operadores, esto no se limita a los problemas de matemáticas:

>>> 'You will be ' + str(int(myAge) + 1) + ' next year.' 

la variable myAge se evalúa al valor en su interior. La llamada a la función int('5') evalúa el valor de retorno de la función, 5. Todos estos valores de cadena se combinan con el operador + (en este caso, es el operador de concatenación de cadenas).No importa lo grande que una expresión es, que evalúa a un solo valor : en este caso, el valor de cadena 'You will be 6 next year.'

Contraste esto con una declaración , que es una instrucción de Python que no evalúa a una valor. Una declaración de Python es casi todo lo demás que no es una expresión. He aquí un comunicado asignación:

>>> spam = 2 + 2 

aquí es una declaración si:

>>> if spam == 4: 

Aquí está una declaración mientras que para un bucle infinito:

>>> while True: 

Tenga en cuenta que ambas afirmaciones contienen expresiones (incluso True, que evalúa hasta el valor único True). Pero no todas las declaraciones usan expresiones en ellas. Aquí hay una sentencia break:

>>> break 
Cuestiones relacionadas