Python
語法和语义 > 表达式

Python中很多表达式（英语：）与C语言和java类似，而另一些则与之不同。
在Python中，算术运算的加法+、减法-、乘法*和取模%是与C语言和java相同的，但是除法的行为不同。在Python中有两种除法，它们是下取整除法（或整数除法）//和浮点除法/。Python增加了指数算符**。自从Python 3.5，介入了矩阵乘法算符@，它已经用于了NumPy库。
在Python中，有如下必须用于整数的位运算：&与（AND），|或（OR），~非（NOT），^异或（XOR），>>右移, <<左移。
在Python中，有如下比较运算：大于>，小于<，等于==，不等于!=，小于等于<=，大于等于 >=。==按值比较。Python的is、is not算符可以用来比较对象的同一性（按引用比较），也就是比较两个变量是否引用了同一个对象。而in、not in用于判断一个对象是否属于另外一个对象。在Python中，比较是可以链接起来的，比如a < b < c。
Python使用and、or、not表示逻辑运算与、或、非，不采用C语言和Java中所用的符号&&、||、!。
在Python中，由逗号,分隔的一组表达式，叫做表达式列表。Python为构造列表、字典或集合，提供了叫做“显示”的特殊语法，它们每个都有两种方式：包容内容要么显式列举出来；要么通过一组循环和过滤指令计算而来，这叫做“推导式”。列表显示是包围在方括号中的可以为空的一系列表达式，一个例子列表可写为[1,2,3]。字典显示是包围在花括号中的可能为空的一系列的键/数据项对。集合显示用花括号来指示，与字典显示的区别是缺少分隔键与值的分号。自从Python 3.5，增加了在表达式列表中的“可迭代解包”*，和在字典显示中的“字典解包”**。
Python支持列表推导式。Python 2.4将列表推导式扩展至更一般性的生成器表达式。Python 3.0又增补了字典推导式和集合推导式。
在Python中，加圆括号形式（parenthesized form），是包围在圆括号中的一个可选表达式列表。加圆括号的表达式列表产生的东西，就是这个表达式列表所产生的：如果这个列表包含至少一个逗号，它产生一个元组；否则它产生构成这个表达式列表的那个单一表达式。一个例子元组可写为(1,2,3)。元组不是圆括号形成的，而是使用逗号形成的，在没有歧义的情况下，元组的圆括号是可选的。空的圆括号对产生空元组对象。使用序列串接算符+来串接二个元组，产生包含给定元组二者的元素的一个新元组。
Python支持在序列对象（比如字符串、元组或列表）上的下标（subscription）表达式：a[索引]，和分片（英语：）表达式：a[开始:停止]或a[开始:停止:步长]。下标索引是基于零的，负数是相对于结尾的。分片范围自从“开始”索引，直到但不包括“停止”索引。分片的第三个参数叫做“步长”（step）或“间隔”（stride），允许元素被跳过和用负数指示反向。分片索引可以省略，例如a[:]，这返回整个列表的一个复本。分片的每个元素都是浅层复制（英语：）的。
Python的条件表达式表示为x if c else y。意思是当c为真时，表达式的值为x，否则表达式的值为y。 在运算元的次序上不同于很多其他语言中常见的c ? x : y。
Python的匿名函数实现为lambda表达式。匿名函数体只能是一个表达式。
自从Python 3.8，介入了赋值表达式，其记号是:=。它将一个表达式赋值给一个标识符，同时还返回这个表达式的值。赋值表达式在用作子表达式，即位于分片表达式、条件表达式、lambda表达式、关键字参数中的表达式和推导式中的if表达式之中，以及在assert和with语句之中的时候，必须围绕着圆括号。在它们可以使用的所有其他地方，包括在if和while语句之中，都不要求圆括号。
Python中运算符具有优先级，下表中的运算符按照从最高到最低的次序列出。在相同单元格中运算符具有相同的优先级，它们从左至右结合，除了指数表达式和条件表达式从右至左结合之外：
| 运算符 | 描述 |
| --- | --- |
(表达式...)，[表达式...]，{键: 值...}，{表达式...}: 加圆括号表达式，列表显示，字典显示，集合显示
x[索引]，x[索引:索引]，x(参数...)，x.特性: 下标，分片，调用，特性引用
await x: await表达式
**: 指数
+x，-x，~x: 取原数，相反数，逐位NOT
*，@，/，//，%: 乘法，矩阵乘法，除法，下取整除法，余数
+，-: 加法和减法
<<，>>: 移位
&: 逐位AND
^: 逐位XOR
|: 逐位OR
in，not in，is，is not，<，<=，>，>=，!=，==: 包含成员关系测试，同一测试，各种比较
not x: 布尔NOT
and: 布尔AND
or: 布尔OR
if – else: 条件表达式
lambda: lambda表达式
:=: 赋值表达式
Python提供了序列串接算符+和序列倍增算符*。自从Python 3.9，介入了字典归并算符|和字典更新算符|=。
Python的文本序列类型，包括字符串str和字节序列bytes与bytearray。字符串文字（英语：）有多种写法，字符串对象有一个内建格式算符%：
短字符串文字，由单引号'或双引号"界定。不同于Unix shell、Perl和受Perl影响的语言，单引号和双引号功能相同。这二种字符串都使用反斜杠\作为转义字符。
长字符串文字，是开始并结束于三个单引号'''或三个双引号"""的序列。它们可以跨越多行，其功能就像shell、Perl和Ruby中的here文档。
字节文字（英语：）总是前缀上一个b或B，它产生bytes类型的实例。它们只可以包含ASCII字符，具有128或更大数值的字节必须通过转义来表达。
字符串文字或字节文字都可选的能前缀上一个r或R，这叫做原始字符串（英语：）。转义序列不被解释，因此在文字反斜杠常见的地方很有用，比如正则表达式和Windows风格的路径。这种引述可比较于C#中的“@引述”。
Python允许多个毗邻的字符串文字或字节文字（它们以空白分界并可以使用不同的引述约定），在编译时间于语法层面上串接起来。要在运行时间串接字符串，必须使用序列串接算符+。
Python中的“字符串格式”算符%，在功能上类同于C语言中的printf格式化字符串，例如"spam=%s eggs=%04d" % ("blah", 2)，求值为'spam=blah eggs=0002'。自从Python 3.0，str类提供了可供替代的format()方法，例如"spam={0} eggs={1:04d}".format("blah", 2)。在Python 3.6中，提供了“格式化字符串文字”或称为“f字符串”，它向字符串文字前缀上f或F，这是一种字符串插值（英语：），例如x="blah"; y=2; f'spam={x} eggs={y:04d}'。
在Python中，在表达式和语句之间的区别是严格强制性的，这对比于语言如Common Lisp、Scheme或Ruby。故而Python中个别构造存在功能重复，比如：列表推导式相当for循环；条件表达式相当if语句；内建函数eval()相当exec()，前者用于表达式，后者用于语句。
语句不能成为表达式的一部份，由于列表和其他推导式或lambda表达式，都是表达式，也就不能包含语句。这个限制的一个示例：赋值语句比如a = 1，不能用作条件语句的条件判断表达式的一部份；这能够避免C语言编程中的一个常见错误，即在条件判断时把等于算符==误写为赋值算符=，这不是预期代码却在语法上有效而能通过编译器检查，在Python中这会导致一个语法错误。