目录
一、变量、运算符与数据类型
1、注释
单行注释:# 表示注释,作用于整行。
多行注释:’’’ ‘’’ 或者 “”" “”" 表示区间注释,在三引号之间的所有内容被注释。
#这是一个注释
print("Hello world")
# Hello world
'''
这是多行注释,用三个单引号
这是多行注释,用三个单引号
'''
print("Hello world")
# Hello world
"""
这是多行注释,用三个双引号
这是多行注释,用三个双引号
"""
print("Hello world")
# Hello world
2、运算符
算数运算符
操作符 | 名称 | 示例 |
---|---|---|
+ | 加 | 1 + 1 |
- | 减 | 2 - 1 |
* | 乘 | 3 * 4 |
/ | 除 | 3 / 4 |
// | 整除 | 3 // 4 |
% | 取余 | 3 % 4 |
** | 幂 | 2 ** 3 |
比较运算符
操作符 | 名称 | 示例 |
---|---|---|
> | 大于 | 2 > 1 |
>= | 大于等于 | 2 >= 1 |
< | 小于 | 1 < 2 |
<= | 小于等于 | 1 <= 2 |
== | 等于 | 3 == 3 |
!= | 不等于 | 3 != 4 |
逻辑运算符
操作符 | 名称 | 示例 |
---|---|---|
and | 与 | 1 and 1 |
or | 或 | 1 or 0 |
not | 非 | not 1 |
位运算符
操作符 | 名称 | 示例 |
---|---|---|
~ | 按位取反 | ~4 |
& | 按位与 | 4 & 5 |
I | 按位或 | 4 I 5 |
^ | 按位异或 | 4 ^ 5 |
<< | 左移 | 4 << 2 |
>> | 右移 | 4 >> 2 |
三元运算符
x,y = 4,5
small = x if x < y else y
print(small) # 4
其他运算符
操作符 | 名称 | 示例 |
---|---|---|
in | 存在 | ‘A’ in [‘A’, ‘B’, ‘C’] |
not in | 不存在 | ‘h’ not in [‘A’, ‘B’, ‘C’] |
is | 是 | “hello” is “hello” |
is not | 不是 | “hello” is not “hello” |
注意:
- is, is not 对比的是两个变量的内存地址
- ==, != 对比的是两个变量的值
- 比较的两个变量,指向的都是地址不可变的类型(str等),那么is,is not 和 ==,!= 是完全等价的。
- 对比的两个变量,指向的是地址可变的类型(list,dict,tuple等),则两者是有区别的。
运算符优先级
- 一元运算符优于二元运算符。例如
3 ** -2
等价于3 ** (-2)
。 - 先算术运算,后移位运算,最后位运算。例如
1 << 3 + 2 & 7
等价于1 << (3 + 2)) & 7
。 - 逻辑运算最后结合。例如
3 < 4 and 4 < 5
等价于(3 < 4) and (4 < 5)
。
3、变量和赋值
- 在使用变量之前,需要对其先赋值。
- 变量名可以包括字母、数字、下划线、但变量名不能以数字开头。
- Python 变量名是大小写敏感的,
foo != Foo
。
4、数据类型与转换
类型 | 名称 | 示例 |
---|---|---|
int | 整型 <class ‘int’> | -876, 10 |
float | 浮点型<class ‘float’> | 3.149, 11.11 |
bool | 布尔型<class ‘bool’> | True, False |
布尔型
除了直接给变量赋值 True
和 False
,还可以用 bool(X)
来创建变量,其中 X
可以是
- 基本类型:整型、浮点型、布尔型
- 容器类型:字符串、元组、列表、字典和集合
确定bool(X)
的值是True
还是 False
,就看X
是不是空,空的话就是 False
,不空的话就是 True
。
- 对于数值变量,0, 0.0 都可认为是空的。
- 对于容器变量,里面没元素就是空的。
获取类型信息
- 获取类型信息
type(object)
,type()
不会认为子类是一种父类类型,不考虑继承关系。 - 获取类型信息
isinstance(object, classinfo)
,isinstance()
会认为子类是一种父类类型,考虑继承关系。
类型转换
- 转换为整型
int(x, base=10)
- 转换为字符串
str(object='')
- 转换为浮点型
float(x)
5、print()函数
print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)
- 将对象以字符串表示的方式格式化输出到流文件对象file里。其中所有非关键字参数都按
str()
方式进行转换为字符串输出; - 关键字参数
sep
是实现分隔符,比如多个参数输出时想要输出中间的分隔字符; - 关键字参数
end
是输出结束时的字符,默认是换行符\n
; - 关键字参数
file
是定义流输出的文件,可以是标准的系统输出sys.stdout
,也可以重定义为别的文件; - 关键字参数
flush
是立即把内容输出到流文件,不作缓存。
练习
1、怎样对python中的代码进行注释?
见1
2、python有哪些运算符,这些运算符的优先级是怎样的?
见2
3、python 中is
, Is not
与 ==
,!=
的区别是什么?
见2
4、python 中包含哪些数据类型?这些数据类型之间如何转换?
见4
二、位运算
1、原码、反码和补码
- 原码:就是其二进制表示(注意,有一位符号位)。
- 反码:正数的反码就是原码,负数的反码是符号位不变,其余位取反(对应正数按位取反)。
- 补码:正数的补码就是原码,负数的补码是反码+1。
- 符号位:最高位为符号位,0表示正数,1表示负数。在位运算中符号位也参与运算。
2、利用位运算实现整数集合
一个数的二进制表示可以看作是一个集合(0 表示不在集合中,1 表示在集合中)。
比如集合 {1, 3, 4, 8}
,可以表示成 0100011010
而对应的位运算也就可以看作是对集合进行的操作。
- 元素与集合的操作:
a | (1<<i) -> 把 i 插入到集合中
a & ~(1<<i) -> 把 i 从集合中删除
a & (1<<i) -> 判断 i 是否属于该集合(零不属于,非零属于)
- 集合之间的操作:
a 补 -> ~a
a 交 b -> a & b
a 并 b -> a | b
a 差 b -> a & (~b)
练习
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。尝试使用位运算解决此题。
'''
Input file
example1: [2,2,1]
example2: [4,1,2,1,2]
Output file
result1: 1
result2: 4
'''
class Solution:
def singleNumber(self, nums:List[int]) -> int:
res = 0
for item in nums:
res = res ^ item
return res