Python中的表达式和语句有什么区别?


Answers:


242

表达式仅包含标识符文字运算符,其中的运算符包括算术运算符和布尔运算符,函数调用运算符 ()包括预订运算符 []等,并且可以简化为某种“值”,可以是任何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

17
表达式是部分语句
bismigalis

59
@bismigalis:每个有效的Python表达式都可以用作语句(称为“表达式语句”)。从这个意义上说,表达式就是语句。
Sven Marnach 2013年

2
表达式还可以包括函数调用(包括用于对象实例化的调用类)。从技术上讲,它们是“标识符”,就像与=语句中的值绑定的名称一样,即使绑定是通过'def'或'class'关键字进行的。但是,对于这个答案,我将单独拼出函数调用以使其清楚。
吉姆·丹尼斯

2
@乔治公平。:)即使在REPL之外,表达式语句也非常有用–使用函数调用表达式作为表达式语句(例如print("Hello world!")或)是很常见的my_list.append(42)
Sven Marnach

3
@WillTaylor产生值的所有内容都是一个表达式,即您可以在赋值的写手侧编写的所有内容。既然a = yield 7有效,yield 7就是一个表达。很久以前,它yield是作为一种声明引入的,但在PEP 342中被推广为一个表达式。
Sven Marnach

120

表达 -来自新牛津美国词典

expression(数学表达式):数学上共同表示一个数量的一组符号:圆的圆周的表达式为2πr。

总的来说:表达式产生至少一个值。

在Python中,表达式在Python语言参考中得到了广泛的介绍。通常,Python中的表达式由AtomsPrimaryOperators的语法合法组合组成。

维基百科的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更严格。在C语言中,任何表达都是法律声明。您可以拥有func(x=2);“表达式”或“语句”吗?(答案:表达式用作带有副作用的语句)Python x=2中的函数调用内部的赋值语句仅在对C示例的调用func(x=2)中将命名参数设置a为2,func并且比C示例受到更多限制。

“来自我的字典”是指您的个人意见,还是像牛津词典那样的字典?谢谢
Talespin_Kit

1
@Talespin_Kit:...您的个人意见或您拥有的词典(如牛津词典)?好问题。我在基于New Oxford American Dictionary的Mac上使用了Apple Dictionary应用程序。
dawg

80

尽管这与Python不相关:

一个expression值等于一个值。A statement做某事。

>>> x + 2         # an expression
>>> x = 1         # a statement 
>>> y = x + 1     # a statement
>>> print y       # a statement (in 2.x)
2

3
但是请注意,在所有语言中,除了真正真正的“纯”语言之外,表达式也可以“执行某些操作”(更正式地说:具有副作用)。

@delnan:你能举个例子(好奇)吗?我不知道。
user225312 2011年

4
同样,somelist.append(123)。实际上,大多数函数调用。
Thomas K

13
y = x + 1不是表达式而是语句。尝试使用eval(“ y = x + 1”)会出现错误。
Arglanir

3
y = x +1是一个表达式语句
Emmanuel Osimosu


8

表达式是可以简化为值的内容,例如"1+3""foo = 1+3"

很容易检查:

print foo = 1+3

如果不起作用,则为语句;如果不起作用,则为表达式。

另一种说法可能是:

class Foo(Bar): pass

因为它不能减少为一个值。


1
如执行您的第一个示例所示,在Python中,赋值不是一个表达式(实际上是- a = b = expr特殊情况下允许- )。在从C中获得更多灵感的语言中,它是。

class Foo(bar):是语句的开始,而不是完整的语句。
Sven Marnach 2011年

1
foo = 1+3不是表达。这是一个声明(精确的分配)。该部分1+3虽然是一个表达。
Pithikos

2
我的表述非常非常精确:“如果它不起作用,那就是一个声明,如果它起作用,那就是一个表达式。” 执行它,您将得到答案。
Flavius

8
  1. 表达式是返回值的语句。因此,如果它可以出现在赋值的右侧,或者作为方法调用的参数,则它是一个表达式。
  2. 根据上下文,某些代码可以是表达式也可以是语句。该语言可能有一种在模棱两可时区分它们的方法。

5

表达式是某种东西,而语句则是某种东西。
表达式也是一个语句,但是它必须有一个返回值。

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

PS:解释器始终打印出所有表达式的值。


我认为,语句是具有空值的表达式
Adalcar


1

语句包含关键字。

表达式不包含关键字。

print "hello"是语句,因为print是关键字。

"hello" 是一个表达式,但是列表压缩与此相反。

以下是一个表达式语句,没有列表理解也是如此:

(x*2 for x in range(10))

4
这在很大程度上取决于您对“关键字”的定义。x = 1是一个非常好的语句,但不包含关键字。
Joost 2014年

不,例如,is是关键字,但x is y不一定是语句(通常只是一个表达式)。
benjimin

1

表达式:

  • 通过组合objects和来形成表达式operators
  • 表达式具有一个值,该值具有一个类型。
  • 简单表达式的语法:<object><operator><object>

2.0 + 3是一个表达式,其结果为,5.0并且具有float与之关联的类型。

陈述

语句由表达式组成。它可以跨越多行。


1

有些语句可能会改变我们Python程序的状态:创建或更新变量,定义函数等。

表达式仅返回一些值,无法更改函数中的全局状态或局部状态。

但是现在我们:=知道了,它是外星人!


-1

Python将表达式称为“表达式语句”,因此问题可能尚未完全形成。

语句几乎包含您可以在Python中执行的所有操作:计算值,分配值,删除变量,打印值,从函数返回,引发异常等。完整列表在此处:http:// docs.python.org/reference/simple_stmts.html#

表达式语句仅限于调用函数(例如math.cos(theta)“),运算符(例如“ 2 + 3”)等以产生值。


10
不,Python不会将表达式称为“表达式语句”。Python将仅包含单个表达式的语句称为“表达式语句”。
Sven Marnach 2011年

...而且并非只有这样做。

-1

我认为表达式包含运算符+操作数和保存运算结果的对象...例如

var sum = a + b;

但是一条语句只是一行代码(可能是一个表达式)或代码块...例如

fun printHello(name: String?): Unit {
if (name != null)
    println("Hello ${name}")
else
    println("Hi there!")
// `return Unit` or `return` is optional

}

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.