变量、运算符与数据类型,位运算
一、注释
- 单行注释:#
- 多行注释(区间注释):’’’+’’’ 或 “”"+"""
#单行注释
‘’’
多行注释
行注释
多行注释
‘’’
“”"
多行注释
多行注释
多行注释
“”"
二、运算符
1.算术运算符
操作符 | 名称 |
---|---|
+ | 加 |
- | 减 |
* | 乘 |
/ | 除 |
// | 整除 |
% | 取余 |
** | 幂 |
补充:与C、C++等不同的是,Python中的除/总是返回一个浮点型。
示例:
2.比较运算符
操作符 | 名称 |
---|---|
> | 大于 |
< | 小于 |
== | 等于 |
!= | 不等于 |
>= | 大于等于 |
<= | 小于等于 |
示例:
3.逻辑运算符
名称 | 操作符 |
---|---|
与 | and |
或 | or |
非 | not |
示例:
4.位运算符
(1).操作符
名称 | 操作符 |
---|---|
按位取反 | ~ |
按位与 | & |
按位或 | | |
按位异或 | ^ |
左移 | << |
右移 | >> |
示例:
负数的补码:手动将其和十六进制数0xffffffff进行按位与操作,再交给bin()进行输出
(2).位运算
二进制数有三种表示形式:原码、反码、补码。
二进制数在计算机中是以补码的形式储存的。
所有位运算都是针对补码进行操作的。
原码:即二进制表示。
5 -> 0000 0101
负数的反码:符号位(即最高位)不变,其余各位取反。
正数:原码=反码=补码
负数:补码=反码+1
补码:
5原码: 0000 0101
补码、反码:0000 0101
-2原码:1000 0010
反码:1111 1101
补码:1111 1110
按位取反:对补码进行取反,包括符号位,各位取反。
正数按位取反后为负数,因此要对该补码-1得到反码,再取其原码。
负数按位取反后为正数,因此该补码即其按位取反后的原码。
按位取反可总结为: ~x= -(x+1)
例: 5 原码: 0000 0101
反码、补码: 0000 0101
按位取反:1111 1010
求其原码:
对上一步-1:1111 1001
取其反码 : 1000 0110
所以得到5按位取反后的原码为:1000 0110 -> -6
-2 原码 : 1000 0010
取其反码:1111 1101
取其补码:1111 1110
按位取反:0000 0001
求其原码:0000 0001(正数补码=反码)
所以得到-2按位取反后的原码为:0000 0001 -> 1
按位与:各位进行and操作,同为1则为1,其余均为0.
1&1=1
1&0=0
0&1=0
0&0=0
5 -> 0000 0101
6-> 0000 0110
5&6 -> 0000 0100
按位或:各位进行or操作,只要有一个1则为1,否则为0.
1 | 1=1
1 | 0=1
0 | 1=1
0 | 0=0
按位异或:各位相同则为0,不同则为1
1^1=0
0^0=0
1^0=1
0^1=1
4 -> 0000 0100
5 -> 0000 0101
4^5 -> 0000 0001
通过^可快速交换两个整数a,b:
a=a^b
b=b^a
a=a^b
左移:将二进制左移x位,低位补0。
右移:将二进制右移x位。
2n可用左移快速计算:n << 1
n/2可用右移快速计算:n >> 1 (负奇数不可用)
推广:
n乘以2的m次方: n << m
n除以2的m次方:n >> m
2的k次方:1 << k (令n=1,m=k)
示例:LeetCode 136.只出现一次的数字
运用位运算中的异或操作^
任意非零的数与0进行异或操作均为其自身,而任意相同的两个数的异或运算均为0。因此可根据异或^的两个特性,得到只出现一次的数。
class Solution:
def singleNumber(self,nums:List[int]) -> int:
t=0
for i in nums:
t ^= i
return t
5.成员运算符、身份运算符
操作符 | 名称 |
---|---|
in | 存在 |
not in | 不存在 |
is | 是 |
is not | 不是 |
示例:
word=[‘a’,‘b’,‘c’]
if ‘a’ in word:print(‘a’+’ exists’)
if ‘d’ not in word:print(‘d’+’ not exists’)
#a exists
#d not exists
a,b=2,2
print(a is b,a== b)
#True True
print(a is not b,a!=b)
#False False
a,b=‘word’,‘word’
print(a is b,a== b)
#True True
a,b=[‘word’],[‘word’]
print(a is b,a==b)
#False True
补充:is,not is 比较的是内存地址,==,!=比较的是值
6.运算符优先级
总体遵循以下规则:
一元运算符 > 二元运算符
算术运算符 > 移位运算符 > 位运算符
比较运算符 > 逻辑运算符
具体:
指数**有最高优先级。
二元运算符中乘、除、整除、取余高于加、减。
比较运算符:not> and>or
逻辑运算符:&>^>|
2**3+1 = 8+1 = 9
9>>1+2&5 = 9>>3&5 = 1&5 = 1
2>1 and 2==3 等价于 True and False 等价于 False
print(1 or 0 and 0)
#True
print(bin(4|5&6^7))
#0b111
三、数据类型与转换
类型 | 名称 |
---|---|
int | 整型 |
float | 浮点型 |
bool | 布尔型 |
complex | 复数型 |
补充:
python3以上整型没有大小限制。
复数表示为 a+ib=complex(a,b),其中实部和虚部都是浮点型。
布尔型bool()只有当数值变量为0、0.0或容器变量为空时返回False,其余返回True
int(x):将x转换为整型
float(x):将x转换为浮点型
bool(x):将x转换为布尔型
complex(x):将x转换为一个实部为x,虚部为0的复数
complex(x,y):将x,y转换为一个实部为x,虚部为y的复数
str(x):将x转换为字符串
四、输出print()
print(*objects, sep=’ ‘, end=’\n’, file=sys.stdout, flush=False)
print()可将对象以字符串的形式输出到流文件对象file里。
‘sep’ :分隔符,将多个输出参数进行分隔。
‘end’ :结束字符,默认是换行符’\n’。
‘file’ :定义输出的文件,可以是标准的系统输出sys.stdout,也可以重定义为别的文件。
‘flush’:是否立即把内容输出到流文件,不作缓存。