Python是一种通用编程语言,在科学计算和机器学习领域有着广泛的应用。
变量、运算符与数据类型
1、注释
-在Python中,‘#’表示注释,作用于整行
-''' '''或者""" """表示区间注释,在三引号之间的所有内容被注释
2、运算符
算术运算符
操作符 | 名称 | 示例
:---:|:---:|:---:
`+` | 加 | `1 + 1`
`-` | 减 | `2 - 1`
`*` | 乘 | `3 * 4`
`/` | 除 | `3 / 4`
`//`| 整除(地板除)| `3 // 4`
`%` | 取余| `3 % 4`
`**`| 幂 | `2 ** 3`
比较运算符
操作符 | 名称 | 示例
:---:|:---:|:---:
`>` |大于| `2 > 1`
`>=`|大于等于| `2 >= 4`
`
`<=`|小于等于| `5 <= 2`
`==`|等于| `3 == 4`
`!=`|不等于| `3 != 5`
逻辑运算符
操作符 | 名称 | 示例
:---:|:---:|:---:
`and`|与| `(3 > 2) and (3 < 5)`
`or` |或| `(1 > 3) or (9 < 2)`
`not`|非| `not (2 > 1)`
位运算符
操作符 | 名称 | 示例
:---:|:---:|:---:
`~` |按位取反|`~4`
`&` |按位与 |`4 & 5`
`|` |按位或 |`4 | 5`
`^` |按位异或|`4 ^ 5`
`<
`>>`|右移 |`4 >> 2`
其他运算符
操作符 | 名称 | 示例
:---:|:---:|:---:
`in`|存在| `'A' in ['A', 'B', 'C']`
`not in`|不存在|`'h' not in ['A', 'B', 'C']`
`is`|是| `"hello" is "hello"`
`not is`|不是|`"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 | 整型 ``| `-876, 10`
float | 浮点型``| `3.149, 11.11`
bool | 布尔型`` | `True, False`
有时候我们想保留浮点型的小数点后n位,可以用decimal包里的Decimal对象和getcontext()来实现(Python里有很多包可以使用,用什么就引进(import)什么,包也是对象,可以通过dir(decimal)来看其属性和方法)
import decimal
from decimal import Decimal
a = decimal.getcontext()
print(a)
布尔型:布尔(boolean)型变量只能取两个值,True和False。当把布尔型变量用在数字运算中,用1和0代表True和False。
print(True + True)# 2
print(True + False)# 1
print(True * False)# 0
除了直接给变量赋值,True和False,还可以用bool(x)来创建变量,其中x可以是
- 基本类型:整型、浮点型、布尔型
- 容器类型:字符串、元组、列表、字典和集合
确定`bool(X)` 的值是 `True` 还是 `False`,就看 `X` 是不是空,空的话就是 `False`,不空的话就是 `True`。
- 对于数值变量,`0`, `0.0` 都可认为是空的。
- 对于容器变量,里面没元素就是空的。
获取类型信息
- 获取类型信息 `type(object)`
- `type()` :不会认为子类是一种父类类型,不考虑继承关系。
- `isinstance()` :会认为子类是一种父类类型,考虑继承关系。
如果要判断两个类型是否相同推荐使用 `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`是立即把内容输出到流文件,不作缓存。
print每次输出结束都用end设置的参数&结尾,并没有默认换行
item与‘another string’两个值之间用sep设置的参数&分割,由于end参数没有设置,因此默认是输出解释后换行,即end参数的默认值为\n。
位运算
1、原码、反码和补码
二进制与三种不同的表示形式:原码、反码和补码,计算机内部使用补码来表示。
原码:就是其二进制表示(要注意:有一位符号位)
反码:正数的反码就是原码。负数的反码是符号位不变,其余位取反(对应正数按位取反)
补码:正数的补码就是原码,负数的补码是反码+1
符号位:最高位为符号位,0表示正数,1表示负数。在位运算中符号位也参与运算
2、按位运算
按位非操作
'''
~1 = 0
~0 = 1
'''
`~` 把`num`的补码中的 0 和 1 全部取反(0 变为 1,1 变为 0)有符号整数的符号位在 `~` 运算中同样会取反。
```python
00 00 01 01 -> 5
~
---
11 11 10 10 -> -6
11 11 10 11 -> -5
~
---
00 00 01 00 -> 4
```
按位与操作&
```python
1 & 1 = 1
1 & 0 = 0
0 & 1 = 0
0 & 0 = 0
```
只有两个对应位都为1时才为1
按位或操作 |
```python
1 | 1 = 1
1 | 0 = 1
0 | 1 = 1
0 | 0 = 0
```
只要两个对应位中有一个 1 时就为 1
```python
00 00 01 01 -> 5
|
00 00 01 10 -> 6
---
00 00 01 11 -> 7
```
按位异或操作 ^
```python
1 ^ 1 = 0
1 ^ 0 = 1
0 ^ 1 = 1
0 ^ 0 = 0
```
只有两个对应位不同时才为 1
```python
00 00 01 01 -> 5
^
00 00 01 10 -> 6
---
00 00 00 11 -> 3
```
异或操作的性质:满足交换律和结合律
```python
A: 00 00 11 00
B: 00 00 01 11
A^B: 00 00 10 11
B^A: 00 00 10 11
A^A: 00 00 00 00
A^0: 00 00 11 00
A^B^A: = A^A^B = B = 00 00 01 11
```
- 按位左移操作 <<
`num << i` 将`num`的二进制表示向左移动`i`位所得的值。
```python
00 00 10 11 -> 11
11 << 3
---
01 01 10 00 -> 88
```
- 按位右移操作 >>
`num >> i` 将`num`的二进制表示向右移动`i`位所得的值。
```python
00 00 10 11 -> 11
11 >> 2
---
00 00 00 10 -> 2
```
3、利用位运算实现快速计算
通过 `<>` 快速计算2的倍数问题。
```python
n << 1 -> 计算 n*2
n >> 1 -> 计算 n/2,负奇数的运算不可用
n << m -> 计算 n*(2^m),即乘以 2 的 m 次方
n >> m -> 计算 n/(2^m),即除以 2 的 m 次方
1 << n -> 2^n
```
通过 `^` 快速交换两个整数。
通过 `^` 快速交换两个整数。
```python
a ^= b
b ^= a
a ^= b
```
通过 `a & (-a)` 快速获取`a`的最后为 1 位置的整数。
```python
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
```
4、利用位运算实现整数集合
一个数的二进制表示可以看作是一个集合(0 表示不在集合中,1 表示在集合中)。
比如集合 `{1, 3, 4, 8}`,可以表示成 `01 00 01 10 10` 而对应的位运算也就可以看作是对集合进行的操作。
元素与集合的操作:
```python
a | (1< 把 i 插入到集合中
a & ~(1< 把 i 从集合中删除
a & (1< 判断 i 是否属于该集合(零不属于,非零属于)
```
集合之间的操作:
```python
a 补 -> ~a
a 交 b -> a & b
a 并 b -> a | b
a 差 b -> a & (~b)
```
注意:整数在内存中是以补码的形式存在的,输出自然也是按照补码输出。
Python中bin一个负数(十进制表示),输出的是它的原码的二进制表示加上个负号,老坑了。
Python中的整型是补码形式存储的
Python中整型是不限制长度的不会超范围溢出的。
因此为了获得负数(十进制表示)的补码,需要手动将其和十六进制数0xffffffff进行按位与操作,再交给bin()进行输出,得到的才是负数的补码表示。
条件语句
1、if语句
```python
if expression:
expr_true_suite
```
- if 语句的 `expr_true_suite` 代码块只有当条件表达式 `expression` 结果为真时才执行,否则将继续执行紧跟在该代码块后面的语句。
- 单个 if 语句中的 `expression` 条件表达式可以通过布尔操作符 `and`,`or`和`not` 实现多重条件判断。
2、if-else语句
```python
if expression:
expr_true_suite
else:
expr_false_suite
```
- Python 提供与 if 搭配使用的 else,如果 if 语句的条件表达式结果布尔值为假,那么程序将执行 else 语句后的代码。
if语句支持嵌套,即在一个if语句中可以嵌入另一个if语句,从而构成不同层次的选择结构。
3、if-elis-else语句
```python
if expression1:
expr1_true_suite
elif expression2:
expr2_true_suite
.
.
elif expressionN:
exprN_true_suite
else:
expr_false_suite
```
- elif 语句即为 else if,用来检查多个表达式是否为真,并在为真时执行特定代码块中的代码。
4、assert关键词
assert这个关键词我们称其为‘断言’,当这个关键词后边的条件为False时,程序自动崩溃并抛出AssertionError的异常
循环语句
1、while循环
`while`语句最基本的形式包括一个位于顶部的布尔表达式,一个或多个属于`while`代码块的缩进语句。
```python
while 布尔表达式:
代码块
```
`while`循环的代码块会一直循环执行,直到布尔表达式的值为布尔假。
如果布尔表达式不带有`、==、!=、in、not in`等运算符,仅仅给出数值之类的条件,也是可以的。当`while`后写入一个非零整数时,视为真值,执行循环体;写入`0`时,视为假值,不执行循环体。也可以写入`str、list`或任何序列,长度非零则视为真值,执行循环体;否则视为假值,不执行循环体。
2、while - else 循环
```python
while 布尔表达式:
代码块
else:
代码块
```
当`while`循环正常执行完的情况下,执行`else`输出,如果`while`循环中执行了跳出循环的语句,比如 `break`,将不执行`else`代码块的内容。
3、for循环
`for`循环是迭代循环,在Python中相当于一个通用的序列迭代器,可以遍历任何有序序列,如`str、list、tuple`等,也可以遍历任何可迭代对象,如`dict`。
```python
for 迭代变量 in 可迭代对象:
代码块
```
每次循环,迭代变量被设置为可迭代对象的当前元素,提供给代码块使用。
4、for - else 循环
```python
for 迭代变量 in 可迭代对象:
代码块
else:
代码块
```
当`for`循环正常执行完的情况下,执行`else`输出,如果`for`循环中执行了跳出循环的语句,比如 `break`,将不执行`else`代码块的内容,与`while - else`语句一样。
5、range()函数
```python
range([start,] stop[, step=1])
```
- 这个BIF(Built-in functions)有三个参数,其中用中括号括起来的两个表示这两个参数是可选的。
- `step=1` 表示第三个参数的默认值是1。
- `range` 这个BIF的作用是生成一个从`start`参数的值开始到`stop`参数的值结束的数字序列,该序列包含`start`的值但不包含`stop`的值。
6、enumerate()函数
```python
enumerate(sequence, [start=0])
```
- sequence:一个序列、迭代器或其他支持迭代对象。
- start:下标起始位置。
- 返回 enumerate(枚举) 对象
`enumerate()`与 for 循环的结合使用。
```python
for i, a in enumerate(A)
do something with a
```
用 `enumerate(A)` 不仅返回了 `A` 中的元素,还顺便给该元素一个索引值 (默认从 0 开始)。此外,用 `enumerate(A, j)` 还可以确定索引起始值为 `j`。
7、break语句
break语句可以跳出当前所在层的循环
8、continue语句
continue终止本轮循环并开始下一轮循环
9、pass语句
`pass` 语句的意思是“不做任何事”,如果你在需要有语句的地方不写任何语句,那么解释器会提示出错,而 `pass` 语句就是用来解决这些问题的。
【例子】
```python
def a_func():
# SyntaxError: unexpected EOF while parsing
```
【例子】
```python
def a_func():
pass
```
`pass`是空语句,不做任何操作,只起到占位的作用,其作用是为了保持程序结构的完整性。尽管`pass`语句不做任何操作,但如果暂时不确定要在一个位置放上什么样的代码,可以先放置一个`pass`语句,让代码可以正常运行。
10、推导式
**列表推导式**
```python
[ expr for value in collection [if condition] ]
```
x = [-4, -2, 0, 2, 4]
y = [a * 2 for a in x]
print(y)
# [-8, -4, 0, 4, 8]
x = [(i, i ** 2) for i in range(6)]
print(x)
# [(0, 0), (1, 1), (2, 4), (3, 9), (4, 16), (5, 25)]
**元组推导式**
```python
( expr for value in collection [if condition] )
```
a = (x for x in range(10))
print(a)
# at 0x0000025BE511CC48>
print(tuple(a))
# (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
**字典推导式**
```python
{ key_expr: value_expr for value in collection [if condition] }
```
b = {i: i % 2 == 0 for i in range(10) if i % 3 == 0}
print(b)
# {0: True, 3: False, 6: True, 9: False}
**集合推导式**
```
{ expr for value in collection [if condition] }
```
c = {i for i in [1, 2, 3, 4, 5, 5, 6, 4, 3, 2, 1]}
print(c)
# {1, 2, 3, 4, 5, 6}
**其它**
- `next(iterator[, default])` Return the next item from the iterator. If default is given and the iterator is exhausted, it is returned instead of raising StopIteration.
e = (i for i in range(10))
print(e)
# at 0x0000007A0B8D01B0>
print(next(e)) # 0
print(next(e)) # 1
for each in e:
print(each, end=' ')
# 2 3 4 5 6 7 8 9
异常处理
异常就是运行期检测到的错误。计算机语言针对可能出现的错误定义了异常类型,某种错误引发对应的异常时,异常处理程序将被启动,从而恢复程序的正常运行。
1. Python 标准异常总结
- BaseException:所有异常的 **基类**
- Exception:常规异常的 **基类**
- StandardError:所有的内建标准异常的基类
- ArithmeticError:所有数值计算异常的基类
- FloatingPointError:浮点计算异常
- OverflowError:数值运算超出最大限制
- ZeroDivisionError:除数为零
- AssertionError:断言语句(assert)失败
- AttributeError:尝试访问未知的对象属性
- EOFError:没有内建输入,到达EOF标记
- EnvironmentError:操作系统异常的基类
- IOError:输入/输出操作失败
- OSError:操作系统产生的异常(例如打开一个不存在的文件)
- WindowsError:系统调用失败
- ImportError:导入模块失败的时候
- KeyboardInterrupt:用户中断执行
- LookupError:无效数据查询的基类
- IndexError:索引超出序列的范围
- KeyError:字典中查找一个不存在的关键字
- MemoryError:内存溢出(可通过删除对象释放内存)
- NameError:尝试访问一个不存在的变量
- UnboundLocalError:访问未初始化的本地变量
- ReferenceError:弱引用试图访问已经垃圾回收了的对象
- RuntimeError:一般的运行时异常
- NotImplementedError:尚未实现的方法
- SyntaxError:语法错误导致的异常
- IndentationError:缩进错误导致的异常
- TabError:Tab和空格混用
- SystemError:一般的解释器系统异常
- TypeError:不同类型间的无效操作
- ValueError:传入无效的参数
- UnicodeError:Unicode相关的异常
- UnicodeDecodeError:Unicode解码时的异常
- UnicodeEncodeError:Unicode编码错误导致的异常
- UnicodeTranslateError:Unicode转换错误导致的异常
2、Python标准警告总结
- Warning:警告的基类
- DeprecationWarning:关于被弃用的特征的警告
- FutureWarning:关于构造将来语义会有改变的警告
- UserWarning:用户代码生成的警告
- PendingDeprecationWarning:关于特性将会被废弃的警告
- RuntimeWarning:可疑的运行时行为(runtime behavior)的警告
- SyntaxWarning:可疑语法的警告
- ImportWarning:用于在导入模块过程中触发的警告
- UnicodeWarning:与Unicode相关的警告
- BytesWarning:与字节或字节码相关的警告
- ResourceWarning:与资源使用相关的警告
3、try - except语句
```python
try:
检测范围
except Exception[as reason]:
出现异常后的处理代码
```
try 语句按照如下方式工作:
- 首先,执行`try`子句(在关键字`try`和关键字`except`之间的语句)
- 如果没有异常发生,忽略`except`子句,`try`子句执行后结束。
- 如果在执行`try`子句的过程中发生了异常,那么`try`子句余下的部分将被忽略。如果异常的类型和`except`之后的名称相符,那么对应的`except`子句将被执行。最后执行`try - except`语句之后的代码。
- 如果一个异常没有与任何的`except`匹配,那么这个异常将会传递给上层的`try`中。
4、try - except - finally 语句
try:
检测范围
except Exception[as reason]:
出现异常后的处理代码
finally:
无论如何都会被执行的代码
不管`try`子句里面有没有发生异常,`finally`子句都会执行。
5、try - except - else语句
如果在`try`子句执行时没有发生异常,Python将执行`else`语句后的语句。
```python
try:
检测范围
except:
出现异常后的处理代码
else:
如果没有异常执行这块代码
```
使用`except`而不带任何异常类型,这不是一个很好的方式,我们不能通过该程序识别出具体的异常信息,因为它捕获所有的异常。
try:
检测范围
except(Exception1[, Exception2[,...ExceptionN]]]):
发生以上多个异常中的一个,执行这块代码
else:
如果没有异常执行这块代码
6、raise 语句
Python使用raise语句抛出一个指定的异常
try:
raise NameError('HiThere')
except NameError:
print('An exception flew by!')
# An exception flew by!