准备
pip 下载慢
1 | pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple |
vcode 配置
1 | { |
规范
4 个空格缩进
没有常量, 一般约定纯大写的就是常量
数据类型
动态类型
1 | a = 123 |
数字
由于是动态类型 整数,浮点数区分起来只能靠一些函数
对大数字的支持比较好,不用担心溢出
1 | a = 123 |
字符串
单双引号没区别,有个优点如下
1 | print("I\'m ok") |
保留换行的字符串
1 | print('''line1 |
布尔值
注意是大写,运算符为 and、or 和 not
1 | a = True |
空值
None
运算符注意
1 | 10/3 # 3.33333 |
集合类
元组,tuple,不可变长,使用 len(arr)获取长度,越界取值报错,无法删除使用 del 释放
z 支持切片操作,元组
1 | a = () |
列表,list,可变长,,使用 len(arr)获取长度,可用 append,pop,pop(i),等方法
越界取值报错,空 list 调用 pop 报错
1 | a = [2] |
字典,dict,其他语言都叫做 map,删除使用 pop(key)
1 | m = {'k1': 1, 'k2': 2} |
集合,set
1 | s = {1, 2, 3} |
循环
只有一种for ... in ...
的写法,想要获取下标可以换一种思路
1 | arr = (2, 4, 6, 8, 10) |
列表生成
1 | print(list(range(0, 10))) # 等价 range(10) |
函数式编程
map,reduce,filter,sorted 和 es6 里面的意思差不多
1 | from functools import reduce |
函数
支持的特性:必选参数,参数默认值,可变参数,关键字参数,命名关键字参数
注意: 默认参数值必须指向不变对象,假如是 list 的话,这个引用会被一直保持着
注意:不能多传,不能少传,传值顺序不能有歧义
1 | def f1(): |
1 | def f2(a, b=99, *c): |
强制使用关键词参数,*
后面的参数必须通过带参数名的方式传值,不能多传,不能少传
1 | def f2(name, *, p1, p2): |
接收多余的关键词参数(命名关键字参数)
1 | def f2(name, **other): |
总结:一般其他语言为了避免可变参数的歧义,定义可变参数必须为最后一个参数,但是在 python 中有了命名关键字参数后,可变参数后面还可以定义其他关键词参数
在 Python 中定义函数,可以用必选参数、默认参数、可变参数、关键字参数和命名关键字参数,这 5 种参数都可以组合使用。但是请注意,参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。
1 | def f2(name, *p1, p2, p3): |
当定义一个空函数时,可以使用 pass
1 | def f1(): |
面向对象
__xx
表示私有变量,其实也不是私有,解释器会把它重命名,变成_ClassName__VarName
1 | class User(object): |
两个函数type()
,isinstance()
获取类信息dir()
,hasattr()
,setattr()
,getattr()
模块管理
在导入模块的时候,模块会从头到尾执行一遍,然后的变量均可被导出
方便开发运行模块,类似于 main 方法吧,又不希望导入的时候被执行可以可以使用下面的魔法写法
1 | # 在直接运行时候成立 |
导入其他 py 文件的几种方式
在 python 2.7 及之前版本中默认是先“相对”后“绝对”的顺序搜索模块,之后是先搜索绝对路径如果有就停止,所以在你的文件名,包名尽量起的不要和常用库的名字一样
1 | import tool |
实际项目中,一般都是以目录作为模块的划分,直接导入目录,然后在在目录下的__init__.py
文件去导入本目录中的文件,然后再暴露出去。系统识别到 init 文件后会把该目录视作一个模块
在如下层级关系中
1 | |-- main.py |
没使用__init__.py
时候一般是这样用的
1 | import m.a as ma |
添加__init__.py
后
1 | import m |
1 | import a |
这时会报错,因为python main.py
的搜索路径是当前路径+系统模块路径,在解析__init__.py
时,在上述路径中搜索不到 a 和 b
可以通过改变搜索路径来解决这问题,但是对 IDE 可能不太好
1 | import sys |
规范的做法是在模块内使用相对路径导入,执行main.py
正常。但是由于使用了相对导入__init__.py
就无法作为脚本直接执行了,需要到外层python -m m.__init__
进行执行
1 | from . import a |
第三方库使用 pip 管理,官方源,下载慢建议替换成清华的源
pip install –upgrade pip
pip install requests
使用 python3 的 typing 模块提高代码健壮性
Python 在 3.5 版本中引入了 typing 模块,实现了类型提示功能
这里需要注意的一点是,Python typing 本质是一种注释,可以用来帮助 IDE 进行类型检查和自动补全等操作,但是他并不会真的让执行失败。
1 | from typing import List, Tuple, Dict |
1 | int,long,float: 整型,长整形,浮点型; |
1 | from typing import List |