笔记更新于2019年11月20日,
摘要:模块的基本介绍;包;模块的编写;作用域;第三方模块;模块搜索路径
写在前面:为了更好的学习python,博主记录下自己的学习路程。本学习笔记基于廖雪峰的Python教程,如有侵权,请告知删除。欢迎与博主一起学习Pythonヽ( ̄▽ ̄)ノ
Module,即模块、组件的意思。在Python中,一个.py文件即是一个模块。在编写程序时,可以引用其他模块,在编写完成后又可以作为模块被其他程序引用。相同的函数名与变量名可以存在不同的模块中而不产生冲突。
使用模块的好处:提高代码的可维护性,编写程序可引用其他模块而更为方便。
为了避免模块名字与另外的模块名字产生冲突,可以通过用包来组织模块。如下
mywork
├─ \__init__.py
├─ aaa.py
└─ ccc.py
mywork是一个包名,在其目录下必须存在__init__.py这一文件,否则则视为普通的目录而非一个包。事实上,__init__.py也是一个模块,它的模块名就是mywork。
当一个模块被包组织起来,它的模块名就会发生变化,如aaa.py的模块名变成了mywork.aaa,ccc.py的模块名变成了mywork.ccc。
包还能有多级目录,如
mywork
├─ work
│ ├─ __init__.py
│ ├─ aaa.py
│ └─ one.py
├─ __init__.py
├─ aaa.py
└─ ccc.py
此时,在work里面的aaa.py的模块名为mywork.work.aaa,在mywork里面的aaa.py的模块名为mywork.aaa。
先给出一个简单的模块编写代码
#! /user/bin/env python3
# -*- coding utf-0 -*-
' a text module'
__author__ = 'San bei'
import sys
def add(x, y):
return x + y
print(add(1, 2))
第1、2行是标准注释,第1行的注释#!/user/bin/env python3使得这个模块可以直接在Unix/Linux/Mac上运行,第2行注释# -*- coding:utf-8 -*-表示文件使用标准的utf-8编码。
第4行是模块的文档注释,任何模块代码的第一个字符串都被当作是模块的文档注释。
第6行使用模块的__author__变量写入模块的作者。
以上就是Python模块的标准文件模板,可以不写,但还是建议按照标准格式构建模块。
接下来是模块的真正代码部分。
将它保存为text.py,在命令行模式直接运行模块,结果如下:
>>>text.py
3
这个模块还能被引用,在交互式模式下引用模块,结果如下:
>>>import text
3
>>>text.add(5, 2)
7
会发现在用import引入模块后,会执行被引用的模块,输出我们不需要的结果3。要解决这个问题,要在模块编写的时候加上if __name__ == ‘__main__’,像这样:
#! /user/bin/env python3
# -*- coding utf-0 -*-
' a text module'
__author__ = 'San bei'
import sys
def add(x, y):
return x + y
if __name__ == '__main__':
print(add(1, 2))
这是是什么意思呢?我们知道.py文件就是一个模块,可以直接运行,那么当模块直接运行的时候,模块的_name__属性会变为_main。而当模块被引用时,模块的_name__属性还是_name。
所以,这一行代码的意思是当模块直接运行时,就会执行下面的代码,当模块被引用时则不会执行下面的代码。
一般而言,在编写模块时都会加上这一语句,因为在引用模块时,只需要模块内的函数,而不需要该模块本身输出的结果。
这时候引用模块就不会输出3了:
>>>import text
>>>text.add(5, 3)
8
在定义变量名时,会有这样约定俗成的编程习惯。
正常的函数或变量名是公开的,像abc,xxy,PI,称为public变量,可以被直接引用
类似__xxx__这样的变量是一些特殊变量,如上面提到的__name__,我们不会用这样的方式来定义变量
类似_xxx这样的变量是非公开的,称为private变量,不应该被直接引用。
可以通过一个公开的函数把非公开的函数隐藏起来,这样内部的逻辑就不会公开,如 (下面例子转自廖雪峰的官方网站)
def _private_1(name):
return 'Hello, %s' % name
def _private_2(name):
return 'Hi, %s' % name
def greeting(name):
if len(name) > 3:
return _private_1(name)
else:
return _private_2(name)
在编写程序时,我们可以引用Python内置的模块来简化程序的编写过程。需要注意的是,在我们自己编写模块时,模块名不要与内置模块名相同,也不要与内置函数名相同,否则会发生冲突。Python所有内置的函数
比如我们编写了一个sys.py的模块,这样系统内置的sys模块将不能被导入。
除了引用Python系统的内置模块之外,我们还能引用第三方模块,一般来说,第三方库都会在Python官方的网站注册。
在安装了包管理工具pip之后,就可以通过pip来安装第三方模块了。
pip install Pillow
在命令行模式下输入pip install Pillow,便会安装第三方模块Pillow。
但我们加载一个模块时,Python会在指定目录下搜索这一.py文件,如果搜索不到则报错。
默认情况下,Python会先搜索当前目录。Python的搜索路径存放在sys模块的path变量中。
如果找不到模块,我们可以手动添加自己需要的搜索目录,有三种方法。
>>> import sys
>>> sys.path.append('C:\\Users\michael\my_py_scripts')
临时生效,对于不经常使用的模块,这通常是最好的方式。
如果是win7系统的话,可以通过右键计算机—>属性—>高级系统设置—>环境变量进行设置。
该环境变量的内容会被自动添加到模块搜索路径中,Python本身的搜索路径不会受到影响。
在Python目录下的lib\site-packages里面增加.pth文件,内容为需要添加的路径即可。
以上就是本节的全部内容,感谢你的阅读。
下一节内容:11.面向对象编程之 类、实例与方法
有任何问题与想法,欢迎评论与吐槽。
和博主一起学习Python吧( ̄▽ ̄)~*