表达式的组成
表达式是可以计算的代码片段,由操作数和运算符构成。操作数、运算符和圆括号按一定的规则组成表达式。表达式通过运算后产生运算结果,返回结果对象。运算结果对象的类型由操作数和运算符共同决定。运算符表明对操作数进行什么样的运算。运算符包括+
、-
、*
、/
等。操作数包括文本常量(没有名称的常数值,例如1、"abc")、变量(例如i=123)、类的成员变量/函数(例如math.pi、math. sin(x))等,也可以包含子表达式(例如(2**10))。
表达式既可以非常简单,也可以非常复杂。当表达式包含多个运算符时,运算符的优先级控制各个运算符的计算顺序。例如,表达式x+y*z
按x+(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