В чем разница между выражением и утверждением в Python?

В чем разница между выражениями и операторами в Python?


person wassimans    schedule 18.01.2011    source источник


Ответы (15)


Выражения содержат только идентификаторы, литералы и операторы , где операторы включают арифметические и логические операторы, функция вызывает оператор () оператор подписки [] и тому подобное, и может быть уменьшено до некоторого «значения», которым может быть любой объект Python. Примеры:

3 + 5
map(lambda x: x*x, range(10))
[a.x for a in some_iterable]
yield 7

Заявления (см. 1, 2 ), с другой стороны, - это все, что может составить строку (или несколько строк) кода Python. Обратите внимание, что выражения также являются операторами. Примеры:

# all the above expressions
print 42
if x: do_y()
return
a = 7
person Sven Marnach    schedule 18.01.2011
comment
выражения являются частями утверждений - person bismigalis; 25.11.2013
comment
@bismigalis: каждое допустимое выражение Python может использоваться как оператор (называемый выражение выражение). В этом смысле выражения являются операторами. - person Sven Marnach; 25.11.2013
comment
Выражения также могут включать вызовы функций (включая вызывающие классы для создания экземпляров объекта). Технически это идентификаторы, точно такие же, как имена, привязанные к значениям в операторе = ... даже при том, что привязка осуществляется через ключевые слова def или class. Однако для этого ответа я бы отдельно выделил вызовы функций, чтобы прояснить это. - person Jim Dennis; 09.02.2015
comment
@JimDennis: Список примеров, которые я привел, включает вызов функции (второй пример). Я также включил ссылки на полную грамматику, так что, думаю, я рассмотрел это. - person Sven Marnach; 10.02.2015
comment
if condition: do_y() - это оператор, но тернарный оператор x if condition else y - это выражение (условное выражение) - person nonybrighto; 25.09.2018
comment
@SvenMarnach Я имею в виду, хотя у нас есть этот expression_stmt ::= expression_list, я не думаю, что это одно и то же - просто использовать их как взаимозаменяемые. Я имею в виду, что я понимаю, откуда вы, но приведенное выше правило EBNF в значительной степени производит все, что вы можете иметь в правой части assignment statement. Вне REPL вы не смогли бы написать полезную программу, просто используя выражения (значения). Вы должны сохранять ссылки на них, передавать их и т. Д. Все это утверждения, где утверждение - это просто другое слово для объявления . - person Marius Mucenicu; 27.05.2019
comment
@ Джордж, я не совсем понимаю, о чем вы говорите. Я никогда не говорил, что термины выражение и выражение могут использоваться как взаимозаменяемые; просто каждое выражение также может быть утверждением. - person Sven Marnach; 28.05.2019
comment
@SvenMarnach хех, это честно, не знаю, почему я сделал предположение, что ты имел в виду, простите. Я также стремился закрепить эти понятия, поэтому и приземлился здесь. Действительно, выражения могут быть утверждениями, поэтому у нас есть expression statements. Они особенно полезны при использовании REPL и не очень полезны снаружи, поскольку вы хотите использовать операторы simple или compound при построении программ, которые будут загружены на Python позже. - person Marius Mucenicu; 28.05.2019
comment
@ Джордж Фэйрс достаточно. :) Операторы выражений весьма полезны даже за пределами REPL - довольно часто выражения вызова функций используются как операторы выражений, например print("Hello world!") или my_list.append(42). - person Sven Marnach; 28.05.2019
comment
@SvenMarnach Я не думаю, что вы можете рассматривать print («hello world») как выражение выражения, потому что выражение - это все, что возвращает значение, но print () - это функция void, которая просто не является выражением. Вызовы функций Void являются операторами, но не операторами-выражениями. А может я что-то неправильно понял? Единственное практическое использование выражений, которое я могу себе представить, - это функция, которая имеет важный побочный эффект, например функции void, но они возвращают значение, которое вас не интересует. - person Patrik Nusszer; 18.07.2019
comment
@PatrikNusszer В Python каждый вызов функции возвращает значение. Нет никаких пустых функций. Если вы не возвращаете значение явно, вместо этого возвращается None, и это также то, что возвращает print() (по крайней мере, в Python 3). Попробуйте, например, print(print()) или a = print(), чтобы увидеть, что вызов print() действительно является выражением. - person Sven Marnach; 20.07.2019
comment
@SvenMarnach Я изо всех сил пытаюсь понять некоторые из ваших примеров. Разве yield 7 не является утверждением, поскольку оно не состоит только из идентификаторов, литералов и операторов? - person Will Taylor; 22.08.2019
comment
@WillTaylor Все, что дает значение, является выражением, то есть все, что вы можете написать на стороне записи задания. Поскольку a = yield 7 допустимо, yield 7 является выражением. Давным-давно yield был представлен как оператор, но он был обобщен до выражения в PEP 342. - person Sven Marnach; 22.08.2019
comment
Каково реальное влияние или последствия различия этих двух терминов на практике? Помимо теории - разве эти термины не часто используются взаимозаменяемо на практике (?) - person Wlad; 15.12.2019
comment
@ Здравствуйте, я не часто вижу, чтобы они использовались как взаимозаменяемые. Эти термины часто встречаются в описаниях синтаксиса языка программирования; например аргументами вызова функции Python являются выражения. Если вы используете там инструкцию, которая не является выражением, код не будет компилироваться (и в любом случае это не имеет смысла). Конечно, есть некоторые совпадения, поскольку любое выражение также может использоваться как утверждение. - person Sven Marnach; 16.12.2019

Выражение - из New Oxford American Dictionary:

выражение: Математика набор символов, которые вместе выражают количество: выражение для длины окружности равно 2πr.

В общих чертах: Выражения дают по крайней мере одно значение.

В Python выражения подробно описаны в справочнике по языку Python. Как правило, выражения в Python состоит из синтаксически допустимой комбинации атомов, Primary и Операторы.

Выражения Python из Википедии

Примеры выражений:

Литералы и синтаксически правильные комбинации с Операторы и встроенные функции или вызов пользовательских функций:

>>> 23
23
>>> 23l
23L
>>> range(4)
[0, 1, 2, 3] 
>>> 2L*bin(2)
'0b100b10'
>>> def func(a):      # Statement, just part of the example...
...    return a*a     # Statement...
... 
>>> func(3)*4
36    
>>> func(5) is func(a=5)
True

Заявление из Википедии:

В компьютерном программировании оператор можно рассматривать как наименьший автономный элемент императивного языка программирования. Программа состоит из последовательности одного или нескольких операторов. Утверждение будет иметь внутренние компоненты (например, выражения).

Операторы Python из Википедии

В общих чертах: Утверждения что-то делают и часто состоят из выражений (или других утверждений).

Справочник по языку Python охватывает простые утверждения и Составные операторы.

Однако различие между фразами «Утверждения что-то делают» и «выражения производят ценность» может стать нечетким:

  • Составления списков считаются «выражениями», но они имеют циклические конструкции и, следовательно, также Сделай что-нибудь.
  • if обычно является выражением, например if x<0: x=0, но вы также можете иметь условное выражение как x=0 if x<0 else 1, которые являются выражениями. В других языках, например в C, эта форма называется оператором, подобным этому x=x<0?0:1;
  • Вы можете написать свои собственные выражения, написав функцию. def func(a): return a*a - это выражение, когда оно используется, но составленное из операторов, когда оно определено.
  • Выражение, которое возвращает None, является процедурой в Python: def proc(): pass Синтаксически вы можете использовать proc() как выражение, но, вероятно, это ошибка ...
  • Python немного строже, чем C, в отношении различий между Expression и Statement. В C любое выражение является допустимым утверждением. Вы можете иметь func(x=2); Это выражение или утверждение? (Ответ: выражение используется как оператор с побочным эффектом.) Оператор присваивания of x=2 внутри вызова функции func(x=2) в Python устанавливает для именованного аргумента a значение 2 только при вызове func и более ограничено, чем пример C.
person dawg    schedule 19.01.2011
comment
Из моего словаря имеется ввиду ваше личное мнение или из вашего словаря, как из оксфордского словаря? Спасибо - person Talespin_Kit; 05.10.2019
comment
@Talespin_Kit: ... ваше личное мнение или словарь, которым вы владеете, например, Оксфордский словарь? Хороший вопрос. Я использовал приложение Apple Dictionary на Mac, основанное на New Oxford American Dictionary. - person dawg; 14.01.2020

Хотя это не связано с Python:

expression оценивает значение. statement что-то делает.

>>> x + 2         # an expression
>>> x = 1         # a statement 
>>> y = x + 1     # a statement
>>> print y       # a statement (in 2.x)
2
person user225312    schedule 18.01.2011
comment
Но обратите внимание, что на всех языках, кроме действительно действительно чистых, выражения могут что-то делать (более формально: иметь побочный эффект). - person ; 18.01.2011
comment
@delnan: Вы можете привести пример (любопытно)? Я не в курсе. - person user225312; 18.01.2011
comment
@A A: Простой пример: sys.stdout.write('see?\n') (проще в 3.x, где print - это функция и поэтому может быть вызвана как часть выражения). Если, конечно, у вас нет особого определения «что-то делать». - person ; 18.01.2011
comment
Точно так же somelist.append(123). На самом деле, большинство вызовов функций. - person Thomas K; 18.01.2011
comment
y = x + 1 - это не выражение, а утверждение. Попробуйте eval (y = x + 1), и вы получите ошибку. - person Arglanir; 04.02.2013
comment
@ user225312, вы сказали, что statement что-то делает. Итак, что делает пустой оператор? - person Pacerier; 22.10.2013
comment
y = x +1 - это выражение-выражение - person Emmanuel Osimosu; 15.10.2016
comment
@SteveFreed Разве утверждения не состоят из выражений? Если это так, то использование выражение-выражение довольно излишне. - person Nameless; 06.04.2021

Операторы представляют собой действие или команду, например операторы печати, операторы присваивания.

print 'hello', x = 1

Выражение - это комбинация переменных, операций и значений, которая дает значение результата.

5 * 5 # yields 25

Наконец, выражения-выражения

print 5*5
person Emmanuel Osimosu    schedule 10.04.2015

Выражение - это то, что может быть уменьшено до значения, например "1+3" - это выражение, а "foo = 1+3" - нет.

Проверить легко:

print(foo = 1+3)

Если не работает, то это утверждение, если работает, то выражение.

Другое утверждение может быть таким:

class Foo(Bar): pass

поскольку его нельзя свести к значению.

person Flavius    schedule 18.01.2011
comment
Как показывает выполнение вашего первого примера, присвоение не является выражением (не совсем, то есть - a = b = expr разрешено, как особый случай) в Python. В языках, черпающих больше вдохновения из C, это так. - person ; 18.01.2011
comment
class Foo(bar): - это начало утверждения, а не полное утверждение. - person Sven Marnach; 18.01.2011
comment
foo = 1+3 НЕ является выражением. Это заявление (если быть точным, задание). Однако часть 1+3 - это выражение. - person Pithikos; 17.04.2015
comment
Моя формулировка очень и очень точна: если не работает, это утверждение, если работает, это выражение ... Выполните это, и вы получите свой ответ. - person Flavius; 31.01.2017
comment
На самом деле это действительно хороший и надежный ответ. - person Yordan Grigorov; 02.04.2021

  1. Выражение - это инструкция, возвращающая значение. Итак, если он может отображаться справа от присваивания или в качестве параметра вызова метода, это выражение.
  2. Некоторый код может быть как выражением, так и оператором, в зависимости от контекста. В языке могут быть средства различения между ними, когда они неоднозначны.
person Steven Spungin    schedule 03.01.2018

Выражение - это что-то, а утверждение что-то делает.
Выражение также является утверждением, но оно должно иметь возврат.

>>> 2 * 2          #expression
>>> print(2 * 2)     #statement

PS: Интерпретатор всегда выводит значения всех выражений.

person donald jiang    schedule 18.10.2017
comment
на мой взгляд, выражение - это выражение с нулевым значением - person Adalcar; 18.10.2017

ЗАЯВЛЕНИЕ:

Заявление - это действие или команда, которые что-то делают. Пример: If-Else, Loops ... и т. Д.

val a: Int = 5
If(a>5) print("Hey!") else print("Hi!")

ВЫРАЖЕНИЕ:

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

val a: Int = 5 + 5 #yields 10
person Raja Shekar    schedule 09.03.2019
comment
Это дубликат существующего ответа: stackoverflow.com/questions/4728073/. - person karel; 09.03.2019
comment
Возможно, это дубликат, но он разделяет мои взгляды на вопрос выше. Не в обиду - person Raja Shekar; 17.03.2019

Выражения всегда дают значение, а утверждения - нет.

e.g.

объявление и присвоение переменных являются операторами, потому что они не возвращают значение

const list = [1,2,3];

Здесь у нас есть два операнда - переменная «сумма» слева и выражение справа. Все это утверждение, но бит справа - это выражение, поскольку этот фрагмент кода возвращает значение.

const sum = list.reduce((a, b)=> a+ b, 0);  

Вызов функций, арифметические и логические операции - хорошие примеры выражений.

Выражения часто являются частью утверждения.

Различие между ними часто требуется, чтобы указать, требуется ли нам кусок кода для возврата значения.

person Dominic Ocean    schedule 08.08.2020

Выражения:

  • Выражения образуются путем объединения objects и operators.
  • Выражение имеет значение, имеющее тип.
  • Синтаксис простого выражения: <object><operator><object>

2.0 + 3 - это выражение, которое оценивается как 5.0 и имеет связанный с ним тип float.

Заявления

Заявления состоят из выражений. Он может охватывать несколько строк.

person ObiWan    schedule 22.08.2017

Предыдущие операторы могли изменить состояние нашей программы Python: создавать или обновлять переменные, определять функцию и т. Д.

А выражения просто возвращают какое-то значение, не могут изменить глобальное или локальное состояние функции.

Но теперь у нас есть :=, это инопланетянин!

person roachsinai    schedule 28.12.2019

Заявление содержит ключевое слово.

Выражение не содержит ключевого слова.

print "hello" - это инструкция, потому что print - ключевое слово.

"hello" - это выражение, но сжатие списка противоречит этому.

Следующее является выражением выражения, и оно истинно без понимания списка:

(x*2 for x in range(10))
person abifromkerala    schedule 31.03.2014
comment
Это сильно зависит от вашего определения «ключевого слова». x = 1 - прекрасное выражение, но оно не содержит ключевых слов. - person Joost; 09.05.2014
comment
Нет, например is - ключевое слово, но x is y не обязательно является утверждением (как правило, это просто выражение). - person benjimin; 13.02.2020

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

>>> 42
42
>>> n
17
>>> n + 25
42

Когда вы вводите выражение в командной строке, интерпретатор оценивает его, что означает, что он находит значение выражения. В этом примере n имеет значение 17, а n + 25 имеет значение 42.


Оператор - это блок кода, который имеет эффект, например создание переменной или отображение значения.

>>> n = 17
>>> print(n)

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

Это может быть полезно - thinkpython2 от Аллена Б. Дауни

person blessed    schedule 25.08.2020

Выражение преобразуется в значение.

Оператор использует значение * для получения результата **.


* Это включает пустое значение, например: print() или pop().

** Этим результатом может быть любое действие, которое что-то меняет; например изменяет память (x = 1) или что-то меняет на экране (print (x)).


Несколько примечаний:

  • Поскольку оператор может возвращать результат, он может быть частью выражения.
  • Выражение может быть частью другого выражения.
person Pontios    schedule 18.11.2020

Python называет выражения «выражениями-операторами», поэтому вопрос, возможно, не полностью сформирован.

Оператор состоит из почти всего, что вы можете делать в Python: вычисления значения, присвоения значения, удаления переменной, печати значения, возврата из функции, создания исключения и т. Д. Полный список находится здесь: http://docs.python.org/reference/simple_stmts.html#

Оператор выражения ограничен вызовом функций (например, math.cos (theta) "), операторов (например," 2 + 3 ") и т. Д. Для получения значения.

person Walter Nissen    schedule 18.01.2011
comment
Нет, Python не вызывает выражения выражений выражений операторов. Python вызывает операторы, состоящие только из операторов-выражений-выражений. - person Sven Marnach; 18.01.2011
comment
... и это делает не только он. - person ; 18.01.2011
comment
@Sven Marnach Нет, Python не вызывает выражения выражений выражений операторов. - Эй, но согласно правилу EBNF, разве каждое выражение не является выражением выражения? Я не уверен, что не так с вызовом выражений выражений выражений. - person Niraj Raut; 01.05.2021
comment
@NirajRaut В качестве примера в операторе присваивания a = 42 правая часть 42 является выражением, но это не оператор выражения. В качестве оператора можно использовать любое выражение, но не каждое выражение на самом деле используется в качестве оператора. - person Sven Marnach; 03.05.2021
comment
@Sven Marnach Не по теме: У меня вопрос относительно __init__ и __new__. Просто хочу спросить, существует ли такой термин, как конструктор, в языке Python. Я видел, что в документации он где-то используется, но я не видел, где этот термин явно определен. Является ли конструктор частью языка Python? __init__ и __new__ как-то вместе из конструктора? Вы, как педантичный парень, хотелось бы узнать ваше мнение по этому поводу. Также спасибо за разъяснения. - person Niraj Raut; 04.05.2021
comment
@NirajRaut Технически __new__() - это конструктор, поскольку он возвращает новый экземпляр класса, а __init__() - это функция инициализатора. Однако большинство людей вызывают __init__() конструктор, поскольку он используется гораздо чаще, а инициализация поля выполняется в конструкторе на многих других языках. Я не думаю, что есть официальное определение конструктора в Python. - person Sven Marnach; 04.05.2021
comment
@Sven Marnach В этой ссылке снова используется термин "выражение конструктора" и опять таки. - person Niraj Raut; 04.05.2021
comment
@NirajRaut Вы правы. Он использует его для выражения, вызывающего объект класса, который сначала вызывает __new__(), а затем вызывает __init__() для возвращаемого значения __new__(). Ни один из этих двух специальных методов в документации не называется конструктором. - person Sven Marnach; 05.05.2021
comment
@Sven Marnach: Из той же ссылки: ... где self - это новый экземпляр, а остальные аргументы такие же, как были переданы в конструктор объекта . Что насчет этого? - person Niraj Raut; 06.05.2021
comment
@NirajRaut Я так же интерпретирую. Документация, кажется, вызывает выражения формы MyClass(*args) выражения конструктора. Аргументы сначала передаются __new__(), затем __init__(). - person Sven Marnach; 07.05.2021
comment
@Sven Marnach __new__() конструктор объекта? Поскольку выражение конструктора формы MyClass(*args) сначала передает аргументы __new__(). - person Niraj Raut; 07.05.2021
comment
@NirajRaut Как я уже сказал, нет четкого ответа. Я не вижу никаких доказательств того, что в документации используется этот термин таким образом, и, похоже, не принято использовать этот термин таким образом в сообществе Python. Если вы хотите убедиться, что люди вас правильно понимают, просто используйте __new__() и __init__() явно. - person Sven Marnach; 07.05.2021