第六章 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结构体的一行代码的实现;

posted @ 2019-12-24 14:53  大兵0815  阅读(122)  评论(0)    收藏  举报