运算符
- 算术运算符
’+‘,’-‘,’*‘,’/‘,’//‘(整除),’%‘(取余),’**‘(幂)
其中,整除是向下整除,即直接取整数位 - 比较运算符
‘>’, ‘<’, ‘>=’, ‘<=’, ‘==’, ‘!=’ - 逻辑运算符
‘and’, ‘or’, ‘not’ - 位运算符 (二进制运算)
‘~’(取反), ‘&’, ‘|’, ‘^’(异或,相异为1), ‘<<’(左移), ‘>>’ - 三元运算符
结合if else来实现
e.g. max = x if x>y else y - 其他运算符
‘in’, ‘not in’, ‘is’, ‘is not’
note: is和is not比较的是两个变量的内存地址,而==和!=比较的是两个变量的值;当两个变量指向不可变类型时,两种运算符完全等价,可变类型则有区别 - 运算符优先级
规则:一元运算符高于二元运算符;先算术运算,再移位运算,最后位运算;逻辑运算最后结合
上述运算符优先级由低到高分别为
(1) or
(2) and
(3) not
(4) in, not in
(5) is, is not
(6) 比较运算符:<, >, <=, >=, !=, ==
(7) |
(8) ^
(9) &
(10) <<, >>
(11) +, -(算术运算符)
(12) *, /, %
(13) +x, -x (正负号)
(14) ~
(15) **
变量
命名规则:可以包括字母、数字、下划线,但不能以数字开头;
变量名大小写敏感
数据类型与转换
python中的数据类型有整型int、浮点型float、布尔型bool
类型转换:转整型int(),转字符串str(),转浮点型float()
布尔型只取True和False,在数值运算中分别以1,0表示
布尔作用在容器型变量中时,只要容器变量不为空,则返回False,否则为True
isinstance(object, classinfo):用于判断一个对象object是否是一个已知的类型calssinfo;
与type()不同,isinstance会考虑继承关系,认为子类是一种父类类型,type()不会
note: Python中万物皆对象,每个对象都有对应的属性和方法,可通过dir()查看属性和方法
print函数
print(*object, sep=’ ‘, end=’\n’, file=sys.stdout, flush=False)
将对象以字符串表示的方式格式化输出到流文件对象file里。其中所有非关键字参数都按str()方式进行转换为字符串输出;
关键字参数sep是实现分隔符,比如多个参数输出时想要输出中间的分隔字符;
关键字参数end是输出结束时的字符,默认是换行符\n;
关键字参数file是定义流输出的文件,可以是标准的系统输出sys.stdout,也可以重定义为别的文件;
关键字参数flush是立即把内容输出到流文件,不作缓存。
位运算
- 原码、反码和补码
原码:二进制的表示形式,最高位为符号位
反码:正数的反码就是原码,负数的反码等于符号位不变,剩余按位取反
补码:计算机内部的表示方式,正数的补码就是原码,负数的补码是反码+1
符号位:0表示正数,1表示负数,在位运算中参与运算
综上,正数的原码=反码=补码,负数的反码+1=补码 - 按位非(~)操作
不考虑符号位,直接取反 - 按位与(&)操作
一个为0即为0 - 按位或(|)操作
一个为1即为1 - 按位异或(^)操作
相异为1,满足交换律和结合律
任何数与0做异或为本身,与本身做异或为0 - 按位左移操作<<
舍掉高位,低位补0 - 按位右移操作>>
舍掉低位,高位补0 - 利用位运算实现快速计算
n>>m = n / (2^m)
n<<m = n * (2^m)
交换两个整数:a^=b, b^=a, a^=b
确定a最后为1 的位置:a&(-a) - 集合运算
a的补集:~a
a∩b:a&b
a∪b:a|b
a-b: a&(~b)
练习题(leetcode-136)
Q: 给定一个非空整数数组,除了某个元素只出现一次外,其余均出现两次,找出这个只出现一次的数,用位运算解决
A: 考虑使用异或操作
一个数与0做异或操作的结果为数本身,一个数与自身做异或操作,结果为0,即0^a=a, a^a=0
res = 0
for num in nums:
res ^= num
return res
时间复杂度O(n),空间复杂度O(1)