一.变量、运算符与数据类型
1.注释
在 Python 中,#表示注释,作用于整行。
''' '''或者 """ """表示区间注释,在三引号之间的所有内容被注释。
2.运算符
~运算中,4的二进制表达式为:0000 0000 0000 0000 0000 0000 0000 0100执行~运算,即~4后:1111 1111 1111 1111 1111 1111 1111 1011,即结果为-5。本例子中的1111 1111 1111 1111 1111 1111 1111 1011其符号为是1,表明它是负数,欲求其源码,需要先对其取反再加1:0000 0000 0000 0000 0000 0000 0000 0100+1=0000 0000 0000 0000 0000 0000 0000 0000 0101,然后在得到的源码前加一个负号,即可得到-5的结果。
逻辑运算符:
and 与 or 或 not 非
例子:
print((3 > 2) and (3 < 5))
print((1 > 3) or (9 < 2))
print(not (2 > 1))
结果:
其他运算符:
in 与 not in 是用来作为逻辑判断的一种方式。in 右侧的内容里,是否包含了左侧的内容。 包含返回真,不包含返回假。not in 右侧的内容里是否不包含左侧的内容。不包含返回真,包含返回假。in 与 not in 可以放在任何允许添加条件判断的位置。
is和is not比较的是两个变量的内存地址,而==和!=比较的是两个变量的值。
注:在比较的两个变量指向的地址都是不可变(数字、字符串、元组、不可变集合)的情况下,两组比较符号是完全等价的。对比的两个变量,指向的是地址可变的类型(列表、字典、可变集合),则两者是有区别的。
运算符的优先级:
- 一元运算符优于二元运算符。例如
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。
学习中遇到的pop()函数是获取并删除指定位置元素,再次输出之后的结果如下:
set是一个无序且不重复的元素集合。集合对象是一组无序排列的可哈希的值,集合成员可以做字典中的键。集合支持用in和not in操作符检查成员,由len()内建函数得到集合的基数(大小), 用 for 循环迭代集合的成员。但是因为集合本身是无序的,所以导致pop()函数每次所获得的元素不同。
4.数据类型和转换
Python 里面万物皆对象(object),整型也不例外,只要是对象,就有相应的属性 (attributes) 和方法(methods)。可以用dir()来查看属性和方法。
保留浮点型的小数点后面n位,可以用decimal包里的Decimal对象和getContext()方法来实现。(使用之前记得引入decimal包,不然程序会报错。Python 里面有很多用途广泛的包 (package),用什么你就引进 (import) 什么。)使用getContext().prec来调整数字的精度。
布尔 (boolean) 型变量只能取两个值,True和False。当把布尔型变量用在数字运算中,用1和0代表True和False。
除了直接给变量赋值 True 和 False,还可以用 bool(X) 来创建变量,其中 X 可以是
- 基本类型:整型、浮点型、布尔型
- 容器类型:字符串、元组、列表、字典和集合
bool作用在基本类型变量:X只要不是整型0、浮点型0.0,bool(X)就是True,其余就是False。bool作用在容器类型变量:X只要不是空的变量,bool(X)就是True,其余就是False。确定bool(X) 的值是True还是False,就看X是不是空,空的话就是False,不空的话就是True。
- 对于数值变量,0, 0.0 都可认为是空的。
- 对于容器变量,里面没元素就是空的。
type()和isinstance()可以获得类型信息。type()不会认为子类是一种父类类型,不考虑继承关系;isinstance()会认为子类是一种父类类型,考虑继承关系。如果要判断两个类型是否相同推荐使用isinstance()。
- 转换为整型
int(x, base=10)
- 转换为字符串
str(object='')
- 转换为浮点型
float(x)
5.print()函数
- 将对象以字符串表示的方式格式化输出到流文件对象file里。其中所有非关键字参数都按
str()
方式进行转换为字符串输出; - 关键字参数
sep
是实现分隔符,比如多个参数输出时想要输出中间的分隔字符; - 关键字参数
end
是输出结束时的字符,默认是换行符n
; - 关键字参数
file
是定义流输出的文件,可以是标准的系统输出sys.stdout
,也可以重定义为别的文件; - 关键字参数
flush
是立即把内容输出到流文件,不作缓存。 - 没有参数时,每次输出后都会换行。每次输出结束都用
end
设置的参数&
结尾,并没有默认换行。item
值与'another string'
两个值之间用sep
设置的参数&
分割。由于end
参数没有设置,因此默认是输出解释后换行,即end
参数的默认值为n
。
二.位运算
1.原码、反码和补码
二进制有三种不同的表示形式:原码、反码和补码,计算机内部使用补码来表示。原码:就是其二进制表示(注意,有一位符号位)。反码:正数的反码就是原码,负数的反码是符号位不变,其余位取反(对应正数按位取反)。补码:正数的补码就是原码,负数的补码是反码+1。符号位:最高位为符号位,0表示正数,1表示负数。在位运算中符号位也参与运算。
例:-3的原码:10 00 00 11 反码:11 11 11 00 补码:11 11 11 01
2.按位运算
按位非操作:~4=-5 ~把num的补码中的 0 和 1 全部取反(0 变为 1,1 变为 0)有符号整数的符号位在~运算中同样取反。
按位与运算:1&1=1 1&0=0 0&0=0 只有两个对应位都为 1 时才为 1
按位或操作:1|1=1 1|0=1 0|0=0 有一个对应位都为 1 时就为 1
按位异或操作:1^1=0 1^0=1 0^0=0 只有两个对应位不同是才为1(性质:满足交换律和结合律)
按位左移右移操作:
00 00 00 11->3 3<<2 00 00 11 00->12
00 00 10 11->11 11>>2 00 00 00 10->2
3.利用位运算实现快速计算
可以使用<<,>>快速计算2的倍数问题。
n << m -> 计算 n*(2^m),即乘以 2 的 m 次方
n >> m -> 计算 n/(2^m),即除以 2 的 m 次方
三.条件语句
1.if语句
if 语句的expr_true_suite代码块只有当条件表达式exepression结果为真时才执行,否则将继续执行紧跟在该代码块后面的语句。单个 if 语句中的exepression条件表达式可以通过布尔操作符and,or和not实现多重条件判断。
2.if-else语句
Python 提供与 if 搭配使用的 else,如果 if 语句的条件表达式结果布尔值为假,那么程序将执行 else 语句后的代码。if语句支持嵌套,即在一个if语句中嵌入另一个if语句,从而构成不同层次的选择结构。Python 使用缩进而不是大括号来标记代码块边界,因此要特别注意else的悬挂问题。
3.if-elif-else语句
elif 语句即为 else if,用来检查多个表达式是否为真,并在为真时执行特定代码块中的代码。
4.assert关键词
assert这个关键词我们称之为“断言”,当这个关键词后边的条件为 False 时,程序自动崩溃并抛出AssertionError的异常。在进行单元测试时,可以用来在程序中置入检查点,只有条件为 True 才能让程序正常工作。
代码如下是报错:
将pop()函数注释掉就不会报错:
四.循环语句
1.range()函数
range(x,y)函数从x参数的值开始到y参数的值结束的数字序列,序列包括x的值但不包含y的值。
2.enumerate()函数
enumerate(sequence, [start=0])
- sequence:一个序列、迭代器或其他支持迭代对象。
- start:下标起始位置。
- 返回 enumerate(枚举) 对象
enumerate()
与 for 循环的结合使用。用enumerate(A)
不仅返回了A
中的元素,还顺便给该元素一个索引值 (默认从 0 开始)。此外,用enumerate(A, j)
还可以确定索引起始值为j
3.break、continue语句
break语句可以跳出当前所在层的循环。continue终止本轮循环并开始下一轮循环。
4.pass语句
pass语句的意思是“不做任何事”,如果你在需要有语句的地方不写任何语句,那么解释器会提示出错,而pass语句就是用来解决这些问题的。pass是空语句,不做任何操作,只起到占位的作用,其作用是为了保持程序结构的完整性。尽管pass语句不做任何操作,但如果暂时不确定要在一个位置放上什么样的代码,可以先放置一个pass语句,让代码可以正常运行。
5.推导式
列表推导式 [ expr for value in collection [if
元组推导式 ( expr for value in collection [if
字典推导式 { key_expr: value_expr for value in collection [if
集合推导式 { expr for value in collection [if condition] }
五.异常处理
1. Python 标准异常总结
异常就是运行期检测到的错误。计算机语言针对可能出现的错误定义了异常类型,某种错误引发对应的异常时,异常处理程序将被启动,从而恢复程序的正常运行。
异常体系中部分关系如下:
2.try-expect语句
try:
检测范围except Exception[as reason]:
出现异常后的处理代码
- 首先,执行try子句(在关键字try和关键字expect之间的语句)
- 如果没有异常发生,忽略expect子句,try子句执行后结束。
- 如果在执行try子句的过程中发生了异常,那么try子句余下的部分将被忽略。如果异常的类型和expect之后的名称相符,那么对应的expect子句将被执行。最后执行try
-
expect语句之后的代码。 - 如果一个异常没有与任何的expect匹配,那么这个异常将会传递给上层的try中。
一个try
语句可能包含多个except
子句,分别来处理不同的特定的异常。最多只有一个分支会被执行。try-except-else
语句尝试查询不在dict
中的键值对,从而引发了异常。这一异常准确地说应属于KeyError
,但由于KeyError
是LookupError
的子类,且将LookupError
置于KeyError
之前,因此程序优先执行该except
代码块。所以,使用多个except
代码块时,必须坚持对其规范排序,要从最具针对性的异常到最通用的异常。
3.try-expect-finally语句
try: 检测范围 except Exception[as reason]: 出现异常后的处理代码 finally: 无论如何都会被执行的代码
不管try子句里面有没有发生异常,finally子句都会执行。
如果一个异常在try子句里被抛出,而又没有任何的expect把它截住,那么这个异常会在finally子句执行后被抛出。
4.try-expect-else语句
如果在try
子句执行时没有发生异常,Python将执行else
语句后的语句。
try:
检测范围except:
出现异常后的处理代码else:
如果没有异常执行这块代码
使用except
而不带任何异常类型,这不是一个很好的方式,我们不能通过该程序识别出具体的异常信息,因为它捕获所有的异常。try: 检测范围 except(Exception1[, Exception2[,...ExceptionN]]]): 发生以上多个异常中的一个,执行这块代码 else: 如果没有异常执行这块代码。
例子:
注意:else语句的存在必须以expect语句的存在为前提,在没有expect语句的try语句中使用else语句,会引发语法错误。
5.raise语句
python中使用raise语句抛出一个指定异常。