中国史之【鸣条之战】:
商汤灭夏的关键战役。夏桀施行暴政,商汤起兵伐桀。双方战于鸣条(一说今河南商丘东,一说山西运城安邑北),夏桀被俘,夏室覆灭。自此商汤建立了中国的第二个王朝——商朝。
-来源:全历史APP
今天讲python的模块。有需要的也可以直接去我的github查看全部笔记:
https://github.com/JackKoLing/python_notes_with_ten_days
俗话说:“好记性不如烂笔头”,多写写多记记,总不会错。多一些不为什么的坚持,少一些功利主义的追求。对于环境的配置,可以参考以下两篇:
- win10版 @小保,公众号:CV之道
【深度学习环境配置】手把手实战配置深度学习环境(win10版) - Linux版 @小保,公众号:CV之道
【深度学习环境配置】手把手实战配置深度学习环境(Ubuntu20.04版)
1 python模块
- 可以将代码量较大的程序分割成多个有组织的、彼此独立但又能互相交互的代码片段,这些自我包含的有组织的代码段就是模块
- 模块在物理形式上表现为以.py结尾的代码文件
- 一个文件被看作一个独立的模块,一个模块也可以被看作是一个文件,每个模块都有自己的名称空间
- python允许“导入”其他模块以实现代码重用,从而也实现了将独立的代码文件组织成更大的程序系统
- python中,模块也是对象
- 在一个模块的顶层定义的所有变量,都会在被导入时成为了被导入模块的属性
2 python程序架构
- 一个python程序通常包括一个顶层程序文件和其他的模块文件(0个、1个或多个)
- 顶层文件:包含了程序的主要控制流程
- 模块文件:为顶层文件或其他模块提供各种功能性组件。被导入时,会立刻执行顶层程序代码,比如定义路径、超参数那些
- 比如一个深度学习训练,顶层文件就是train.py,而其他模块有dataloader.py、net.py、util.py等等
# 查看python自带的模块
print(dir('module'))
>>>
['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isascii', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
3 模块的执行环境
- 模块是被导入的,但模块也可以导入和使用其他模块,这些模块可以用python或其他编程语言写成
- 模块可内含变量、函数以及类来进行其工作,而函数和类可以包含变量和其它元素
4 导入模块
- 只能使用模块名,不能带.py后缀
- import语句,建议一个import导入一个模块,会生成一个名称空间。如:import numpy as np、import torch
- from-import语句,用于导入只需要的模块,如:from matplotlib import pyplot as plt
- import和from都是可执行语句,可嵌套在if语句中
- import和from是隐性赋值语句,import将整个模块对象赋值给一个变量名;from将一个或多个变量名赋值给同名对象
import numpy as np
print(dir(np))
>>>
['ALLOW_THREADS', 'AxisError', 'BUFSIZE', 'CLIP', 'ComplexWarning',...]
5 import的工作机制
- import语句导入指定的模块时会执行三个步骤:
- (1)找到模块文件:在指定的路径下搜索模块文件
- (2)编译成字节码:文件导入时就会编译。顶层文件的.pyc字节码文件在内部使用后会被丢弃,只有被导入的文件才会留下.pyc文件
- (3)执行模块的代码来创建其所定义的对象:模块文件中的所有语句都会依次执行,从头到尾,所以任何对变量名的赋值运算,都会产生所得到的模块文件的属性
- 注意:模块只在第一次导入时才会执行以上步骤,后续的导入只不过是提取内存中已加载的模块对象。也可以使用reload()来重新加载模块
6 搜索模块文件
- python解释器在import模块时必须先找到对应的模块文件,其可查找的路径有四个:
- (1)程序的主目录,也就是当前路径
- (2)python path目录(如果设置了此变量)
- (3)标准链接库目录
- (4)任何.pth文件的内容(如果存在.pth文件)
- 这四个组件组合起来就是sys.path所包含的路径,它会搜索路径中第一个符合导入文件名的文件
import sys
print(sys.path) # 第一个就是程序主目录,当前路径
>>>
['d:\\learnCode\\learnPython\\day9', 'c:\\Users\\JackkoLing\\.vscode\\extensions\\ms-python.python-2020.8.106424\\pythonFiles\\vscode_datascience_helpers\\..\\.does-not-exist', 'c:\\Users\\JackkoLing\\.vscode\\extensions\\ms-python.python-2020.8.106424\\pythonFiles', 'c:\\Users\\JackkoLing\\.vscode\\extensions\\ms-python.python-2020.8.106424\\pythonFiles\\lib\\python', 'D:\\Install\\Anaconda\\envs\\learnPy\\python37.zip', 'D:\\Install\\Anaconda\\envs\\learnPy\\DLLs', 'D:\\Install\\Anaconda\\envs\\learnPy\\lib', 'D:\\Install\\Anaconda\\envs\\learnPy', '', 'D:\\Install\\Anaconda\\envs\\learnPy\\lib\\site-packages', 'D:\\Install\\Anaconda\\envs\\learnPy\\lib\\site-packages\\win32', 'D:\\Install\\Anaconda\\envs\\learnPy\\lib\\site-packages\\win32\\lib', 'D:\\Install\\Anaconda\\envs\\learnPy\\lib\\site-packages\\Pythonwin', 'D:\\Install\\Anaconda\\envs\\learnPy\\lib\\site-packages\\IPython\\extensions', 'C:\\Users\\JackkoLing\\.ipython']
7 导入自己的包
import my_module
# 若找不到自己的模块,则需要将搜索的路径加入sys.path中
import sys
sys.path.append('D:\learnCode\learnPython\day9') # 模块存放的绝对路径
print(sys.path)
import my_module
ins1 = my_module.MyClass('jackko')
ins1.print_name()
print(my_module.__name__) # 如果一个模块是被导入的,则它的name属性是导入的对象名
sys.path.remove('D:\learnCode\learnPython\day9')
>>>
['d:\\learnCode\\learnPython\\day9', 'c:\\Users\\JackkoLing\\.vscode\\extensions\\ms-python.python-2020.8.106424\\pythonFiles\\vscode_datascience_helpers\\..\\.does-not-exist', 'c:\\Users\\JackkoLing\\.vscode\\extensions\\ms-python.python-2020.8.106424\\pythonFiles', 'c:\\Users\\JackkoLing\\.vscode\\extensions\\ms-python.python-2020.8.106424\\pythonFiles\\lib\\python', 'D:\\Install\\Anaconda\\envs\\learnPy\\python37.zip', 'D:\\Install\\Anaconda\\envs\\learnPy\\DLLs', 'D:\\Install\\Anaconda\\envs\\learnPy\\lib', 'D:\\Install\\Anaconda\\envs\\learnPy', '', 'D:\\Install\\Anaconda\\envs\\learnPy\\lib\\site-packages', 'D:\\Install\\Anaconda\\envs\\learnPy\\lib\\site-packages\\win32', 'D:\\Install\\Anaconda\\envs\\learnPy\\lib\\site-packages\\win32\\lib', 'D:\\Install\\Anaconda\\envs\\learnPy\\lib\\site-packages\\Pythonwin', 'D:\\Install\\Anaconda\\envs\\learnPy\\lib\\site-packages\\IPython\\extensions', 'C:\\Users\\JackkoLing\\.ipython', 'D:\\learnCode\\learnPython\\day9']
hello myclass jackko
my_module
注意最后一条语句:
print(my_module.__name__) # 如果一个模块是被导入的,则它的name属性是导入的对象名
>>>
my_module
这个非常有用,这也就是说,在自己的模块内,其__name__是__main__,而被导入的__name__是导入的对象名。所以,通常在自己的模块中做测试,需要写上:
if __name__ == "__main__":
test()
这样就可以把测试代码放在判断内,而当该模块被导入时,这段测试代码不会运行,因为他的__name__是模块名,而不是__main__。所以,这方便了测试。另外,养成规范的编程习惯很重要。
【声明】:学习笔记基于互联网上各种学习资源的个人整理。
以上是本期内容,下期介绍python的包。
我叫小保,一名计算机视觉爱好者、学习者、追随者,欢迎关注我一起学习。
![](https://i-blog.csdnimg.cn/blog_migrate/37d6a533cafcd7c7f3a6d3d4d64ac915.png)