python模块
概念
为解决在解释器中的编程不能重复使用的问题,将代码写入文件,通过执行文件在执行python代码,而这个文件被称为模块。
模块是包含所有变量和你定义的函数的文件,模块可以被别的程序引入,以使用该模块中的函数等功能。也是使用 python 标准库的方法
简而言之,就是一个写了python代码的文件,他可以被调用文件内的功能代码
import 语句
要使用python源文件,需要在另一个源文件中执行import
语句
import 模块名,模块名2...
import 语句要放在文件顶部,一个模块只会被导入一次
注意事项
-
当我们在当前目录存放了一个和引入模块同名的模块,则要引入的模块会被屏蔽
-
可以通过模块名来访问函数
-
如果打算经常使用,也可以把一个模块函数赋给一个本地名称
import test test.func() # 调用 test模块的 func 方法 testfunc = test.func testfunc() # 赋给本地名称,并调用
form … import 语句
from 模块名 import 内容(函数名,变量)
从模块中导入指定部分到命名空间
from test import func
func()
这个声明智慧导入指定部分,不会将整个模块都导入
from … import * 语句
from 模块名 import *
导入模块的所有信息,不推荐这么写。
深入模块
每个模块除了方法定义,也可以包含可执行代码,一般用于初始化该模块。这些代码只有在第一次导入时才会被执行。
每个模块都有自己独立的符号表,在模块内使用的变量不用担心影响到模块外,可以随意命名
可以通过
模块名.方法名
来调用模块内的函数
将模块的某些变量名导入当前模块,模块名不会被导入
from fibo import fib,fib2
可以一次性把模块的所有函数名称和变量名称导入,但这不是好习惯
from fibo import *
**注意:**在导入所有名字时,那些由单一下划线开头的名字不会被导入。
__ name__ 属性
在一个模块被另一个程序引用时,其主程序将运行,如果我们想在模块被引入时,模块中的某一程序块不执行,可以用 __name__
属性来使该程序块仅在该模块自身运行时执行
if __name__ = '__main__':
print('程序本身在运行')
else:
print('被引用')
**说明:**每个模块都有一个
__name__
属性,当其值是__main__
时,表明该程序自身在运行,否则就是被引入。请注意,开头是双下划线。
dir() 函数
内置函数 dir() 可以找到模块内定义的所有名称,以字符串列表的形式返回。如果没有参数,会返回当前定义的所有名称
dir(sys)
dir()
标准模块
系统内置模块,类似 c语言的
math.h
包
一种管理python模块命名空间的形式,类似java中的包。调用格式为 包名.模块名
在导入一个包的时候,python 会根据 sys.path 中的目录来寻找这个包中包含的子目录
目录只有包含一个叫做__init__.py
的文件才会被认作是一个包
关于导入
导入特定模块,但这会导致必须要用全名才能访问
import sound.echo
另一种方法,简化访问,直接访问 echo 模块
from sound import echo
导入变量和方法同理
from package import item
这种形式,item可以是模块名,也可以是模块的方法、变量名。
import语法首先会吧item当做一个包定义的名称,如果没有找到,则按照模块导入,如果还没找到,则会抛出一个异常:exc:ImportError
import item.subitem.subsubitem
这种导入格式,除了最后一项,都必须是包,而最后一项可以是模块或者包,但不能是类、函数或变量名
关于导入的相关规则
如果包定义文件__init__.py
存在一个叫做__all__
的列表变量,那么在使用 from package import *
的时候,就会吧列表中所有名字作为包内容导入,要经常更新
__all__ = ['echo','reverse']
如果不写,那么我们在运行import sound from *
时,将不会导入任何子模块,只会把__init__.py
中定义的内容导入。他不会影响在此之前我们明确指定导入的子模块。如果可以,最好明确指定路径,最好使用绝对路径,避免重名问题,提高可对性