第六章 python杂货铺之运算符
6.3.1 运算符分类
说明:按照参与运算的操作数进行分类,可以分为如下三类;
| 运算类型 | 运算符 | 操作数 |
|---|---|---|
| 一元运算 | [~,+,-] 按位取反、一元加号、一元减号 | 1 |
| 二元运算 | 算术、比较、赋值、逻辑、位、身份、成员运算七种 | 2 |
| 三元运算 | x if condtion else y ; expression for item in iterable [if condition] | 3 |
6.3.2 一元运算
1 定义
仅仅只有一个操作数参与的运算,称之为一元运算符;
2 运算符说明
| 运算符 | 功能 |
|---|---|
| ~ 按位取反 | 一元运算符 ~ (取反) 的结果是对其整数参数按位取反;x 的按位取反被定义为 -(x+1) |
| + 一元加号 | 一元运算符 + (正) 会产生与其数值参数相同的值 |
| - 一元减号 | 一元运算符 - (负) 会产生其数值参数的负值 |
6.3.3 二元运算
1 定义
参与运算需要两个操作数的运算,称之为二元运算;
2 分类
说明按照参与运算的具体的类别来进行分类,可以分为如下七类;
| 运算类型 | 符号 |
|---|---|
| 算术运算 | [+,-,*,/,%,//,**] |
| 关系比较运算 | [>,>=,==,!=|<>,<,<=] |
| 赋值运算 | [+=,-=,*=,/=,%=,//=,**=,<<=, >>=, &=, ^= ,|=] |
| 逻辑运算 | [and,or,not] |
| 位运算 | [&,|,^,~,<<n,>>n] |
| 成员运算 | [in,not in] |
| 身份运算 | [is ,is not] |
算术运算符
| 运算符号 | 数据类型 |
|---|---|
| + | int flat bool : 数值相加 str list tuple dict: 元素拼接在一起,构成一个新的该数据类型 |
| - | int flat bool : 数值相减 set: 两个集合的差集; |
| * | int flat bool : 数值相乘 str list tuple dict: 元素重复的次数 |
| / | 数字:除法 |
| % | 数字:取余 |
| // | 数字:取商 |
| ** | 数字:幂运算 |
逻辑运算
| 运算符 | 数据类型和意义 |
|---|---|
| and | 逻辑与 |
| or | 逻辑或 |
| not | 逻辑非 |
关系比较
| 运算符 | 数据类型和意义 |
|---|---|
| > | 数据类型:所有的数据类型都支持 数字:比较值 其他:比较字符在ascii表中的次序; |
| < | 小于 |
| >= | 大于等于 |
| <= | 小于等于 |
| == | 判定左右两边对象的值是否相等; |
| != 或<> | 不等于 |
赋值运算
| 运算符号 | 数据类型和意义 |
|---|---|
| = | 赋值,创建一个对象的引用 |
| += | 加等 |
| -= | 减等 |
| *= | 乘等 |
| /= | 除等 |
| %= | 取余等 |
| //= | 取商等 |
| **= | 幂等 |
位运算
| 运算符 | 数据类型和意义 |
|---|---|
| & | 相同的二进制位,若二进制值都为1则该位的计算结果为1,其余情况该位的计算结果为0; |
| | | 相同的二进制位,若二进制值只要有一个为1则该位的计算结果为1,其余情况该位的计算结果为0; |
| ^ | 相同的二进制位上,二进制值相同则该位的计算结果为0,不同则该位的计算结果为1; |
| ~ | 二进制位01取反; |
| <<n | 将数字对应的二进制位,整体向左移动n个二进制位,空余出来的右边的n个二进制位采用二进制0填充,然后计算出结果; |
| >>n | 删除数字对应的二进制位的右边n位,然后计算出结果; |
成员运算
| 运算符 | 数据类型和意义 |
|---|---|
| in | 数字: 不支持成员运算 str: 判定一个子序列sub整体是否存在于字符串中; list、tuple、set、dict: 判定一个元素是否存在于指定的某个数据类型中; |
| not in | .. |
身份运算
| 运算符 | 数据类型和意义 |
|---|---|
| is | 数据类型:支持所有的数据类型; 意义: 判定运算符左右两侧的对象的内存地址是否相同,即是否为同一个对象 |
| is not | .. |
3 运算符扩展
3.1 逻辑运算的补充说明
要抛弃一个成见,逻辑运算的结果并不一定是布尔值;逻辑运算的结果是取决参与逻辑运算的数据类型决定的;
3.2 逻辑运算符的优先级
优先级:()> not > and > or
说明:优先级不同的运算先计算优先级高的运算,优先级相同则从左向右进行计算;
3.3 逻辑运算的计算方法
方法一: 采用运算符的优先级根据运算得出最终结果;
方法二: 不考虑优先级,逻辑运算从左向右进行,将逻辑符号右边的多个逻辑运算当成一个整体
如: 2 >1 and 1<4 or 2<3 and 9>6 or 2<4 and 3 <2
step1:2 > 1 and (1<4 or 2<3 and 9>6 or 2<4 and 3 <2)
step2: 1<4 or (2<3 and 9>6 or 2<4 and 3 <2) 直接返回True
说明:方法二比方法一要更快得出结果;
3.4 逻辑运算的高级扩展
| 逻辑运算 | 结果 | x、y说明 |
|---|---|---|
| x or y | x为真:直接返回x x为假:返回y |
x,y为表达式:则返回的结果是True/False xy为数值型:则根据bool(x)的真假,返回x或y |
| x and y | x为真:返回y x为假:返回x |
x,y为表达式:则返回的结果是True/False xy为数值型:则根据bool(x)的真假,返回x或y |
| not x | x为真:返回False x为假:返回True |
返回结果:True/False |
3.5 逻辑运算高应用场景
case1: 变量赋值时可以动态的赋值
value = x or y
value = x and y
4 二元运算符优先级
| 运算符优先级 | 双下方法 |
|---|---|
| () | |
| ** 幂运算 | [_pow_] |
| ~(按位取反) 一元加 一元减 | [__invert__,__pos__,__neg__] |
| * / % // | [__mul__,__truediv__,__mod__,__floordiv__] |
| + - | [__add__,__sub__] |
| <<n >>n 左位移 右位移 | [__lshift__,__rshift__] |
| & | [__and__] |
| | ^ 按为或 按为异或 | [__or__,__xor__] |
| > >= < <= | [__gt__,__ge__,__le__,__le__] |
| == != | [__eq__,__ne__] |
| += -= *= /= %= //= **= | |
| is is not | 无双下方法 |
| in not in | [__contains__] |
| not and or | 无双下方法 |
总结:
() > 算术运算 > 位运算 > 关系比较运算 > 赋值运算 > 身份运算 >成员运算 > 逻辑运算
6.3.4 三元运算
1 功能:
功能一. 用于变量赋值;if..else用于直接变量赋值,for..if则用于构建一种数据类型后赋值;
功能二. 简写代码;if..else是if..else代码块的一行语法,for..for则是多层嵌套的一行语法;
2 类型:
if..else结构:
expression1 if condition else expression2
| condition | 返回值 |
|---|---|
| True | expression1 |
| False | expression2 |
for..if结果:
expression1 for item in iterable [if condition]
| if 表达式的存在性 | 返回值 |
|---|---|
| if condition不存在 | item遍历得到的所有的值,一次传递一个给expression进行处理; |
| if condition存在 | item遍历得到的值,满足condition的则传递给expression进行处理,反之则丢弃; |
3 三元表达式的应用
| 类型 | 应用方式 | 案列 |
|---|---|---|
| if..else结构 | 变量赋值(不能用于构建特定的数据类型) | v= expression1 if condition else expression2 |
| for/for..if结构 | 推导式、生成器表达式 快速生成某种数据类型或构建一个生成器对象 |
v=[for..if|for] 列表解析 v=(for..if|for) 生成器表达式 v={for item in iterable if|for} 集合推导式 v={ k:v for k,v in iterable if|for }字典推导式 |
4 总结
| 类型 | 具体功能分析 | 内存分析 |
|---|---|---|
| v = if..else | 变量赋值 | 创建完整的对象,不省内存 |
| v = (expression for ..) | (expression for ..if) | 生成器表达式 | 在内存中仅仅创建一个生成器对象 而不真实存储此tuple,仅仅调用元祖中的元素时才生成该元素对象,元素调结束则被回收,节省内存空间 |
| v = [expression for ..] | [expression for ..if] | 列表解析-快速构建一个列表 | 在内存中存储此list,不省内存; |
| v = {expression for ..} | | 集合推导式-快速构建一个集合 | 在内存中创建并存储此set,不省内存; |
| v={expression for k,v...}| | 字典推导式--快速构建一个字典 | 在内存中创建并存储此dict,不省内存; |
5 三元表达式的高级用法
5.1 if..else结构
功能:
用于变量赋值,不能用于快速的构建特殊的数据类型;
基础语法:
expression1 if condition else expression2
扩展应用:
expression if ..else ..if ..else..... (一个表达式,包含有数目不限制的if..else结构)
扩展应用语法说明:
(expression if ..else.....) if condition else expression
//即将最后一个if前面所有的内容,当成一个expression处理;
注意: expression if ..if .... else ... else // 这是if的多层嵌套,而非三元表达式
扩展应用原理:
expression可以为一个具体的值,也可以为嵌套有if..else结构的表达式或其他的表达式;
if..else结构中,不能包含有for关键字,因为for三元表达式的优先级比if..else的优先级高,一旦含有for关键字则解释器会将其识别为for..if结构的三元表达式,由于for结构的三元表达式是不支持变量的直接赋值,故此会导致语法错误;
v = 3 if 0 else 5 if m > n else 9
v = 3 if 0 else 5 if 7 else 9 if 8 else 7
5.2 for..if结构
功能:
用于快速的构建某种特殊的数据类型,如list set dict或构建一个生成器;
for..if结构不能直接为变量赋值,而是只能将其构建出来的特定的数据类型赋值给一个变量;若直接赋值此三元运算符给变量会导致语法错误;即不能直接v= expression for ..if ,而是要采用各种推导式进行变量赋值;
基础语法:
expression for .. if conditon
扩展应用:
一for多个if结构:for..if..if..if.....;== expression for ..if ..(if..if..)
//多if结构体:第一个if相当于是最外层的if,而其后的if则是内层的if;
多for一个if结构:for..for..for.....if.....;== expression for (..for..for ) if expression
多for多if结构:for..for..for.......if..if..if........; ==expression for (..for....) if (..if...)
//多for结构体中:第一个for是最外层的for循环,而之后的for则是越向内的for循环结构体;
验证:
v=['%s-->%s' %(m,n) for m in range(5) for n in range(3)]
print(v)
输出:
['0-->0', '0-->1', '0-->2', '1-->0', '1-->1', '1-->2', '2-->0', '2-->1', '2-->2', '3-->0', '3-->1', '3-->2', '4-->0', '4-->1', '4-->2']
特殊案列:
['%sx%s=%s' % (m, n, m * n) for m in range(1,n+1)] for n in range(1,10)
//此案列中:
['%sx%s=%s' % (m, n, m * n) for m in range(1,n+1)] 整体作为一个表达式;
表达式整体简化为:
expression for n in range(1,10)
总结说明:
多for结构中,一旦for存在于其他的数据结构之中,则该数据结构中的内容整体作为for..if结构体中的expression; 存在于其他数据结构中的for关键字不在作为多for结构体中的for关键字处理;
expression中嵌套使用if..else结构;
总结说明:
for..if结构表达式中,for的个数至少一个,而if的结构则至少0个以上;
案列:
m= [i for i in range(10) if i >3 if i <9]
print(m)
m= [i+j for i in range(5) for j in range(10) if i+j >10]
print(m)
m = [i+j for i in range(10) for j in range(20) if i >4 if j < 9 ]
print(len(m))
m=[i if i > 10 else i+5 for i in range(10) if i >3]
print(m)
输出:
[4, 5, 6, 7, 8]
[11, 11, 12, 11, 12, 13]
45
[9, 10, 11, 12, 13, 14]
6关于三元运算的另外一种理解:
case1: expression if condition expression
此种结构即一行代码实现了整个if..else代码块;
case2: if..else的扩展结构:expression if ..else ..if ..else.....
此种扩展结构实现了,多层嵌套的if..else结构体,其中最后一个if为最外层if结构体;
case3: expression for ..if condition
此行结构的扩展用法: expression for .. for 结构;同样是将多层的for循环一行代码予以实现;
case4: for..if的扩展语法中:多for..多if结构体
此行结构体实现了:多层for结构体的一行代码的实现;

浙公网安备 33010602011771号