python基础
https://github.com/ml-tooling/best-of-ml-python
1. python基础
方法是python可对数据执行的操作。每个方法后面有括号,需要提供额外的信息来完成工作。有的方法不需要提供额外的信息
1.1 命名规范
http://c.biancheng.net/view/4186.html
https://blog.csdn.net/weixin_41855010/article/details/105700153
https://github.com/gscheartA/Improve-your-code
1.2 帮助文档查询API
#查询lower的API
help(firstValue.lower)#不用加括号()
#第二种查询方式-交互式查询
help()
1.3 编码规范
https://www.runoob.com/w3cnote/google-python-styleguide.html
- 不同反斜杠链接行,用括号隐式连接
- 文档、模块描述 __ doc __ 查看
- 函数解释、类解释文档
- 非继承类,使用ClassName(object):
- TODO(): 注释
- 模块导入顺序:标准库 - 第三方库 - 自定义库
1.4 print
可以不输出到控制台、屏幕,可以指定输出
print(file=xxx)
注意
print() 仍然属于函数,但是由于没有返回值,所以返回的是None
1.5 f-string
# 字符串中出现{}符号,要双写转义
a=[1,2,3]
print(f'双写转义{{}},value{a}') # 结果: 双写转义{},[1,2,3]
2. 运算优先级
https://www.runoob.com/python/python-operators.html#ysf8
不同级运算顺序:从右向左
同级运算顺序:从左向右
not > and > or
https://blog.csdn.net/qq_26714479/article/details/80021715
https://blog.csdn.net/Eddy364/article/details/105480287
https://blog.csdn.net/chouzhou9701/article/details/88694795
3. 命名空间与作用域
https://blog.csdn.net/L_fengzifei/article/details/105164770
4. 模块与包
尽量不使用 from xxx import *
在导入模块中的变量时,注意是可变对象还是不可变对象,这与变量的引用机制是相同的 https://www.byhy.net/tut/py/basic/14/
(导入相同的不可变变量,其实在当前脚本下是另一别名)
4.1 import
路径查找顺序
先在
sys.modules
中查找!!!
import
及其sys.modules
具有可传递性然后查找内置模块built-in,(其实内置模块属于
sys.modules
)
最后在sys.path
查找当前执行文件所在目录 !!!
python环境变量下的每个目录PYTHONPATH
python默认安装路径目录lib/site-packages
所有路径都保存在
sys.path
变量中
自定义扩展模块,放在
lib/site-packages
就行
按照
sys.path
的顺序进行搜索,python先是用户环境路径(terminal>> python script.py文件所在的工作目录),然后是系统环境路径
sys.path.append()
是临时添加方法
PYTHONPATH
添加方法,命令行set PYTHONPATH是临时方法,WINGUI下是永久添加方法
单下划线_ name 的变量或方法不会被import导入http://c.biancheng.net/view/2401.html
4.1.1 环境变量/sys.path
注意:环境变量和sys.path不是一个概念,从上述可以看出,用到sys.path进行模块搜索时,使用到了PYTHONPATH这个环境变量
sys.path.append()时不必重启pycham
https://www.byhy.net/blog/env/
环境变量仍然是变量,是与系统与程序相关的信息配置项
获得环境变量值
环境变量value=os.enviorn['环境变量Key']
临时设置环境变量
os.enviorn['环境变量key']=value
这是设置python的环境变量(目录)(不是设置 编写的脚本下的内部调用的某环境变量)
set PYTHONPATH='xxx certainpath'
(这是在命令行执行,不是在.py文件中执行)
sys.argv
sys.argv
用于获取python程序的命令行参数
argv
是sys
模块的一个全局变量,也是sys
的一个属性,argv
本身是一个list类型的对象
sys.argv[0]
用于获取当前Python程序的存储路径,也就是传入的模块名
sys.argv[1:]
为命令行中传入的参数
sys.path
sys.path.append(f’{path}')
环境变量的继承
https://www.byhy.net/blog/env/
pycharm 是python脚本的父进程
pychar或cmd的父进程是桌面管理系统(exploer)会自动重新读取环境变量
cmd中设置环境变量
注意重启,cmd会自动拷贝一份父进程的环境变量
每个 程序(进程) 启动后,都会自动拷贝一份 父进程 的环境变量
也就是如果父进程的环境变量改变,要重启子进程才能生效
脚本之间,以进程方式进行调用的时候或者是import的时候,也存在环境变量继承的概念
4.1.2 __ all __变量
如果是限制被导入的方法和变量,对__ all __赋值
只在from xxx import *
时才会有效
如果只是显示模块的所有成员,module.__all__
进行查看
与__ dir () 不同的是, all __ 变量不会显示模块中的特殊成员
4.1.3 __ name __
用于获得对象名,模块名
函数名
def fun():
pass
print(fun.__name__) # str
模块名
if __name__ == '__main__':
pass
import 模块时,__ name __的变化https://blog.csdn.net/wosind/article/details/90728198
A.py import B.py;则B.py 的
__name__
不再是__main__
而是文件名
4.1.4 __ dir __()/dir()
https://blog.csdn.net/lis_12/article/details/53521554
查看模块的所有成员,用于产看属性和方法
dir()
或__dir__()
是方法
与类和实例有关的区别见https://blog.csdn.net/L_fengzifei/article/details/105178477
4.1.5 __ dict __
https://blog.csdn.net/lis_12/article/details/53521554
用于产看属性和方法
__dict__
是属性
__dict__
返回的是dir()
的子集
当对象没有__dict__
这一属性时,就要用dir()
获取对象的方法和属性
与类和实例有关的区别见https://blog.csdn.net/L_fengzifei/article/details/105178477
4.1.6 __ doc __
产看模块、函数、类的说明文档
4.1.7 __ file __
查看模块的源文件路径,package.__file__
属性,获得包的绝对路径(输出的是该包下的__ init __.py文件(对应的)绝对路径)
4.1.8__ module __
查看当前对象在哪个模块
内置类型没有__module__
,函数有__module__
from m import cls
c=cls()
c.__module__ # m
class B:
pass
b=B()
b.__module__ # __main__
def f():
pass
f.__module__ # __main__
4.2. 包
4.2.1 __ init __.py–还没看完
__ pycache __ 文件夹???
直接导入包,并不会马上导入包中的模块
from 包名 import *
也只会导入__ init __.py ,不会导入包中的其他模块
__init__.py
的相对引用机制???https://blog.csdn.net/xx_xjm/article/details/122648009?spm=1001.2014.3001.5502
4.3 整个项目中的包与模块导入
4.3.1 sys.modules
https://blog.csdn.net/linuxheik/article/details/51889514
https://blog.csdn.net/xx_xjm/article/details/122648009?spm=1001.2014.3001.5502
https://blog.csdn.net/u011208984/article/details/90214141
字典形式
记录导入的模块
python解释器启动时,自动导入一些模块,加载到内存中,当模块第一次导入时,sys.modules自动记录该模块,第二次导入时,直接从内存中的字典中查找
除了内置模块__builtins__
, 有些解释器启动时自动导入的模块,对当前作用域不可见,需要手动import
(模块导入不等于模块可见)
内置模块不等于标准库(os,re,sys),内置模块可见,标准库在不导入前不可见
import
及其sys.modules
具有可传递性
内置作用域通过
builtin
的标准模块来实现,但是这个变量名自身并没有放入内置作用域内,所以必须导入这个模块才能使用
import builtins
dir(builtins)
4.3.2 绝对导入和相对导入–还没看完???
注意!
pycharm会自动将打开项目的根目录添加到sys.path
中
其他编译器和命令行不会,只会将当前的执行脚本所在目录添加到sys.path
中
相对导入时,注意__name__
的变化
4.4 os and I/O
4.4.1 文本与二进制
https://www.byhy.net/tut/py/basic/13/
读写操作可以是文本模式或**二进制(字节序列)**模式
本质上,读写操作都是对字节串对象进行解析的,但是当以文本方式进行读写时,python会自动实现字节串到字符串的转换
注意,当以二进制模式进行读写时,操作的对象是字节串对象,而不是字符型进制数(底层原始数据)(字节串对象与进制数在字面表达上的差异)
4.4.2 os
os.sep
当前使用平台的路径分割符
os.walk()
递归遍历
glob
按照正则表达是进行遍历
os.system()
用于调用外部程序
os.system('cmd')
os.system()
无法获取被调用程序输出到终端窗口的内容
subporcess
模块,处理被调用程序的输出信息
os.popen()
https://blog.csdn.net/xc_zhou/article/details/96445422
https://www.runoob.com/python/os-popen.html
通过管道方式来实现,函数返回的是一个file对象,file对象的内容那个是脚本输出的内容
with os.popen('file') as f:
f.read() # 读到的是脚本输出的内容
os.popen()
是非阻塞的,即在没完全执行玩之前就会之行下一条语句,如果变成完全阻塞式,利用f=os.popen() f.read()
的方法进行执行
subprocess模块-没看完
https://www.runoob.com/w3cnote/python3-subprocess.html
os.startfile()
调用任何非可执行程序文件,word/excel等
Pathlib - 还没看
4.4.3 I/O
open()
http://c.biancheng.net/view/2544.html
注意缓存机制
f.close()
必须调用close() 函数才能将缓冲区的数据写入文件
f.flush()
可以手动将数据写入文件中,即将缓存区的数据写入文件。
对于二进制文件,数据是直接写入文件的
对于文本文件,数据是先进入缓冲区,再写入文件
readlines()
与writelines()
的换行符注意事项http://c.biancheng.net/view/4758.html
readline()/readlines()/read()
with open('file.txt','r') as f:
f.read() # 一个str类型的数据,'line1\nline2\nline3...'
with open('file.txt','r') as f:
f.readline() # 一个str类型的数据,'line1\n'
with open('file.txt','r') as f:
f.readlines() # 一个list类型的数据 ['line1\n','line2\n','line3\n',...]
with open('file.txt','r') as f:
f.read().splitlines() # 一个list数据类型 ['line1','line2','line3',...]
with as
使用with as 操作打开的文件对象,本身就是上下文管理器;执行完with as 语句后自动关闭已经打开的文件
注意,with as 是操作上文管理器,而不是生成上下文管理器
上下文管理器
http://c.biancheng.net/view/5319.html
注意,with as 是操作上文管理器,而不是生成上下文管理器
构建上下文管理器的方法
基于类实现
基于生成器实现-(没看完)
同时包含 __ enter __() 和 __ exit () 方法的对象就是上下文管理器
上下文管理器是一个实现了 enter 和 exit __ 方法的类
上下文管理器 就是with as 语句操作的对象
with as 操作上下文管理器时,会在执行代码块之前,先执行上下文管理器的 __ enter __() 方法,然后再执行代码块,最后执行 __ exit __() 方法
- __ enter __(self)
进入上下文管理器自动调用的方法,该方法在with as 代码块执行前执行
如果with 语句后面有as 语句,那么该方法(__ enter __)的返回值会被赋予给as语句后的变量
__ enter __(self) 方法可以返回多个值,可以执行as语句后的多个变量
__ exit __(selft,xxx)
退出上下文管理器时自动调用的方法
在with as 代码块执行之后执行
如果with as 代码块成功执行结束,程序自动调用该方法,如果因为异常终止,程序也自动调用该方法,使用sys.exc_info() 得到的异常信息作为调用__ exit __() 方法的参数
pickle
序列化 / 反序列化 操作
实现任意对象与文本之间的相互转化
实现任意对象与二进制之间的相互转化
实现python对象的存储与恢复
# 直接是二进制对象
dumps()
loads()
# 基于文件
dump()
load()
对大规模数据操作时,计算瓶颈
fileinput???
http://c.biancheng.net/view/2547.html
逐行读取多个文件
fileinput.input()
同时打开制定的多个文件,通过for
按次序读取多个文件中的数据
linecache
随机读取文件指定行
http://c.biancheng.net/view/2553.html
fnmatch
文件名匹配
功能弱与re正则表达式
5. time/calendar
https://www.byhy.net/tut/py/extra/date_time/
import time
from datetime import datetime
# 时间变成字符串形式
str(datetime.now())
datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
time.strftime('%Y-%m-%d %H:%M:%S',time.localtime())