把定义存放在文件中,为一些脚本或者交互式的解释器实力使用,这个文件被称为模块
模块是一个包含所有你定义的函数和变量的文件,其后缀名是py模块可以被背的程序引用,以使用该模块中的函数等功能,这就是使用Python标准库的方法
可以说模块实际上就是程序
在前面咱们尝试过,如import OS
如下
>>> import os>>> type(os)<class 'module'>
import os 引用了os模块
同理,使用Python标准库的例子
>>> import sys>>> import using_sys.py命令行参数如下:
Python 路径为: ['', 'C:\\WINDOWS\\SYSTEM32\\python34.zip', 'C:\\Python34\\DLLs', 'C:\\Python34\\lib', 'C:\\Python34', 'C:\\Python34\\lib\\site-packages']
自定一个模块,代码内容如下
def name(): print("hello")
编辑好后。命名为modle.py,运行后
>>> import modle>>> modle.name()hello
想使用 Python 源文件,只需在另一个源文件里执行 import 语句,语法如下:
import module1[, module2[,... moduleN]
当解释器遇到import语句时,如果模块在当前的搜索路径就会被导入
搜索路径是一个解释器会先进行搜索的所有目录的列表。如想要导入模块需讲命令放在脚本顶端
例子计算摄氏度与华氏度的相互转换
#pan.pydef c2f(cel): fan = cel *1.8 + 32 return fandef f2c(fah): cel = (fah - 32)/1.8 return cel
在写个文件
import pan print("32摄氏度 = %.2f" % pan.c2f(32)) print("99华氏度 = %.2f" % pan.f2c(99))
这样显得有些麻烦
from 模块名 import 函数名如下
from modname import name1[, name2[, ... nameN]]
例如,要导入模块 sa 的 name 函数,使用如下语句:
from sa import name
它不会把整个sa模块导入当前的命名空间里,只会把其对应的函数引入
from 模块名 as 新名字
from modname import *
把一个模块的所有内容全都导入到当前的命名空间也是可行的
这提供了一个简单的方法来导入一个模块中的所有项目。然而这种声明不该被过多地使用。
所以并不推荐使用
推荐使用方法
import 模块名 as 新名字【指模块的新名字,方便】
用这种方法给导入的命名空间替换一个新名字
命名空间解释;如同在一个文件里声明一个name函数,再另一个文件里再声明一个name函数,这两个函数虽然名字相同,但是却不相干,如何识别,在name函数前面加上文件名,而这个文件名加上命名空间
一个模块被另一个程序第一次引入时,其主程序将运行。如果我们想在模块被引入时,模块中的某一程序块不执行,我们可以用__name__属性来使该程序块仅在该模块自身运行时执行。
>>> __name__'__main__'
简单的理解,就是说__name__属性的值是__main__ 每个模块都有一个__name__属性,当其值是'__main__'时,表明该模块自身在运行,否则是被引入。
测试下面的代码
if __name__ == '__main__': print('程序自身在运行')else: print('我来自另一模块')
dir()内置函数dir()可以找到模块内定义的所有名称
>>> import pan>>> pan.__name__'pan'>>> dir(pan)['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'c2f', 'f2c']
path搜索路径
>>> import sys>>> sys.path['', 'C:\\WINDOWS\\SYSTEM32\\python34.zip', 'C:\\Python34\\DLLs', 'C:\\Python34\\lib', 'C:\\Python34', 'C:\\Python34\\lib\\site-packages']>>>
包
简单理解就是,上面咱们把建立一个文件叫做模块,其实包就是建立一个文件夹
但是文件夹是有前提条件的,Python怎么识别这个文件夹是一个包呢?