以下内容是Python内置的运算符、表达式和求值规则。
所有数值操作都支持:
操作 | 描述 | 底层 |
---|---|---|
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
序列类型(字符串,列表,元组)都支持以下操作:
操作 | 描述 |
---|---|
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]
当切片赋值时,会根据右侧序列的的元素插入序列中。
序列支持比较操作(>,<,>=,<=,==,!=
):
他们的比较方式是遍历按元素比较。类似于字符串比较的方式。
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()
会返回当前定义的变量
高级字符串就是使用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"])
字典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'}
set
与frozenset
支持大量常见集合操作:
操作 | 描述 |
---|---|
s | t |
并集 |
s & t |
交集 |
s-t |
差集 |
s^t |
对称差集 |
len(s) |
|
max(s) |
|
min(s) |
s | t
:结果与s
具有相同的类型。
万恶的缩写:
操作 | 描述 |
---|---|
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
是创建一个新的对象。
访问对象的属性:
print(foo.x)
import functools
def foo(x,y,z):
return x+y+z
f=functools.partial(foo,1,2)
print(f(3))
>>
6
函数 | 描述 |
---|---|
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) |
运算符 | 描述 |
---|---|
x or y |
|
x and y |
|
not x |
python不用|,&
等构建布尔表达式。
python中表达对象是否相同有不同的含义:
x==y
,它用于判断对象的值是否相等(equal
)x is y
,x is not y
,它用于判断是否内存中同一个对象。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