一、基本运算符
-
算数运算符
print(10 + 3.1) # 13.1 print(10 + 3) # 13 print(10 / 3) # 结果带小数 3.3333333333333335 print(10 // 3) # 只保留整数部分 3 print(10 % 3) # 取模、取余数 1 print(10 ** 3) # 次方 10的3次方 1000 -
赋值运算符
=:变量的赋值
age = 18增量赋值
age = 18 # age += 1 # age=age + 1 # print(age) age *= 3 # age=age * 3 age /= 3 # age=age / 1 age %= 3 # age=age % 1 age **= 3 # age=age ** 3链式赋值
# x=10 # y=x # z=y z = y = x = 10 # 链式赋值 print(x, y, z) # 10 10 10 print(id(x), id(y), id(z)) # 140708543928256 140708543928256 140708543928256交叉赋值/交换两个值
m=10 n=20 print(m,n) # 10 20 #交换值 temp=m m=n n=temp print(m,n) # 20 10m=10 n=20 print(m,n) # 10 20 m,n=n,m # 交叉赋值 print(m,n) # 20 10解压赋值
messages = [111, 222, 333, 444, 555] #把列表里的元素取出来分别赋值给不同的变量名 mes0 = messages[0] mes1 = messages[1] mes2 = messages[2] mes3 = messages[3] mes4 = messages[4]#解压赋值 mes0,mes1,mes2,mes3,mes4 = messages # 对应的变量名数量不能多也不能少 print(mes0) # 111 print(mes1) # 222 print(mes2) # 333 print(mes3) # 444 print(mes4) # 555# 引入*,可以帮助我们取两头的值,无法取中间的值 # 取前三个值 x, y, z, *_ = messages = [111, 222, 333, 444, 555] # *会将没有对应关系的值存成列表然后赋值给紧跟其后的那个变量名,此处为_ print(x,y,z) # 111 222 333 print(_) # [444, 555] # 取后三个值 *_, x, y, z = messages = [111, 222, 333, 444, 555] print(x,y,z) # 333 444 555 # 取第一个值和最后两个值 x, *_, y, z = messages = [111, 222, 333, 444, 555] print(x, y, z) # 111 444 555#无赖大法,不建议用 _, *x, _, _ = messages = [111, 222, 333, 444, 555] print(x) # [222, 333] print(x[1]) # 333#解压字典默认解压出来的是字典的key x, y, z = dic = {'a': 1, 'b': 2, 'c': 3} print(x, y, z) # a b c -
比较运算符
>、>=、<、<=、==、!= print(10 > 3) # True print(10 == 10) # True print(10 >= 10) # True print(10 >= 3) # True name=input('your name: ') print(name == 'Python') -
逻辑运算符
not、and、or
not:就是把紧跟其后的那个条件结果取反。(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 '') # Trueand:逻辑与,and用来链接左右两个条件,两个条件同时为True,最终结果才为真。全真则真,一假为假。
or:逻辑或,or用来连接左右两个条件,两个条件但凡有一个为True,最终结果就为True,两个条件都为False的情况下,最终结果才为False。一真则真,全假为假。
区分优先级:not > and > or
如果单独就只是一串and链接,或者说单独就只是一串or链接,按照从左到右的顺讯依次运算即可,如果是混用,则需要考虑优先级了。
res = 3 > 4 and not 4 > 3 or 1 == 3 and 'x' == 'x' or 3 > 3 print(res) # False # 根据优先级整理 res = (3 > 4 and (not 4 > 3)) or (1 == 3 and 'x' == 'x') or 3 > 3 print(res) # False短路运算
Python把0、空字符串”和None看成 False,其他数值和非空字符串都看成 True,所以:
-
在计算 a and b 时,如果 a 是 False,则根据与运算法则,整个结果必定为 False,因此返回 a;如果 a 是 True,则整个计算结果必定取决与 b,因此返回 b。
-
在计算 a or b 时,如果 a 是 True,则根据或运算法则,整个计算结果必定为 True,因此返回 a;如果 a 是 False,则整个计算结果必定取决于 b,因此返回 b。 所以Python解释器在做布尔运算时,只要能提前确定计算结果,它就不会往后算了,直接返回结果。
x = 1 and 2 print(x) # 2 y = 1 or 2 print(y) # 1 z = 1 and [1, 2, 3] print(z) # [1, 2, 3] -
-
成员运算符
in
# 判断一个字符串是否存在于一个大字符串中 print("python" in "hello python") # True print("e" in "hello") # True # 判断元素是否存在于列表 print(111 in [111, 222, 33]) # True # 判断key是否存在于字典 print(111 in {"k1": 111, 'k2': 222}) # False print("k1" in {"k1": 111, 'k2': 222}) # True # not in print("python" not in "hello python") # False # 推荐使用 print(not "python" in "hello python") # False # 逻辑同上,但语义不明确,不推荐 -
身份运算符
is:判断的是id是否相等
二、可变与不可变类型
可变类型:值改变,id不变,证明改的是原值,证明原值是可以被改变的。
不可变类型:值改变,id也变了,证明是产生新的值,压根没有改变原值,证明原值是不可以被修改的。
#int是不可变类型
x = 10
print(id(x))
x = 11 # 产生新值
print(id(x))
# id发生了改变
#float是不可变类型
x = 3.1
print(id(x))
x = 3.2
print(id(x))
# id发生了改变
#str是不可变类型
x = "abc"
print(id(x))
x = 'gggg'
print(id(x))
# id发生了改变
小结:int、float、str都被设计成了 不可分割 的整体,不能够被改变。
#list是可变类型
l = ['aaa', 'bbb', 'ccc']
print(id(l))
l[0] = 'AAA'
print(l)
print(id(l))
# id没有发生改变
#dict是可变类型
dic = {'k1': 111, 'k2': 222}
print(id(dic))
dic['k1'] = 3333333333
# print(dic)
print(id(dic))
# id没有发生改变
# bool不可变
关于字典的补充:
定义:{ }内用逗号分隔开多 key: value ,其中value可以是任意类型,但是key必须是不可变类型。