Python 基础
操作符优先级
从上往下,优先级依次提高。官方文档

全局变量的范围覆盖
在函数内部,如果 局部变量 和 全局变量同名,使用的是 局部变量。
如果在函数内部要对全局变量进行重新赋值,需通过 global 声明。
示例
1  | upChars = '零壹贰叁肆伍陆柒捌玖'  | 
局部变量的生命周期
变量 从被创建到被系统回收 的过程,就是其生命周期。
局部变量只有在函数被执行时才会被创建。
函数执行结束后局部变量才会被系统回收。
1  | def file_copy(src_path, dst_path):  | 
函数
常用内置函数
int float str 类型强转。
1  | int(3456.23) # 浮点转整型 返回3456  | 
len 获取数据对象(字符串、列表、元组、字典等)的长度。
函数形参缺省
函数的参数定义,一旦有缺省值后,后面所有的参数必须都有缺省值。
1  | def over_score_students(student_score_list, score=60):  | 
指定参数名调用函数
1  | def func(arg1, arg2=2, arg3='hello'):  | 
调用方式
1  | # 按顺序,常规调用  | 
注意,一旦某个参数指定了参数名,后面所有的参数必须指定参数名
1  | func( 1, arg2=22, 'hello') # 错误的调用方式  | 
函数可变参数
参数名前面加了一个星号。
在调用该函数的时候,Python解释器会创建一个 tuple 赋值给这个参数变量。并且会把 传入的数据对象 放到这个tuple对象里面。
在调用函数的时候,传入参数前面加上星号,是参数展开。
1  | studentInfo = {  | 
关键字可变参数
参数个数不确定,除了上面这种定义的方式,还有另外一种定义方式,叫做关键字可变参数。
1  | def addStudents(table,**students):  | 
这种前面加2个星号的参数,称之为关键字可变参数。
传入的参数对象,必须是像
name=value这种 带参数名和参数值的, 放到dict对象时,参数名是字典元素的key,参数值是字典元素的value。
假如我们要传入的参数恰好已经在一个字典 中,可这样参数展开:
1  | onebatch = {'李白': 20, '杜甫': 24}  | 
列表/元组 操作
列表切片
1  | a = [1, 2, 3.14, 'hello', [7,8,9] ]  | 
列表部分内容整体替换(切片赋值)
1  | list1 = [0, 1, 2, 3, 4, 5]  | 
元组(Tuple)和列表非常相似,也可以存放任何类型的数据对象,除了一点: 元组的内容是 不能改变 的。
如果元组中只有一个元素,必须要在后面加上逗号:a = (1, )。
定义元组还可以去掉圆括号:a = 1, 2, 3.14, 'hello'。同理若只有一个元素,也必须在最后面加上逗号。
多个变量同时赋值
注意,这种赋值,变量的个数一定要和 列表/元组 中元素的个数相等。
1  | name, age = ['李逵', 33] # name 的值为 '李逵', age 的值为 33  | 
字符串的方法
count 返回字符串对象包含了多少个参数指定的字符串。
find 返回该 参数字符串 在其中 第一个 出现的位置索引。
split 截取字符串信息,返回元素为字符串的列表。
1  | str1 = '小张:79 | 小李:88 | 小赵:83'  | 
splitlines 字符串 按换行符 进行截取。
1  | salary = '''  | 
join 将列表中的字符串元素 以某字符串为连接符, 连接 为一个字符串。
1  | '|'.join([  | 
strip 将 字符串前面和后面的空格删除,但是不会删除字符串中间的空格。
1  | ' 小 李:88 '.strip()  | 
lstrip 将 字符串前面 (左边) 的空格删除,但是不会删除字符串中间和右边的空格。
1  | ' 小 李:88 '.lstrip()  | 
rstrip 将 字符串后面 (右边) 的空格删除,但是不会删除字符串中间和左边的空格。
1  | ' 小 李:88 '.rstrip()  | 
replace 替换 字符串里面 所有指定的 子字符串 为另一个 字符串。
1  | str1 = '我们今天不去上学,我们去踢足球'  | 
startwith 检查字符串是否以参数指定的字符串 开头,如果是,返回True,否则返回False。
endswith 检查字符串是否以指定的字符串 结尾,如果是,返回True,否则返回False。
1  | str1 = '我们今天不去上学,我们去踢足球'  | 
isdigit 检查字符串是否全部由数字构成,如果是,返回True,否则返回False。
1  | str1 = input('请输入手机号码:')  | 
列表的方法
append 在列表的 后面 添加一个元素。注意,该方法返回值是 None,而不是新的列表对象。
insert 在列表的 指定位置插入一个元素。
1  | a = [1, 2, 3.14, 'python3.vip']  | 
pop 从列表 取出并删除 一个元素。
1  | a = [1, 2, 3.14, 'python3.vip']  | 
remove 删除列表元素。从第1个元素开始,寻找 和参数对象 相等的元素,如果找到了,就删除,且找到后,不会继续往后寻找其它相等的元素。
注意,该方法返回值也是 None。
1  | var1 = ['a','b','c','a']  | 
reverse 将列表元素倒过来。注意,该方法返回值也是 None。
index 返回 参数对象 在列表 中的位置,也就是索引。
1  | var1 = [1,2,3,4,5,6,7]  | 
字典 操作
字典对象定义用花括号 {} , 字典里面的 每个元素之间用 逗号 隔开。
每个元素都是一个键值对,键和值之间用 冒号 隔开。
pop 删除元素,同时返回对应的 value 对象
1  | members = {  | 
1  | # del 关键字  | 
items 返回所有的 键值对 列表
keys 返回所有的 key 值列表
values 返回所有的 value 值列表
1  | members = {  | 
clear 清空字典
1  | members = {  | 
update 合并字典
1  | members = {  | 
判断语句
连写比较表达式
1  | # 两者等价  | 
与/或计算优先级
如果 and 和 or 一起使用, 注意 是先计算 and 部分, 其结果 再和 or 一起计算。
1  | # 先计算 or 右侧表达式  | 
格式化字符串
printf 风格
1  | # 打印字符、浮点、整型等  | 
f-string 格式化
在字符串模板前面加上f,然后占位符使用{} ,里面直接放入对应的数据对象。
注意,这种写法必须要Python解释器是3.6 以后的版本才支持。官方文档
1  | print(f'税前薪资是:{salary}元, 缴税:{tax}元, 税后薪资是:{aftertax}元')  | 
1  | # 指定宽度  | 
指定字符串内容无需转义
1  | path = r'c:\windows\temp'  | 
循环
循环n次
1  | for n in range(100):  | 
注意,如果想返回一个 从 0到99的数字列表, 可以这样写 : list(range(100))
如果想打印出从50 到 100 所有的数字
1  | # 表示从 50 开始, 到 100 结束。  | 
如果想打印出从50, 55, 60, 65… 这样每次增加5, 直到 100
1  | # 第3个参数表示 步长  | 
获取元素在列表里面的索引
1  | studentAges = ['小王:17', '小赵:16', '小李:17', '小孙:16', '小徐:18']  | 
列表推导式
把一个列表里面的每个元素经过简单的处理生成另一个列表的操作。
一个列表A,里面都是数字,我们需要生成一个新的列表B,依次存放列表A中每个元素的平方
1  | list1 = [1,2,3,4,5,6]  | 
1  | list1 = [1,2,3,4,5,6]  | 
字符编码
字符集
ASCII表
计算机是美国人发明的,所以在开始的时候, 他们也没有想到将来要支持全世界的文字。
美国人的单词都是用字母拼出来的, 所以他们常用的基础文字符号比较少,就是字母,再加上 !@#$%^&*(){[]}+- 等等这些符号,也就100多个。
他们定义的规范就叫 ASCII (American Standard Code for Information Interchange) ,中文大意就是 美国信息交换标准码。
这个 ASCII 码里面用128个数字代表了128个字符。
二进制有 8 位 的长度 被称为 一个 字节 。
因为2的8次方等于256,可以存储 从 0 到255 一共 256个数字, 可以表示 最多 256 个文字符号,所以一个字节就可以存放 任何一个ASCII 文字符号。
ASCII 这样的 用数字代表文字符号的规范,就被称之为 字符集。
后来计算机传遍了全世界,其它国家的文字符号就多了,比如中文、韩文、日文等,显然ASCII是不够的,我们需要其它的数字来代表这些文字符号。
开始各个国家和地区 自己定义了自己的 字符集。后来 国际标准化组织 定义了一个字符集,想包括世界上所有的文字符号,这就是大名鼎鼎的 unicode 字符集。
这个字符集里面包括了现今世界上的常用文字符号 和 其对应的数字表示。
字符编码
字符怎么存储和传输?
由于历史原因,计算机是 以字节为单位 来 存储和传输数据的,一个字节 由 8位二进制数字表示,最多可以表示从0到255, 一共256个字符。
最初只有ASCII码的时候,一个字节 就可以存储传输任何文字。
但是 unicode 里面有10多万的文字符号,数字范围 远远 超过 一个字节所能代表的数字。
所以一个字节不够。
那么怎么用多个字节来 表示这些数字呢?
这就有需要另外的规范。这些 如何用字节表示 字符对应的数字 就是 字符编码 规范。
unicode字符 的编码,最常用的规范是 UTF8 和 UTF16 。
比如 UTF8 表示 中文字符 你 ,就是用 3个字节表示的,对应的16进制表示是 E4 、BD、 A0。
在这里我们只要知道 不同的 编码规范 对数字有不同的 用字节表示的方法就行了。
有了编码规范,字符集 中的数字就可以转化为字节进行存储和传输了。
字符串编码
Python3语言里面的字符串对象是unicode字符串,在内存中实际存储时,使用的是 UTF16 编码。
但是我们通常不会将UTF16编码的内容写到磁盘或者在网络进行传输, 因为utf16编码比较浪费空间。
特别是如果文字信息基本都是英文符号的情况下, utf16 都会用2个字节来代表英文符号。 一个字节其实就够了。
所以,Python语言要对字符串对象 进行存储和传输的时候,通常要使用字符串的encode方法,参数指定编码方式,编码为一个 bytes 对象。
同样的字符串,用不同的编码方式,有时会产生不同的bytes结果:
输出内容 中 b 开头,表示这是一个 字节串bytes 对象
\x 说明是用16进制表示一个字节
1  | print ('你好'.encode('utf8')) # 输出 b'\xe4\xbd\xa0\xe5\xa5\xbd'  | 
encode方法返回的是编码后的字节串对象bytes 编码为字节串对象 bytes 就可存储到文件或者传输到网络中去了。
字符串解码
Python语言的解码 都是解码成 unicode字符串对象。
要解码字节串,必须要知道这个字节串是用什么字符编码的方式进行编码的。
如果知道了,就可以用字节串对象的decode方法 进行解码。
比如
1  | # 输出为 '你好'  | 
文件读写
内置函数 open
file文件路径,可以是相对路径或者绝对路径。mode打开模式。r、w、a、rb、wb、abencoding若为写模式,则指定编码方式;若为读模式,则指定解码方式。
1  | open(  | 
写文件
1  | f = open('tmp.txt','w',encoding='utf8')  | 
1  | # mode参数指定为rb 就是用二进制读的方式打开文件  | 
读文件
1  | f = open('tmp.txt','r',encoding='gbk')  | 
1  | f = open('tmp.txt')  | 
1  | # mode参数指定为 wb 就是用二进制写的方式打开文件  | 
模块和库
一个代码文件(也就是一个.py文件),也叫它一个模块(Module)。
放模块文件的目录,称之为 包 (Package) 。包目录里面需要有一个名字为 __init__.py 的初始化文件,通常为空文件,也可以在里面加入代码,当这个包里面的模块被导入的时候,这些代码就会执行。
解析器如何寻找模块文件?
首先在解释器 内置模块 ( builtin modules ) 中寻找 是否有 xxx 模块。
其次到 sys.path 路径列表中查看。
解释器启动时,根据下面这些规则 添加路径到 sys.path 列表里
- 启动脚本文件所在的目录
 - 环境变量 
PYTHONPATH里的目录 - Python解释器的 缺省安装目录(lib/site-packages)
 
因而若要自己添加一些目录作为模块搜索路径,一种是将目录路径添加到环境变量 PYTHONPATH ,一种是在代码直接修改: sys.path.append('/path/to/dir')
pip 管理第三方模块
那些优秀的第三方库,基本都是放在一个叫 PYPI 的网站上,pip命令会从该网站下载这些库的安装包进行安装。
指定从国内镜像网站下载:
1  | 从豆瓣的镜像备份中下载  | 
自定义类
super() 调用父类方法。无需 显示指定 父类的名字,代码维护性更好。
__repr__ 定义实例对象的打印输出
1  | class BenzCar:  | 
异常
捕获异常
1  | while True:  | 
获取异常对象
1  | try:  | 
匹配所有异常
所有的异常都是 Exception 的子类。
except 后面 没有写异常的类型,也表示匹配所有的异常。
1  | try:  | 
如果我们想知道异常的详细信息,可以使用 traceback 模块:
1  | import traceback  | 
自定义异常
异常类型都是 继承自Exception的类,表示各种类型的错误。
raise 异常抛出。
1  | # 异常对象,代表电话号码有非法字符  | 
常用函数封装
冒泡排序
1  | def bubble_sort(arr):  | 
文件拷贝
1  | def file_copy(src_path, dst_path):  | 


