2011-01-24 4 views
10

У меня есть некоторое замешательство в отношении его значения или определения.Что такое выражение в Python?

Разве это не какой-то код, который производит или вычисляет новые значения данных? (Говорит Zelle в своей книге)

Тогда мне интересно, является ли строковый тип данных выражением.

Если да, то что делает eval(), когда его аргумент является строкой?

Книга Zelle говорит, что eval(<string>) оценивает string как выражение, что именно это означает, если string уже является выражением?

И если string не является выражением, то как оно может произойти после print?

+1

Связанные (но не ** ** точная копия): [Какая разница между выражением и заявлением?] (Http://stackoverflow.com/questions/4728073/ python-what-is-the-difference-between-an-expression-and-a-statement) –

ответ

17

Выражения представляют что-то вроде числа, строки или экземпляра класса. Любое значение является выражением!

Все, что что-то делает является заявлением. Любое присваивание переменной или вызову функции является выражением. Любое значение, содержащееся в этом выражении в выражении.

foo = "hello" - инструкция, которая присваивает foo значению выражения «привет». Поскольку код "hello" является простым выражением, то есть он не содержит никаких операций, ничто фактически не оценивается, поэтому foo присваивается только "hello. Более сложные выражения фактически оценивают вещи, например, добавление чисел. Использование выражения слов похоже на то, что он делает вещи более запутанным. Выражения - это не что иное, как значения, за исключением того, что они могут иметь операции, такие как сложение или вычитание.

eval оценивает строку, как если бы это было выражение python. Eval принимает выражение в качестве аргумента. это с каждое отдельное значение является выражением. Говоря, что «eval принимает значение в качестве аргумента» говорит точно то же самое, но это звучит намного проще.: D

eval("2+2") передает строку "2+2" функции. Функция вычисляет выражение, содержащееся в строке, которая выходит на 4.

Книга Целле говорит eval(<string>) оценивает строку как выражение, что означает, что именно значит, если строка уже является выражением?

Любая строка является выражением, так как оно представляет значение. Однако то, что находится в строке, абсолютно не влияет на то, что оно является выражением. Если это значение, то это выражение. Когда он «оценивается как выражение по eval», символы внутри строки выполняются так, как если бы они были выражением python.

+2

Хорошее объяснение, за исключением того, что вы не можете утверждать 'eval': try' eval ("print hello") 'в Python 2.x. –

+6

Вызов функции - это выражение в Python. Любое выражение также является выражением - выражением выражения. См. Также ссылку на соответствующий вопрос, который я дал выше. –

+0

@Sven Я использую другое определение выражения для простоты. Я решил оставить эту информацию, чтобы избежать дополнительной сложности, тем более, что выражения как утверждения не очень широко используются. : D –

1

Строка - это выражение. Выражение - это все, что имеет «значение». Как 3, «Hello world», 1 + 1, math.sqrt (9) и т. Д. Названия функций также являются выражениями.

eval() дает вам значение выражения, которое вы даете ему как строку. Если вы скажете eval ('1 + 1'), он возвращает 2. Таким образом, он возвращает то же самое, что и при возврате, если вы просто напишите: 1 + 1.

+1

В дополнение к этому: каждый метод/функция, возвращающая значение, также считается выражением. Таким образом, сам eval является выражением, например, хорошо. – poke

+0

@poke: Это вводит в заблуждение. _Every_ method/function возвращает значение. Если вы ничего не возвращаете явно, он неявно возвращает 'None'. (Конечно, на практике конкретный вызов функции может поднять, 'sys.exit', навсегда зависеть в бесконечном цикле и т. Д., А не возвращаться. Но это не делает выражение функции выражением не выражением, 1/0'.) – abarnert

+0

@abarnert Трудно сказать, что я имел в виду тогда, но я думаю, что я имел в виду, что все эти вещи также считаются выражением, а не только стандартными статическими с некоторым базовым оператором между ними. – poke

2

«Выражение» может быть немного запутанным термином, когда вы уходите от мысли о том, как работает собственный парсер Python. standard documentation делает различие между выражениями и «атомами», но я думаю, что делает его терминологию довольно ограничительной (диаграмма BNF на 5.11 подразумевает, что для выражения должно быть что-то должно быть быть либо лямбдой, либо условным выражением, я думаю. Мой BNF ржавый.)

Атомы, с другой стороны, похоже, покрывают, поскольку @kynnysmatto говорит «все, что имеет» значение ». Возможно, «все, что может быть заключено в скобки, а затем извне круглых скобок неотличимо от его соответствующего значения», может быть лучшим определением атома.

Когда Zelle обсуждает выражения в контексте, например, Eval (Foo), я думаю, что он имеет в виду:

  • Foo является идентификатором, который является типом атома
  • но Foo является идентификатором из что-то
  • это «что-то» является нитевидным , вероятно, фактическая строка
  • внутри внутренней части eval(), эта строка также представляет собой выражение «Python» Python, то есть что-то, что Python может анализировать и осмысливать.

tl; dr: «выражение», поскольку терминологию лучше всего понимать с точки зрения разбора кода; когда вы программируете сами, вам может показаться лучше думать в терминах «атомов».

2

TL; DR: Выражения представляют собой комбинации значений и операторов и всегда оцениваются до одного значения. Заявление - это любая другая инструкция. Некоторые утверждения содержат выражения.

выражение является инструкцией, которая сочетает в себе ценности и оператор и всегда вычисляются до одного значения.

Например, это выражение:

>>> 2 + 2 

В 2се целые значения и + является математическим оператором. Это выражение вплоть до одного целого значения 4.

Технически, это также выражение:

>>> 4 

Как выражение, он вычисляет вниз к единственному значению 4.

Когда я говорю ценности и операторы, это не ограничивается математическими проблемами:

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

myAge переменная определяет значение внутри него. Вызов функции int('5') оценивает возвращаемое значение функции, 5. Все эти строковые значения объединены с оператором + (в этом случае это оператор конкатенации строк).Независимо от того, насколько большого выражения, оно вычисляется до одной значения: в этом случае, значение строки 'You will be 6 next year.'

Contrast это с заявлением, что инструкции Python, не оценивать вниз к стоимость. Оператор Python - это почти все, что не является выражением. Вот заявление назначения:

>>> spam = 2 + 2 

Вот если заявление:

>>> if spam == 4: 

Вот некоторое время оператор для бесконечного цикла:

>>> while True: 

Обратите внимание, что оба эти утверждения содержат выражение (даже True, который оценивается до единственного значения True). Но не все утверждения используют в них выражения. Вот перерыв заявление:

>>> break 
Смежные вопросы