表达式和运算符

表达式的组成

表达式是可以计算的代码片段,由操作数和运算符构成。操作数、运算符和圆括号按一定的规则组成表达式。表达式通过运算后产生运算结果,返回结果对象。运算结果对象的类型由操作数和运算符共同决定。运算符表明对操作数进行什么样的运算。运算符包括+-*/等。操作数包括文本常量(没有名称的常数值,例如1、"abc")、变量(例如i=123)、类的成员变量/函数(例如math.pi、math. sin(x))等,也可以包含子表达式(例如(2**10))。

表达式既可以非常简单,也可以非常复杂。当表达式包含多个运算符时,运算符的优先级控制各个运算符的计算顺序。例如,表达式x+y*zx+(y*z)计算,因为*运算符的优先级高于+运算符。

【实例】表达式示例。

import math           #导入math模块
a = 2;b = 10          #变量a指向int对象2,变量b指向int对象10
a+b                   #输出:12
math.pi               #输出:3.141592653589793
math.sin(math.pi/2)   #输出1.0

表达式的书写规则

Python表达式遵循下列书写规则。

(1)表达式从左到右在同一个基准上书写。例如,数学公式 a2+b2 应该写为 。a2+b2。

(2)乘号不能省略。例如,数学公式ab(表示a乘以b)应写为a*b。

(3)括号必须成对出现,而且只能使用圆括号;圆括号可以嵌套使用。

【实例】复杂表达式示例。数学表达式 1/2sin⁡[a(x+1)+b] 写成Python表达式为

math.sin(a*(x+1)+b)/2

运算符概述

Python运算符用于在表达式中对一个或多个操作数进行计算并返回结果值,接受一个操作数的运算符被称作一元运算符,例如正负号运算符+-;接受两个操作数的运算符被称作二元运算符,例如算术运算符+-*/等。如果一个表达式中包含多个运算符,则计算顺序取决于运算符的结合顺序和优先级。优先级高的运算符优先计算,例如,在1+2*3中*的优先级比+高,故先计算2*3。同一优先级的运算符按结合顺序依次计算,例如+、-(以及*、/)为同一优先级左结合的运算符,故1+2-3等同于(1+2)-3;2*4/2等同于(2*4)/2。注意,赋值运算符=为右结合运算符,故a=b=c等同于a=(b=c)。用户可以使用圆括号“()”强制改变运算顺序。

【实例】表达式中运算符的优先级示例。

11 + 22 * 3      #输出:77
(11 + 22) * 3    #输出:99

Python运算符

Python语言定义了许多运算符,按优先顺序排列如表所示。通过运算符重载(overload)可以为用户自定义的类型定义新的运算符。

算术运算符

运算符 描述 示例
+ 相加 a + b
- 相减 a - b
* 相乘 a * b
/ 相除 a / b
% 取模 a % b
** a**b 表示 a 的 b 次幂
// 取整除 9 // 4 结果为 2

比较运算符

运算符 描述 示例
== 是否相等 a == b
!= 是否不等于 a != b
> 是否大于 a > b
< 是否小于 a<b
>= 是否大于等于 a >= b
<= 是否小于等于 a <= b

赋值运算符

运算符 描述 示例
= 简单的赋值运算符 a = b + c
+= 加法赋值运算符 a += b 等效于 a = a + b
-= 减法赋值运算符 a -= b 等效于 a = a - b
*= 乘法赋值运算符 a *= b 等效于 a = a * b
/= 除法赋值运算符 a /= b 等效于 a = a / b
%= 取模赋值运算符 a %= b 等效于 a = a % b
**= 幂赋值运算符 a **= b 等效于 a = a ** b
//= 取整除赋值运算符 a //= b 等效于 a = a // b

逻辑运算符

运算符 描述 示例
and 布尔类型与 a and b
or 布尔类型或 a or b
not 布尔类型非 not a

位运算符

运算符 描述 示例
& 按位与运算符。参与运算的两个值,如果两个相应位都为1,那么该位的结果就为1,否则为0 60&13输出结果为12,二进制为0000 1100
| 按位或运算符。只要对应的两个二进制位有一个为1,结果就为1 60|13输出结果为61,二进制为0011 1101
^ 按位异或运算符。当两个二进制位相异时,结果为1 60^13输出结果为49,二进制为0011 0001
~ 按位取反运算符。对数据的每个二进制位取反,即把1变为0,把0变为1 ~60输出结果为-61,二进制为1100 0011
<< 左移动运算符。将二进制位全部左移若干位,由"<<"右边的数指定移动的位数,高位丢弃,低位补0 60<<2输出结果为240,二进制为1111 0000
>> 右移动运算符。将二进制位全部右移若干位,由">>"右边的数指定移动的位数,移动过程中,正数最高位补0,负数最高位补1,无符号数最高位补0 60>>2输出结果为15,二进制为0000 1111

成员运算符

运算符 描述 示例
in 如果在指定的序列(元组或列表)中找到值,就返回True,否则返回False 若x在y序列(元组或列表)中,则返回True,否则返回False
not in 如果在指定的序列(元组或列表)中没有找到值,就返回True,否则返回False 若x在y序列(元组或列表)中,则返回False,否则返回True
x = 'hello world'
y = [1,2,3,4]
print('in运算符:','hello' in x)
print('not in运算符:',2 not in y)

【程序运行结果如下】

in运算符: True
not in运算符: False

身份运算符

运算符 描述 示例
is 判断两个标识符是否引用同一个对象 a is b
is not 判断两个标识符是否引用不同对象 a is not b
x = 10
y = 10
print('is运算符:',x is y)
y = 20
print('not is运算符:',x is not y)

【程序运行结果如下】

is运算符: True
not is运算符: True

运算符优先级

运算符 描述(由上至下对应优先级由高到低)
** 幂运算
~ + - 取反、正号、负号
* / % // 乘、除、取模、取整除
+ - 加法、减法
>> << 右移、左移
&
^| 异或、或
<= < > >= 比较运算符
== != 是否等于、是否不等于
= %= /= //= -= += *= **= 赋值运算符
is is not 身份运算符
in not in 成员运算符
not and or 逻辑运算符
运算符 描述 示例
+ 相加 a + b
- 相减 a - b
* 相乘 a * b
/ 相除 a / b
% 取模 a % b
** a**b 表示 a 的 b 次幂
// 取整除 9 // 4 结果为 2
== 是否相等 a == b
!= 是否不等于 a != b
> 是否大于 a > b
>= 是否大于等于 a >= b
<= 是否小于等于 a <= b
= 简单的赋值运算符 a = b + c
+= 加法赋值运算符 a += b 等效于 a = a + b
-= 减法赋值运算符 a -= b 等效于 a = a - b
*= 乘法赋值运算符 a *= b 等效于 a = a * b
/= 除法赋值运算符 a /= b 等效于 a = a / b
%= 取模赋值运算符 a %= b 等效于 a = a % b
**= 幂赋值运算符 a **= b 等效于 a = a ** b
//= 取整除赋值运算符 a //= b 等效于 a = a // b
& a & b
^ 异或 a ^ b
~ 取反 ~a
<< 左移动 a << 3
>> 右移动 a >> 3
and 布尔类型与 a and b
or 布尔类型或 a or b
not 布尔类型非 not a
is 判断两个标识符是否引用同一个对象 a is b
is not 判断两个标识符是否引用不同对象 a is not b

混合运算和数值类型转换

隐式转换

int、float和complex对象可以进行混合运算。如果表达式中包含complex对象,则其他对象自动转换(隐式转换)为complex对象,结果为complex对象;如果表达式中包含float对象,则其他对象自动转换(隐式转换)为float对象,结果为float对象。

【实例】隐式类型转换示例。

f=123+1.23
f             #输出:124.23
type(f)       #输出:<class'float'>
123+True      #True转换为1.输出:124
123+False     #False转换为0.输出:123

!!!注意:在混合运算中True自动转换为1, False自动转换为0。

显式转换

“显式转换”又称为“强制转换”,使用target-type(value)将表达式强制转换为所需的数据类型。如果未定义相应的转换运算符,则强制转换会失败。显式转换实际上使用目标类型的构造函数创建其对象。

  • int(x)、float(x)、bool(x)、str(x)分别把对象转换为整数、浮点数、布尔值和字符串。

【实例】显式类型转换示例。

int(1.23)       #输出:1
float(10)       #输出:10.0
bool("abc")     #输出:True
float("123xyz") #报错.ValueError:could not convert string to float:'123xyz

显式数值转换可能导致精度损失,也可能引发异常(例如OverflowError)。例如:

i=9999**9999
float(i)   #报错.OverflowError:long int too large to convert to float

【实例】数值数据类型示例(profit.py):计算复利。

nb=float(input("请输入本金:"))         #输入本金并转换为浮点数
nr=float(input("请输入年利率:"))       #输入年利率并转换为浮点数
ny=int(input("请输入年数:"))           #输入年数并转换为整数
amount= nb * (1+nr/100) ** ny        #计算复利
print("本金利率和为:%0.2f"%amount)     #输出复利,保留两位小数

【程序运行结果如下】

请输入本金:1000
请输入年利率:6
请输入年数:10
本金利率和为:1790.85