Task1
一、 变量、运算符与数据类型
1、注释
(1)单行注释:在 Python 中,# 表示注释,作用于整行。
(2)多行注释:用’’’ ‘’’ 或者 “”" “”" 表示区间注释,在三引号之间的所有内
容被注释。
2、 运算符
(1)算术运算符:加 减 乘 除 整除(//)取余(%)幂(**)
(2)比较运算符:大于(>) 小于(<) 大于等于(>=)
小于等于 (<=) 等于(==) 不等于(!=)
(3)逻辑运算符 与(and) 或(or) 非(not)
(4)位运算符:按位取反(~) 按位与(&) 按位或(|)
按位异或(^) 左移 (<<) 右移(>>)
(5)三元运算符:
if x < y:
small = x
else:
small = y
等价于:
small = x if x < y else y
(6)其他运算符:存在(in) 不存在(not in)
是 (is) 不是(is not)
is, is not 对比的是两个变量的内存地址
==, != 对比的是两个变量的值
若比较的两个变量,指向的都是地址不可变的类型(str等),
那么is,is not 和 ==,!= 是完全等价的。
对比的两个变量,指向的是地址可变的类型(list,dict,tuple
等),则两者是有区别的。
【字典(dict)是python中唯一的一个映射类型.他是以{ }括起来的键值对组成. 在dict中key是 唯一的. 在保存的时候, 根据key来计算出一个内存地址. 然后将key-value保存在这个地址中. 这种算法被称为hash算法】
【(tuple)元祖就是不可变的列表
元祖用()表示,元素与元素之间用逗号隔开,数据类型没有限制】
运算符的优先级:一元运算符优于二元运算符。先算术运算,后移位运算,最后位运算。逻辑运算最后结合。
3、 变量和赋值
在使用变量之前,需要对其先赋值。
变量名可以包括字母、数字、下划线、但变量名不能以数字开头。
Python 变量名是大小写敏感的,foo != Foo。
4、数据类型与转换
整型(int):即整数
浮点型(float):带小数
布尔型(bool):true/false
【bin(a)即二进制表示的a】
有时候我们想保留浮点型的小数点后 n 位。可以用 decimal 包里的 Decimal 对象和getcontext() 方法来实现。引进方式如下:
import decimal
from decimal import Decimal
使用如下:
b = Decimal(1) / Decimal(3)
print(b)
# 0.3333333333333333333333333333
Python 里面有很多用途广泛的包 (package),用什么你就引进 (import) 什么。包也是对象,也可以用上面提到的dir(decimal) 来看其属性和方法。
布尔 (boolean) 型变量只能取两个值,True 和 False。当把布尔型变量用在数字运算中,用1 和 0 代表 True 和 False。除了直接给变量赋值 True 和 False,还可以用 bool(X) 来创建变量,其中 X 可以是基本类型:整型、浮点型、布尔型; 容器类型:字符串、元组、列表、字典和集合。具体如下:
(1)bool 作用在基本类型变量:X 只要不是整型 0、浮点型 0.0,bool(X) 就是True,其余就是 False。
(2)bool 作用在容器类型变量:X 只要不是空的变量,bool(X) 就是 True,其余就是 False。
获取类型信息方式:
(1)type(object) 获取类型信息
(2)isinstance(object, classinfo) 判断一个对象是否是一个已知的类型。
【注:type() 不会认为子类是一种父类类型,不考虑继承关系。isinstance() 会认为子类是一种父类类型,考虑继承关系。】
类型转换:
转换为整型 int(x, base=10)
转换为字符串 str(object=’’)
转换为浮点型 float(x)
5、print() 函数
结构:print(*objects, sep=’ ‘, end=’\n’, file=sys.stdout, flush=False)
特点如下:
(1)将对象以字符串表示的方式格式化输出到流文件对象file里。其中所有非关键字参数都按str()方式进行转换为字符串输出;
(2)关键字参数sep是实现分隔符,比如多个参数输出时想要输出中间的分隔字符;
(3)关键字参数end是输出结束时的字符,默认是换行符\n;
(4)关键字参数file是定义流输出的文件,可以是标准的系统输出sys.stdout,也可以重定义为别的文件;
(5)关键字参数flush是立即把内容输出到流文件,不作缓存。
练习题
1、(1)单行注释:在 Python 中,# 表示注释,作用于整行。
(2)多行注释:用’’’ ‘’’ 或者 “”" “”" 表示区间注释,在三引号之间的所有内容被注释
2、运算符:算术运算符、比较运算符、逻辑运算符、位运算符、三元运算符、其他运算符(in,is之类)
优先级:一元运算符优于二元运算符。先算术运算,后移位运算,最后位运算。逻辑运算最后结合。
3、is, is not 对比的是两个变量的内存地址;
==, != 对比的是两个变量的值;
如果比较的两个变量,指向的都是地址不可变的类型(str等),那么is,is not 和 ==,!= 是完全等价的。
如果对比的两个变量,指向的是地址可变的类型(list,dict等),则两者是有区别的。
4、整型 (int)、浮点型(float)、布尔型(bool)
类型转换:转换为整型 int(x, base=10);转换为字符串 str(object=’’);转换为浮点型 float(x)
二、位运算
1、 原码、反码和补码
二进制有三种不同的表示形式:原码、反码和补码,计算机内部使用补码来表示。最高位为符号位,0表示正数,1表示负数。在位运算中符号位也参与运算。
- 原码:就是其二进制表示(注意,最高位是符号位)。
- 反码:正数的反码就是原码,负数的反码是符号位不变,其余位取反(对应正数按位取反)。
- 补码:正数的补码就是原码,负数的补码是反码+1。
2、 按位非操作(~)
把num的补码中的 0 和 1 全部取反(0 变为 1,1 变为 0)。
3.、按位与操作 (&)
只有两个对应位都为 1 时才为 1。
4、 按位或操作 (|)
只要两个对应位中有一个 1 时就为 1。
5、按位异或操作 (^)
只有两个对应位不同时才为 1。
异或操作的性质:满足交换律和结合律
A^B =
A^B^A: = A^A^B = B
6、 按位左移操作 (<<)
num << i 将num的二进制表示向左移动i位所得的值。
7、按位右移操作 (>>)
num >> i 将num的二进制表示向右移动i位所得的值。
8、利用位运算实现快速计算
(1)通过 <<,>> 快速计算2的倍数问题。
n << 1 -> 计算 n*2
n >> 1 -> 计算 n/2,负奇数的运算不可用
n << m -> 计算 n*(2^m),即乘以 2 的 m 次方
n >> m -> 计算 n/(2^m),即除以 2 的 m 次方
(2)通过 ^ 快速交换两个整数。
a ^= b
b ^= a
a ^= b
即:
(3)通过 a & (-a) 快速获取a的最后为 1 位置的整数。
00 00 01 01 -> 5
&
11 11 10 11 -> -5
---
00 00 00 01 -> 1
00 00 11 10 -> 14
&
11 11 00 10 -> -14
---
00 00 00 10 -> 2
9、 利用位运算实现整数集合
一个数的二进制表示可以看作是一个集合(0 表示不在集合中,1 表示在集合中)。
比如集合 {1, 3, 4, 8},可以表示成 01 00 01 10 10,即二进制的第1.3.4.8位为1表示在集合中,为0的位不在集合中。
元素与集合的操作:
a | (1<<i) -> 把 i 插入到集合中,即对应位变为1
a & ~(1<<i) -> 把 i 从集合中删除,即对应位变为1
a & (1<<i) -> 判断 i 是否属于该集合(零不属于,非零属于)
【Python中的整型是补码形式存储的。Python中整型是不限制长度的不会超范围溢出。】
【为了获得负数(十进制表示)的补码,需要手动将其和十六进制数0xffffffff进行按位与操作,再交给bin()进行输出,得到的才是负数的补码表示。】
练习题:
代码如下:
class Solution:
public:
def singleNumber(self, nums: List[int]) -> int:
self = 0;
for (int i = 0; i<nums.size(); ++i)
self = self^nums[i];
return self;
————————————————
版权声明:本文为CSDN博主「_kean」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/C1029323236/article/details/86653188