06-运算符_运算符
06-运算符_运算符_02
06-运算符_运算符_03
06-运算符_运算符_04
06-运算符_运算符_05
06-运算符_运算符_06

# 1.算数运算符:+ / // % **
print(10 + 3.1)
print(10 + 3)
print(10 / 3)  # 结果带小数
print(10 // 3)  # 只保留整数部分
print(10 % 3)  # 取模、取余数
print(10 ** 3)  # 取模、取余数

# 2.比较运算符:> >= < <= == !=
print(10 > 3)
print(10 == 10)

print(10 >= 10)
print(10 >= 3)

# name = input('your name: ')
# print(name == 'ly')

# 3.赋值运算符
# 3.1 变量赋值

# 3.2增量复制
age = 18
age += 1  # age=age+1
print(age)

age *= 3
age /= 3
age %= 3
age **= 3
# 3.3.链式赋值
x = 10
y = x
z = y
z = y = x = 10
print(x, y, z)
print(id(x), id(y), id(z))
# 3.4.交叉赋值
m = 10
n = 20
print(m, n)
# 交换值
# temp = m
# m = n
# n = temp
# print(m,n)
m, n = n, m
print(m, n)

# 3.5解压赋值
salaries = [111, 222, 333, 444, 555]
# # 把五个月的工资取出来分别赋值给不同的变量名
# mon0 = salaries[0]
# mon1 = salaries[1]
# mon2 = salaries[2]
# mon3 = salaries[3]
# mon4 = salaries[4]
# # 解压赋值
# mon0, mon1, mon2, mon3, mon4 = salaries
# print(mon0)
# print(mon1)
# print(mon2)
# print(mon3)
# print(mon4)

# mon0,mon1,mon2,mon3=salaries # 对应的变量名少一个不行
# mon0,mon1,mon2,mon3,mon4,mon5=salaries # 对应的变量名多一个也不行
# 引入*,可以帮助我们取两头的值,无法取中间的值
# 取前三个值
x, y, z, *_ = salaries[111, 222, 333, 444, 555]  # *会将没有对应关系的值存成列表然后赋值给紧跟其后的那个变量名,此处为_
print(x, y, z)
print(_)

# 取后三个值
# *_,x,y,z=salaries=[111,222,333,444,555]
# print(x,y,z)

# x,*_,y,z=salaries=[111,222,333,444,555]
# print(x,y,z)

# salaries=[111,222,333,444,555]
# _,*middle,_=salaries
# print(middle)

# 解压字典默认解压出来的是字典的key
x, y, z = dic = {'a': 1, 'b': 2, 'c': 3}
print(x, y, z)
# 逻辑运算符
# 1. not、and、or的基本使用

# 1.1 not:就是把紧跟其后的那个条件结果取反
# ps:not与紧跟其后的那个条件是一个不可分割的整体
print(not 16 > 13)  # False
print(not True)  # False
print(not False)  # True
print(not 10)  # False
print(not 0)  # True
print(not None)  # True
print(not '')  # True

# 1.2 and:逻辑与,用于连接两个条件,两个条件同时成立时才返回True,但凡有一个条件为False则返回False
print(True and 10 > 3)  # True
# ps:可以用and连接多个条件,会按照从左到右的顺序一次判断,一旦某一个条件为False,则无需再往右判断,可以立即判定最终结果为False,只有在所有条件的结果都为True的情况下,最终结果才为True。
print(2 > 1 and 1 != 1 and True and 3 > 2)  # False

# 1.3 or:逻辑或,用于连接两个条件,两个条件但凡有一个条件成立时就返回True,只有在两个条件同时为Fasle时才返回False
print(3 > 2 or 0)  # True
# ps:可以用or连接多个条件,会按照从左到右的顺序依次判断,一旦某一个条件为True,则无需再往右判断,可以立即判定最终结果为True,只有在所有条件的结果都为Fasle的情况下,最终结果才为False
print(2 > 1 or 1 != 1 or True or 3 > 2)  # True

# 2.优先级not>and>or,同一优先级默认从左往右计算。
# 原理:
# (1) not的优先级最高,就是把紧跟其后的那个条件结果取反,所以not紧跟其后的条件都不可分割
# (2) 如果语句中全部是用and连接,或者全部用or连接,那么按照从左到右的顺序一次计算即可
# (3) 如果语句中既有and也有or,那么先用括号把and的左右两个条件给括起来,然后在进行运算
print(3>4 and 4>3 or 1==3 and 'x' == 'x' or 3 >3)  # False
print((3>4 and 4>3) or (1==3 and 'x' == 'x') or 3 >3)  # False
# 1.成员运算符 in、(not in)

# 1.1 in:某一个对象包含于另外一个对象则返回True
print("egon" in "hello egon")  # 判断一个字符串是否存在于一个大字符串中
print("e" in "hello egon")  # 判断一个字符串是否存在于一个大字符串中
print(111 in [111, 222, 33])  # 判断元素是否存在于列表
print(111 in {"k1": 111, 'k2': 222})  # False
print("k1" in {"k1": 111, 'k2': 222})  # True
# 1.2 not in:某一个对象没有包含于另外一个对象则返回True
print("egon" not in "hello egon")  # False

# 2.身份运算符 is、(is not)
# 2.1 is:比较的是id,两个对象的id相同则返回True
x = 10
y = x
print(id(x), id(y))
print(x is y)  # x与y的id相同(1709662720 1709662720)
# 2.2 is not:在两个对象的id不同时is not会返回True
m = 'xx'
n = 'yyy'
print(id(m), id(n))  # m与n的id不同(2470609030032 2470609029976)
print(m is not n)  # True

# 2.3 补充 == 与 is
# ==双等号比较的是value是否相等,而is比较的是id是否相等
# 2.3.1 id相同,内存地址必定相同,意味着type和value必定相同
# 2.3.2 value相同,type肯定相同,但id可能不同
x = 'Info Tony:18'
y = 'Info Tony:18'
print(id(x), id(y))  # x与y的id不同,但是二者的值相同 (2850804534832, 2850803860400)

print(x == y)  # 等号比较的是value
print(type(x), type(y))  # 值相同type肯定相同
print(x is y)  # is比较的是id,x与y的值相等但id可以不同