文章目录
4.0
以下内容是Python内置的运算符、表达式和求值规则。
4.1 数值操作
所有数值操作都支持:
操作 | 描述 | 底层 |
---|---|---|
x + y | __add__ | |
x - y | __sub__ | |
x * y | __mul__ | |
x / y | 除法,结果浮点数 | __truediv__ |
x // y | 除法,整数部分 | __floordiv__ |
x ** y | x y x^y xy | __pow__ |
x % y | 除法的余数 | __mod__ |
-x | __neg__ | |
+x | __pos__ |
只有整数支持的操作:
操作 | 描述 | 底层 |
---|---|---|
x << y | 左移 | __lshift__ |
x >> y | 右移 | __rshift__ |
x & y | 按位与 | __and__ |
x | y | 按位或 |
x ^ y | 按位异或 | __xor__ |
-x | 按位求反 | __invert__ |
一些内置函数支持所有数值类型:
操作 | 描述 | 底层 |
---|---|---|
abs(x) | 绝对值 | __abs__ |
divmod(x,y) | 返回(x//y,x%y) | __divmod__ |
pow(x,y [,modulo]) | 返回(x ** y) % modulo | |
round(x[,n]) | 四舍五入位接近 1 0 − n 10^{-n} 10−n的倍数,n即有效数字 |
python3中四舍五入优先选择偶数倍:
0.5 -> 0
1.5 -> 2
4.2 序列操作
序列类型(字符串,列表,元组)都支持以下操作:
操作 | 描述 |
---|---|
s+r | 连接 |
s*n | 制作s的n个副本 |
v1,v2,..,vn=s | 解包,个数要严格匹配 |
s[i] | 索引 |
s[i:j [,stride]] | 切片,默认i=0,j=-1,stride=1 |
x in s,x not in s | 成员关系 |
for x in s: | 迭代 |
all(s) | 如果s中所有项都为True,则返回True |
len(s) | 长度 |
min(s) | |
max(s) | |
sum(s [,init]) | 求和 |
请注意扩展切片nums[::stride]
:
- 当
stride>0
,默认i=0,j=-1
- 当
stride<0
,默认i=-1,j=0
举一例:
nums=[1,2,3]
print(nums[:]) # [1,2,3]
print(nums[::-1]) #[3,2,1]
copyc=nums*2
nums[0]=2
print(copyc) #[1, 2, 3, 1, 2, 3]
b=[nums]
copyd=b*2
nums[0]=3
print(copyd) #[[3, 2, 3], [3, 2, 3]]
除非使用copy.deepcopy
序列的副本都是浅复制。copyc[0]
之所以不变,是因为数字1不是一个可变对象。对象b
是一个列表,长度为1,它的元素是一个列表,可以认为copyd
的元素也没有发生变化,而元素的元素发生了变化。
通常这不符合开发人员本意,通常要使用以下方式(手动复制):
copyd=[list(nums) for j in range(4)]
修改操作:
操作 | 描述 |
---|---|
s[i]=x | 赋值 |
s[i:j [,stride] ]=r | 切片赋值,r 必须是一个序列 |
del s[i] | 删除 |
del s[i:j [,stride]] | 删除切片 |
a=[0,1,2,3,4]
# 请注意以下两种操作的区别
a[0]=[0,0,0]
print(a) # [[0, 0, 0], 1, 2, 3, 4]
a[0:1]=[0,0,0]
print(a) # [0, 0, 0, 1, 2, 3, 4]
当切片赋值时,会根据右侧序列的的元素插入序列中。
序列支持比较操作(>,<,>=,<=,==,!=
):
他们的比较方式是遍历按元素比较。类似于字符串比较的方式。
4.3 字符串格式化
s % d
可生成格式化的字符串。其中s
是一个格式字符串,d
是一个对象元组或映射对象(字典)。
请注意转换字符的类型也是以%
开头,如Her name is %s % ('Lucy')
d={
"name":"lucy",
"age":18
}
print("Her name is %(name)s" % d )
name='Lily'
print("Her name is %(name)s" % vars())
vars()
会返回当前定义的变量
4.4 高级字符串格式化
高级字符串就是使用s.format(* args,**kwargs)
方法。用法非常多,主要的形式举例说明.
d={
"name":"lucy",
"age":18
}
e_dict={
"name":"tom",
"age":18
}
# 1 按照参数顺序对应
s="{0}{1}{2}".format(1,2,3)
print(s)
# 2 按照字典的key对应
s="name is {name}".format(name='lucy')
print(s)
# 3 按照参数顺序对应一个字典对象
s="name is {0[name]} , {1[name]}".format(d,e_dict)
print(s)
# 4 根据参数顺序对应一个序列,然后根据序号索引
s="name is {0[1]}".format(["Lily","Lucy"])
4.4 字典操作
字典dict
支持的操作如下:
操作 | 描述 |
---|---|
x=d[key] | 索引 |
d[key]=x | 赋值 |
del d[key] | 删除 |
key in d | 某键是否在字典中 |
len(d) |
d={}
d[1,2,3]="foo" # 1,2,3 就是元组
print(d)
>>
{(1, 2, 3): 'foo'}
4.5 集合操作
set
与frozenset
支持大量常见集合操作:
操作 | 描述 |
---|---|
s | t | 并集 |
s & t | 交集 |
s-t | 差集 |
s^t | 对称差集 |
len(s) | |
max(s) | |
min(s) |
s | t
:结果与s
具有相同的类型。
4.6 增量赋值
万恶的缩写:
操作 | 描述 |
---|---|
x += y | x = x + y |
x -= y | x = x - y |
x *= y | x =x * y |
x /= y | x =x / y |
x //= y | x =x // y |
x **= y | x =x ** y |
x %= y | x =x % y |
x &= y | x =x & y |
x |= y | x = x | y |
x ^= y | x =x ^ y |
x >>= y | x = x >> y |
x <<= y | x =x << y |
注意:增量赋值不回违反可变性,也不会原地修改对象。x+y
是创建一个新的对象。
4.7 属性(.)运算
访问对象的属性:
print(foo.x)
4.8 函数调用()运算符
import functools
def foo(x,y,z):
return x+y+z
f=functools.partial(foo,1,2)
print(f(3))
>>
6
4.9 转换函数
函数 | 描述 |
---|---|
in(x[,base]) | 将x 转换为一个整数,base 指x 的进制 |
float(x) | |
Complex(real[,imag]) | 创建一个复数 |
str(x) | 对象的字符串表示 |
repr(x) | 对象的表达式字符串 |
format(x[,format_spec]) | 对象的格式化字符串 |
eval(str) | 字符串转化为对象 |
tuple(s) | s转化成元组 |
list(s) | |
set(s) | |
dict(d) | |
frozenset(s) | |
chr(x) | 转化成字符 |
ord(x) | 字符转化成整数值 |
hex(x) | 整数转化成16进制字符串 |
bin(x) | |
oct(x) |
4.10 bool表达式与真值
运算符 | 描述 |
---|---|
x or y | |
x and y | |
not x |
python不用|,&
等构建布尔表达式。
4.11 对象等同性与标识
python中表达对象是否相同有不同的含义:
x==y
,它用于判断对象的值是否相等(equal
)x is y
,x is not y
,它用于判断是否内存中同一个对象。
4.12 简化条件表达式
values=[1,11,25,23,17,2,3,4,5,6,7,8,9]
new_values=[x if x<10 else 10 for x in values]
print(new_values)
>>
[1, 10, 10, 10, 10, 2, 3, 4, 5, 6, 7, 8, 9]
x=9
if x>10:
y=10
else :
y=x
z=10 if x>10 else x
print(y==z)
>>
True