2.5运算符
分为一元运算符、二元运算符、三元运算符【Python中没有 其他语言条件语句?表达式1:表达式2
】
一元运算符是由一个数据参与运算,比如正负号 +78
-10
~19
[按位取反]
2.5.1算术运算符
加法 +
减法 -
乘法 *
除法
/ 结果是浮点类型的 除不尽 商会有小数
// 结果是整型的 对商进行向下取整
<=商且最接近于商的整数 称为向下取整
取余数
% A除以B除不尽 会余下数据 这个余下的数据就是余数
11除以3得3余2 这个2就是余数
11 % 3 = 2
求幂数
** 比如x**y,求x的y次方
y如果是正整数N 对x求幂数次方
y是1/N 小数格式 对x进行开方
x = 2
y = 3
x ** y = 2的3次方 = 8
x = 27
y = 1/3
x ** y = 27的三分之一次方
开方的时候结果是浮点型的 8**(1/2)
算术运算符的优先级别:
** > 符号 > *、/、//、% > 加减
提高表达式的优先级使用小括号()
包含
2.5.2赋值运算符
简单赋值运算符
变量名 = 数据值
将等号右边的表达式计算结果 赋值给左边的变量名
比如 a = 17
a = 19 % 4
b = 18
a = b // 4
复合赋值运算符
结合其他运算符在内的赋值格式,比如
变量名 += 表达式
-=
*=
/=
//=
%=
**=
先计算表达式的结果 在对变量名根据结果进行相应的算术运算,最后把计算结果赋值给变量名
比如 a = 17
a -= 18 % 4
1. 18 % 4 = 2
2. a - 2 = 17 - 2 = 15
3. a = 15
赋值表达式(海象运算符)
把某个赋值表达式的结果再赋值给另外一个变量,这种格式称为赋值表达式
比如在其他语言中 支持 y = (x = 17 % 3)
解读:先计算x的结果,再把x的值赋值给y
但是这个写法在Python中不支持,Python变更成 y = (x := 17 % 3)
这里其实也是同时定义了两个变量,只不过不同于a, b=11, 22
的是这个赋值表达式在定义变量的时候,某个变量的值参与另外一个变量定义的运算
2.5.3 比较运算符
又称为关系运算符,对比两个表达式结果的关系的,运算符有:
> 判断前者是否大于后者
>= 判断前者是否大于或者等于后者
< 判断前者是否小于后者
<= 判断前者是否小于或者等于后者
== 判断两者是否相等
!= 判断两者是否不相等
算术运算符的优先级别高于比较运算符
介绍字符串数据的比较,本质比较的是字符对应的十进制数据,比较规则是相同位置的字符进行比较,直到比较出结果
比如
s1 = 'hello'
s2 = 'head'
res = s1 > s2 这个结果是真还是假???
第一次比较是 h 对 h
第二次比较是 e 对 e
第三次比较是 l 对 a 成立
因此结果为真
2.5.4 逻辑运算符
逻辑运算符的优先级别是低于比较运算符的
逻辑运算符是来关联表达式的逻辑关系的,逻辑关系是有三种的
-
逻辑与(
and
)连接的逻辑关系是一个并且的关系,这两个表达式同时成立,结果才是成立的
True and True = True True and False = False False and False = False False and True = False
总结
and
的运行机制:and
是具备有短路原则,左边表达式不成立,右边表达式不被执行执行机制是左边表达式成立,结果取决于右边表达式;左边表达式不成立,结果就是左边表达式的值
-
逻辑或(
or
)连接的逻辑关系是或者的关系,两个表达式中有一个成立,结果就是成立的
True or True = True True or False = True False or True = True False or False = False
or
也是具备短路原则的,左边表达式成立,右边不执行执行机制:左边表达式成立,结果就是左边表达式的;左边表达式不成立,解决取决于右边表达式的值
-
逻辑非(
not
)对逻辑关系取反,逻辑关系结果为真,
not
之后设定为假;逻辑结果为假,not
之后设定为真not True = False not False = True
优先级别的问题:
not
> and
> or
2.5.5成员运算符
成员运算符是用来判定 数据是否是某个容器型数据中的元素
数据 in 容器型数据
把数据作为一个整体 判断是否在容器中
数据 not in 容器型数据
把数据作为一个整体 判断是否不在容器中
目前接触到的是字符串,之后还会接触到列表、元组、字典、集合、range等等
2.5.6 身份运算符
判定两个数据的地址在内存是否是一致的
数据1 is 数据2
判断两个数据在内存中的地址是否是一致的
数据1 is not 数据2
判断两个数据在内存中的地址是否是不一致的
启动程序,维护程序运行的数据存储于内存中,当程序结束,数据在内存中被释放了
内存也是分为不同的区域的,不同的区域存储的数据是不一样的,数据的生命周期也是不一样的,区域有:
-
栈区
-
堆区
-
常量池
常量池中存储的是数值类型以及字符串类型的数据
特点:获取数据时检查数据是否在常量池中存在,如果存在的话直接根据地址获取数据,如果不存在,先分配空间添加数据,再把数据的地址赋值给变量
生命周期:当程序结束的时候才会释放
-
静态池
存储全局变量【直接在
py
文件中定义的变量称为全局变量】生命周期:当程序结束的时候才会释放
-
方法区
2.5.7 位运算符
这个运算符的运算机制是对二进制数据进行计算的,因为直接是针对于二进制数据计算,计算效率是非常高的
& 按位与
相同位置的数据,只要有一个是0,该位置的结果为0
| 按位或
相同位置的数据,只有有一个是1,该位置的结果为1
^ 按位异或
相同位置的数据一样,该位置位0,否则为1 【相同为0 不同为1】
一个数与相同的数异或两次结果是其本身 【交换两个变量的值】
交换两个变量的值 a = 10 b = 20 ====> a = 20 b = 10
[使用至少3种方法交换两个变量的值] *****
-- 方式1:大众的方式 借助第三方变量
c = a
a = b
b = c
-- 方式2:采用异或 【不用第三方变量】
a = a ^ b # 10 ^ 20
b = a ^ b # 10^20 ^ 20 ====> 10
a = a ^ b # 10^20^10 ====> 20
-- 方式3:采用距离问题 【不采用第三方变量】
a = a + b # 10 + 20
b = a - b # 10 + 20 - 20 ====> 10
a = a - b # 10 + 20 - 10 ====> 20
-- 方式4:Python独有的方法
a, b = b, a ====> a, b = 20, 10
~ 按位取反
该位置上的数据0变1, 1变0
>> 按位右移
将二进制数据向右移动N位,左边空出
如果是正数 左边补0
如果是负数 左边补1
规律:
数值//(2**N)
<< 按位左移
将二进制数据向左移动N位,右边空出补0
规律:
数值*2**N
运算符都是针对于位【二进制数据中一个0或者一个1称为一位】的
在计算机发展过程中,根据数据计算的发展的一个历程,二进制形态出现过三种:原码/反码/补码。 现在的计算机中存储处理二进制数据的形态是补码
对于正数来说,三码合一,格式是一样的, 原码样子就是将十进制数据按照规则转化为二进制的格式
负数的原码: 在正数的基础上将最高位置为1,则表示这个数据为负数。【二进制的最高位为符号位:0表示正数 1表示负数】,之前接触过进制转换,数据大小不一样,获取的二进制数据中位的个数不一样,怎么确定哪个是最高位??? 【计算机中数据存储时开辟的最小单元是字节,1个字节是8位,位数一确定 最高位就确定了】,比如常规的数据开启的字节数是4个字节 0000 0000 0000 0000 0000 0000 0000 0001
0000 0000 0000 0000 0000 0000 0000 1010
[10]
1000 0000 0000 0000 0000 0000 0000 1010
[-10]
负数的反码:在负数原码的基础上,除了符号位,0变1,1变0
-10的反码1111 1111 1111 1111 1111 1111 1111 0101
负数的补码: 在负数反码的基础上加1
-10的补码 1111 1111 1111 1111 1111 1111 1111 0110