《Python参考手册》4 运算符与表达式

文章目录

    • 4.0
    • 4.1 数值操作
    • 4.2 序列操作
    • 4.3 字符串格式化
    • 4.4 高级字符串格式化
    • 4.4 字典操作
    • 4.5 集合操作
    • 4.6 增量赋值
    • 4.7 属性(.)运算
    • 4.8 函数调用()运算符
    • 4.9 转换函数
    • 4.10 bool表达式与真值
    • 4.11 对象等同性与标识
    • 4.12 简化条件表达式

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} 10n的倍数,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 集合操作

setfrozenset支持大量常见集合操作:

操作 描述
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转换为一个整数,basex的进制
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

你可能感兴趣的:(python)