第三天的学习内容喵,请大大们检查~
2.5运算符
分为一元、二元、三元运算符(python中没有三元)
一元是由一个数据参与运算,比如正负号 +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)
算术运算符的优先级别:** > -负号 > *、/、//、% > 加减
提高表达式的优先级使用小括号( )包含
eg: print(-2 ** 2) # -4,先运算了**,再在前面加负号 print((-2) ** 2) # 4,括号()提高了优先级
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
a = 17 a -= 18 % 4 print(a) # 15 a += 2 print(a) # 17 a %= 5 # a % 5 = 2 ====> a = 2 print(a) # 2
赋值表达式(海象运算符)
把某个赋值表达式的结果再赋值给另外一个变量,这种格式称为赋值表达式
比如在其他语言中 支持 y = (x = 17 % 3)
解读:先计算x的结果,再把x的值赋值给y
但是这个写法在Python中不支持,Python变更成 y = (x := 17 % 3)
这里其实也是同时定义了两个变量,只不过不同于a, b=11, 22
的是这个赋值表达式在定义变量的时候,某个变量的值参与另外一个变量定义的运算
eg: # 使用赋值表达式 写成一条语句 y = 2 * (x := int(input('请输入x的值:'))) + 5 print(y)
2.5.3比较运算符/关系运算符
对比两个表达式结果的关系的,运算符有:
> 判断前者是否大于后者 >= 判断前者是否大于或者等于后者 < 判断前者是否小于后者 <= 判断前者是否小于或者等于后者 == 判断两者是否相等,(一个等号赋值,两个等号判断是否相等) != 判断两者是否不相等
算术运算符级别高于比较运算符
字符串数据的比较,本质比较的是字符对应的十进制数据,比较规则相同位置的字符进行比较,直到比较出结果
eg: s1 = 'hello' s2 = 'head' res = s1 > s2 第一次比较 h 对 h 第二次比较 e 对 e 第三次比较 l 对 a 成立 结束 结果为真
Practice
# 设定一个三位数 判断十位上的数据是否为偶数 decade = num//10%10 result = decade %2 == 0 # 除以2余数为0为偶数 print(result) # 输入数判断能否被3整除 decade = int(input('数:')) result1 = decade % 3 == 0 print(result1) # 录入一个用户名判断是否为root用户 name = input('输入用户名') result2 = name == 'root' print(result2) # 输入一个四位数,判断前两位之和是否等于后两位之和 num = int(input('四位数:')) result3 = (num//1000 % 10 + num // 100 % 10) == (num//10 % 10 + num % 10) print(result3) # 输入一个三位数,判断从个位到百位上的数是否为步长为2的等差数 num1 = int(input('三位数:')) result4 = num1 % 10 - num1//10 % 10 == num1//10 % 10 - num1//100 % 10 print(result4)
2.5.4逻辑运算符
逻辑运算符的优先级别是低于比较运算符的
逻辑运算符是来关联表达式的逻辑关系的,逻辑关系是有三种的
-
逻辑与(
and
)连接的逻辑关系是一个并且的关系,这两个表达式同时成立,结果才是成立的
True and True = True True and False = False False and False = False False and True = False
总结
and
的运行机制:and
是具备有短路原则,左边表达式不成立,右边表达式不被执行eg: res = 10 > 5 and (x := 4) > 3 print(res) # True print(x) # 4 # and具备短路原则的: 左边不成立 右边不被执行 res1 = 10 < 5 and (y := 7) > 3 # print(res1, y) # NameError: name 'y' is not defined 左边不成立直接输出结果false终止运行,因此y并没有被赋值
执行机制是左边表达式成立,结果取决于右边表达式;左边表达式不成立,结果就是左边表达式的值
-
逻辑或(
or
)连接的逻辑关系是或者的关系,两个表达式中有一个成立,结果就是成立的
True or True = True True or False = True False or True = True False or False = False
or
也是具备短路原则的,左边表达式成立,右边不执行res2 = 10 > 5 or (z := 4) > 3 print(res2) # print(z) # NameError: name 'z' is not defined 左边成立直接输出ture,右边的没有运行,
执行机制:左边表达式成立,结果就是左边表达式的;左边表达式不成立,解决取决于右边表达式的值
-
逻辑非(
not
)对逻辑关系取反,逻辑关系结果为真,
not
之后设定为假;逻辑结果为假,not
之后设定为真not True = False not False = True
优先级别的问题:
not
> and
> `or
eg: # 键盘输入一个数据 判断其是否在1-100之间 num = int(input('请输入一个整数:')) res = num >= 1 and num <= 100 # 如果这样写会有灰色的波浪线的提示 意思是:在Python中有简洁写法 # 对于连续范围的 支持数学中的表达方式 [本质和上面的写法是一样 两个关系之间是逻辑与的关系] res = 1 <= num <= 100 print(res) # 使用not来完成 res4 = not(num < 1 or num > 100) print(res4) # not的优先级别高于or 先执行or要使用()包含 # res5 = not num < 1 or num > 100 # print(res5)
practice: # 录入一个三位数,判断从个位上的数到百位上的数是否是步长为2的等差数 num1 = int(input('三位数:')) result4 = num1 % 10 - num1//10 % 10 == num1//10 % 10 - num1//100 % 10 == 2 print(result4) # 录入一个字符判断其是否为小写英文字母 num = ord(input('字母:')) # 字符串可以比较大小 res = 97 <= num <= 122 print(res) # 简化: ch = input('请输入字符:') res = 'a' <= ch <= 'z' # 判断是否为汉字 res2 = ord(input('kanji:')) res2 = '\u4e00' <= ch <= '\u9fa5' # 直接写字也可以,开头是’一‘结尾是’龥‘ print(res2) # 录入一个整数,判断其是否非同时是3和5的倍数 nu = int(input('number:')) res1 = (nu % 5 == 0 or nu % 3 == 0) and not(nu % 5 == 0 and nu % 3 == 0) print(res1) # 简化 res1 = (nu % 5 == 0 or nu % 3 == 0) and not(nu % 15 == 0) print(res1) # 分别录入用户名和密码判断用户名是否为r00t密码是否为r00t123 name = input('输入用户名') password = input('输入密码') result2 = name == 'root' and password == 'root123' print(result2)
2.5.5成员运算符
用来判定数据是某个容器型数据中的元素
数据 in 容器型数据 把数据作为一个整体 判断是否在容器中 数据 not in 容器型数据 把数据作为一个整体 判断是否不在容器中
eg: s = 'hello, nice to meet you' ch = 'l' res = ch in s print(res) # True ch1 = 'nice' res1 = ch1 in s print(res1) # True ch2 = 'too' res2 = ch2 in s print(res2) # False
目前是字符串,之后还有列表、元组、字典、集合、range等等
2.5.6身份运算符
判定两个数据的地址在内存是否一致
数据1 is 数据2 判断两个数据在内存中的地址是否是一致的 数据1 is not 数据2 判断两个数据在内存中的地址是否是不一致的
启动程序,维护程序运行的数据存储于内存中,当程序结束,数据在内存中被释放了
将10赋值给a,(a顺着地址可以找到(10))
eg: a = 10 print(a) b = 10 print(b) print(a is b) # True c = 20 print(a is c) s1 = 'hello' s2 = 'hello' print(s1 is s2) print(a is not c) # True
内存也是分为不同的区域的,不同的区域存储的数据是不一样的,数据的生命周期也是不一样的,区域有:
-
栈区
-
堆区
-
常量池
常量池中存储的是数值类型以及字符串类型的数据
特点:获取数据时检查数据是否在常量池中存在,如果存在的话直接根据地址获取数据,如果不存在,先分配空间添加数据,再把数据的地址赋值给变量
生命周期:当程序结束的时候才会释放
-
静态池
存储全局变量【直接在
py
文件中定义的变量称为全局变量】生命周期:当程序结束的时候才会释放
-
方法区
2.5.7 位运算符
这个运算符的运算机制是对二进制数据进行运算的,因为是直接针对二进制运算,所以效率非常高。
& 按位与
相同位置的数据,只要有一个是0,该位置的结果为0
print(5 & 6) # 4 """ 以一个字节为例 8位 0000 0101 0000 0110 --------- 0000 0100 =====》 4 """ print(5 & -7) # 1 """ 5的补码: 0000 0101 -7的补码: 7的原码: 0000 0111 -7的原码:1000 0111 -7的反码:1111 1000 -7的补码:1111 1001 0000 0101 1111 1001 --------- 0000 0001 ====》 1 """
|按位或
相同位置的数据,只要有一个是1,该位置的结果为1
print(5 | -7) # -3 """ 0000 0101 1111 1001 --------- 1111 1101 【补码】 想要查看二进制对应的十进制数据是谁 需要看二进制的原码 反码:1111 1100 原码:1000 0011 =====》 -3 """
^按位异或
相同位置的数据一样,该位置位0,否则为1【相同为0 不同为1】 一个数与相同的数异或两次结果是其本身 【可以用来:交换两个变量的值】
eg: print(5 ^ -7) # -4 """" 相同为0 不同为1 0000 0101 1111 1001 --------- 1111 1100 【补码】 反码: 1111 1011 原码: 1000 0100 ====》 -4 """ print(-4 ^ -7) # 5 """ 1111 1100 1111 1001 --------- 0000 0101 ====> 5 """
practice 使用至少3种方法交换两个变量的值 a = 10 b = 20 ====> a = 20 b = 10 -- 方式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
eg: print(~ -7) # 6 """ 1111 1001 --------- 0000 0110 ====> 6 """
>>按位右移
将二进制数据向右移动N位,左边空出的: 如果是正数 左边补0 如果是负数 左边补1 结果规律:数值//(2**N)
# 按位左移: practice:如何快速计算2的立方的值 print(1 << 3) # 8 """ 0000 0001 左移3位 前面三个0舍去 后面补3个0 0000 1000 """ print(2 << 3) # 16 """ 0000 0010 0001 0000 ===> 16 """ print(2 << 4) # 32 """ """ print(4 << 4) # 64
<<按位左移
将二进制数据向左移动N位,右边空出补0 规律:数值*2**N
# 按位右移 print(16 >> 3) # 2 """ 0001 0000 0000 0010 ====> 2 """ print(-16 >> 3) # -2 """ 1001 0000 原 1110 1111 反 1111 0000 补 1111 1110 【补码】 反 1111 1101 原 1000 0010 ===》 -2 """ print(4 >> 3) # 0 [会有等于0的情况] """ 00000000 """
运算符都是针对于位【二进制数据中一个0或者一个1称为一位】的
在计算机发展过程中,根据数据计算的发展的一个历程,二进制形态出现过三种:原码/反码/补码。补码运算正确率更高,现在的计算机中存储处理二进制数据的形态是补码。
对于正数来说,三码合一,格式是一样的, 原码样子就是将十进制数据按照规则转化为二进制的格式
负数的原码: 在正数的基础上将最高位置为1,则表示这个数据为负数。【二进制的最高位为符号位:0表示正数 1表示负数】,
之前接触过进制转换,数据大小不一样,获取的二进制数据中,位的个数不一样,怎么确定哪个是最高位???
【计算机中数据存储时开辟的最小单元是字节,1个字节是8位,位数一确定 最高位就确定了】,比如常规的数据开启的字节数是4个字节 32位
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
补充:布尔类型参数算术或者位运算时 True被当做1,False被当做0
eg: print(1 + True) print(1000 * False)
2.6.1顺序结构语句
代码从上向下逐行运行的
2.6.2分支结构语句
分为三种格式的,这三种格式分别是
-
单分支 语法:
if 条件表达式: 满足条件执行的代码块
语境:如果达到了某个条件,就去做某件事
:缩进/冒号缩进:代表python中代码块的包含体,满足要求执行的代码要统一缩进体现出来的包含关系
eg: # 再进行取余之前 需要先对数据进行判断 看一下是否要减去5 num = int(input('请输入一个整数:')) if num % 2 == 0: num -= 5 # num = num - 5 result = num % 3 print(result)
-
双分支 语法
if 条件表达式: 满足条件执行的代码块 else: 不满足条件执行的代码块
语境:如果满足某个条件做事情A,否则做事情B
# 需求: 输入一个整数: 如果这个数是奇数 对数据进行 *7 - 9的运算 否则对数据进行 *5-11的运算 num1 = int(input('请输入一个整数:')) if num1 % 2 != 0: result = num1 * 7 - 9 else: result = num1 * 5 - 11 print(result)
-
多分支 语法:
if 条件表达式1: 满足条件1执行的代码块 elif 条件表达式2: 不满足条件1 但是满足条件2执行的代码块 elif 条件表达式3: 满足条件3 但是不满足条件1和2执行的代码块 ... else: 以上条件都不满足执行的代码块
语境:如果满足条件1,就做事情A,否则如果满足条件2,做事情B....
# 需求:输入一个年龄 判断这个人是青年【年龄在30岁以下】 中年【30-60】 老年【60以上】 age = int(input('请输入年龄:')) if age < 30: print('青年') elif age <= 60: print('中年') else: print('老年')