- 这篇博文是Python入门(后传—天池龙珠计划)的第四部分,主要是介绍Python基础再见:从模块到文件系统
- 这篇博文会结合之前写过的Python入门(学习笔记)做一定补充,补充修改的内容在下面予以列出,具体情况可查阅相关博文。
- 学习交流欢迎联系 obito0401@163.com
Python入门(八):文件处理
Python入门(十):计算生态
Python入门(十二):常用标准库——time
Python入门(十三):常用标准库——random
Python入门(十四):常用标准库——os
新增内容
由于之前文章结构的原因,想新增的内容在原有博客上难以下笔,因此索性单独列出来,也方便查看学习
模块和命名空间
- 模块(Module):一个完整的Python文件即是一个模块,它通常指逻辑上的组织方式。Python中常用import 模块的方式将现成模块中的函数、类等重用到其他代码块中。
- 数据封装 -> 容器
- 语句封装 -> 函数
- 方法和属性封装 -> 类
- 程序文件封装 -> 模块
- 命名空间(Namespaces):从名称到对象的映射,大部分的命名空间都是通过 Python 字典实现的
- 内置命名空间(Built-in Namespaces):Python 运行起来,它们就存在了。内置函数的命名空间属于内置命名空间,所以我们可以在程序中直接运行它们,如函数
id()
- 全局命名空间(Module:Global Namespaces):每个模块创建它自己所拥有的的全局命名空间,不同模块的全局命名空间彼此独立。即使名称相同,也会因所在模块的不同而互不干扰
- 本地命名空间(Function & Class:Local Namespaces):模块中有函数或者类,每个函数或者类所定义的命名空间就是本地命名空间。如果函数返回了结果或者抛出异常,则本地命名空间也结束了
- 程序在查询上述三种命名空间的时候,就按照从里到外的顺序,即
Local Namespaces
–>Global Namespaces
–>Built-in Namespaces
【例】创建一个名为hello
的模块并调用
- 内置命名空间(Built-in Namespaces):Python 运行起来,它们就存在了。内置函数的命名空间属于内置命名空间,所以我们可以在程序中直接运行它们,如函数
if name == ‘main’
- 对于很多编程语言来说,程序都必须有一个入口
- 而 Python 则不同,它属于脚本语言,不像编译型语言那样先将程序编译成二进制再运行,而是动态地逐行解释运行。也就是从脚本第一行开始运行,没有统一的入口
- __name__是内置变量,可用于表示当前模块的名字;
- __main__是当一个
.py
文件被直接运行时,其__name__的值,即模块名为__main__ - 所以,
if __name__ == '__main__'
的意思是:当.py
文件被直接执行时,if __name__ == '__main__'
之下的代码块将被运行;当.py
文件以模块形式被导入时,if __name__ == '__main__'
之下的代码块不被运行
【例】现在有两个文件:const.py
和area.py
,每个文件都有个执行函数main()
,如下所示
如果area.py
的执行语句为main()
的话,它就会同时调用const.py
文件的main()
语句,结果如下所示:
如果area.py
的执行语句为if __name__ == '__main__'
的话,那么它就只调用当前文件下的main()
语句
搜索路径
- 当解释器遇到
import
语句,如果模块在当前的搜索路径就会被导入 - 搜索路径是由一系列目录名组成的,Python解释器依次从这些目录中去寻找所引入的模块
- 搜索路径是在 Python 编译或安装的时候确定的,搜索路径被存储在
sys
模块中的path
变量中
简洁的 with 语句
- 一些对象定义了标准的清理行为,无论系统是否成功的使用了它,一旦不需要它了,那么这个标准的清理行为就会执行
- 关键词 with 语句可以保证诸如文件之类的对象在使用完之后一定会正确的执行它的清理方法
【例】
try:
with open('April.txt','w') as f:
for line in f:
print(line)
except OSError as error:
print('出错啦!%s'%str(error))
序列化与反序列化
- Python 的 pickle 模块基本实现了基本的数据序列和反序列化
- 通过 pickle 模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,永久存储
- 通过 pickle 模块的反序列化操作,我们能够从文件中创建上一次程序保存的对象
- pickle 模块中最常用的函数为:
pickle.dump(obj,file,[,protocol]
obj
:想要序列化的obj
对象file
:文件名称protocol
:序列化使用的协议,若省略则默认为0
pickle.load(file)
:将file
中的对象序列化读出