笔记内容整理自廖雪峰官网和菜鸟教程
模块的意义
模块Module是一个以.py结尾的Python文件,能定义函数、类、变量,也可以包含可执行的代码。
模块提高代码的可维护性,可以引用其他模块包括Python内置模块和第三方模块
相同名字的函数和变量可以被存放在不同的模块中,可以避免函数名和变量名冲突
引入包后,顶层包的名称不冲突的情况下,所有模块名都不会冲突。每一各包目录下都有__init__.py文件,来区分包目录和普通目录。
注意:编写模块不能与内置模块名字冲突,可以通过import名字来看系统内是否已存在该模块,尽量不要与内置函数名字冲突。
调用模块
import三种语句
- import
将导入的模块作为对象,调用模块下的函数
推荐使用import语句,可以增加可读性,避免名称冲突
#伪代码
#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 导入模块
import modulename
#调用模块内函数
modulename.function()
- from…import…
从模块中导入一个指定的部分到当前的命名空间中,可直接调用函数
#伪代码
#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 导入模块
from modulename import funcname
#调用模块内函数
funcname()
- from…import * 导入一个模块内所有项目,但尽量不要使用这种方法(?)
#伪代码
#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 导入模块
from modulename import *
#调用模块内函数,不需要加模块名
funcname()
命名空间和作用域
#全局命名空间中定义num
num=10
def addnum():
#如果不用global声明全局变量则仅在局部变量中搜寻num,报错
global num
num=num+1
print('inside addnum',num)
print('beforenum',num)
addnum()
print('afternum',num)
print('beforenum',num)
addnum()
print('afternum',num)
#output
#beforenum 10
#inside addnum 11
#afternum 11
#beforenum 11
#inside addnum 12
#afternum 12
模块相关函数
- dir
dir(module_name)以list返回返回模块中定义的所有模块、变量、函数 - locals() globals()
如果在函数内部调用 locals(),以dict返回所有能在该函数里访问的命名。
如果在函数内部调用 globals(),以dict返回的是所有在该函数里能访问的全局名字。 - reload(module_name)
import多次模块,只会被执行一次,用reload(module_name)重载模块
import math
#dir返回模块变量和函数
content=dir(math)
print(content)
#output
#['__doc__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'copysign', 'cos', 'cosh', 'degrees', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd', 'hypot', 'inf', 'isclose', 'isfinite', 'isinf', 'isnan', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'log2', 'modf', 'nan', 'pi', 'pow', 'radians', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'tau', 'trunc']
#以dict返回所有函数里能访问的全局名
content=globals()
print(content)
content['__name__']#dict截取key对应的value
包
可以将包看成一个文件夹,但其中必须包含__init__.py文件(可以为空)以区别普通的目录。
顶层包名不冲突则模块不会冲突。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
if __name__ == '__main__':
print '作为主程序运行'
else:
print 'package_name 初始化'
编写模块
#!/usr/bin/env python3# -*- coding: utf-8 -*-
' a test module '#module的注释文档
__author__ = 'Michael Liao'#作者
import sys
def test():
args = sys.argv
if len(args)==1:
print('Hello, world!')
elif len(args)==2:
print('Hello, %s!' % args[1])
else:
print('Too many arguments!')
if __name__=='__main__':
test()
安装第三方模块
安装模块
- 命令提示符/python
命令提示符窗口下运行pip,如果未找到可重新运行安装程序添加pip
命令:pip install modulename
第三方库官网注册:pypi.python.org - Anaconda
参见博客https://www.cnblogs.com/Leo_wl/p/9116506.html
conda install package_name
e.g. conda install numpy
多个包可以输入多个名字
e.g. conda install numpy pandas
搜索路径
当你导入一个模块,Python 解析器对模块位置的搜索顺序是:1、当前目录
2、如果不在当前目录,Python 则搜索在 shell 变量 PYTHONPATH 下的每个目录。
3、如果都找不到,Python会察看默认路径。UNIX下,默认路径一般为/usr/local/lib/python/。
模块搜索路径存储在 system 模块的 sys.path 变量中。变量里包含当前目录PYTHONPATH和由安装过程决定的默认目录。
Windows系统中典型的PYTHONPATH为:set PYTHONPATH=/usr/local/lib/python
修改/添加模块路径
修改sys.path添加搜索目录,但每次退出再打开需要重新添加路径
import sys
print sys.path #查看当前模块的引用路径
sys.path.append('path') #添加模块搜索路径
也可以设置环境变量PYTHONPATH,该环境变量的内容会被自动添加到模块搜索路径中,而Python本身的搜索路径不受影响。