【python学习】python的模块

中国史之【鸣条之战】:
商汤灭夏的关键战役。夏桀施行暴政,商汤起兵伐桀。双方战于鸣条(一说今河南商丘东,一说山西运城安邑北),夏桀被俘,夏室覆灭。自此商汤建立了中国的第二个王朝——商朝。
-来源:全历史APP

今天讲python的模块。有需要的也可以直接去我的github查看全部笔记:
https://github.com/JackKoLing/python_notes_with_ten_days
在这里插入图片描述
俗话说:“好记性不如烂笔头”,多写写多记记,总不会错。多一些不为什么的坚持,少一些功利主义的追求。对于环境的配置,可以参考以下两篇:

1 python模块

  • 可以将代码量较大的程序分割成多个有组织的、彼此独立但又能互相交互的代码片段,这些自我包含的有组织的代码段就是模块
  • 模块在物理形式上表现为以.py结尾的代码文件
  • 一个文件被看作一个独立的模块,一个模块也可以被看作是一个文件,每个模块都有自己的名称空间
  • python允许“导入”其他模块以实现代码重用,从而也实现了将独立的代码文件组织成更大的程序系统
  • 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的包。

我叫小保,一名计算机视觉爱好者、学习者、追随者,欢迎关注我一起学习。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JackkoLing

感谢你的支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值