模块:
模块是一个包含主观定义的函数和变量的文件,其后缀名是.py。
模块可以被别的程序引入,以使用该模块中的函数等功能。
模块的使用方法与python标准库使用方法一致。
一、尝试使用python标准块
#!/usr/bin/python3 import time import calendar local_time = time.localtime() print(time.localtime()) print('格式化以后',time.strftime('%Y-%m-%d %H:%M:%S', local_time)) print(calendar.calendar(2021,w=3,l=1,c=1,m=6))
import time 进入python标准模块的 time 模块 , time.localtime() 表示time的本地时间调取方法
二、import 语句
2.1使用python源文件,只需在另一个源文件里执行import语句,语法如下:
import module1[,module2[,... moduleN]
编辑名为importfunc的py文件
#!/usr/bin/python3 def print_func( impfc ): print( "Hello ,",impfc) return
尝试调用如上模块
#!/usr/bin/python3 import importfunc importfunc.print_func("import方法使用")
一个模块只会被导入一次,不管你执行了多少次import。这样可以防止导入模块被一遍又一遍地执行。
2.2 如果想频繁地被其它类直接调用呢,除了将对应py放到当前目录,还可以将该py放到sys模块下
2.2.1直接调用会出错:
2.2.2我们先找到 sys所在的位置将我们的importfunc.py放到解释器目录去试试比如C:\Users\xxx\AppData\Local\Programs\Python\Python38\Lib
#!/usr/bin/python3 import sys print(sys.path)
2.2.3将py保存到如上位置然后调用
2.2.4 而且可以更简洁的使用,不过这步使用是临时的,再次使用需要重新声明
三、from...import语句
python 的 from 语句让你从模块中导入一个指定的部分到当前命名空间中,语法如下:
from modname import name1[,name2,name3[,...nameN]]
四、from...import * 语句
把一个模块的所有内容全部导入到当前的命名空间,语法如下:
from modname import *
五、 __name__属性(前后双下划线_ _)
一个模块被另一个程序第一次引入时,其主程序将运行。如果我们想在模块被引入时,模块中的某一程序块不执行,我们可以用__name__属性来使该程序块仅在该模块自身运行时执行。
我们还用上次的例子 “importfunc.py”进行示范
#!/usr/bin/python3 def print_func( impfc ): print( "Hello ,",impfc) return print('importfunc.py中的__name__值:',__name__) if __name__ == '__main__' : print('程序自身在运行') else: print('被另外一个模块调用中')
尝试使用外部调用
#!/usr/bin/python3 import importfunc
六、dir()函数
内置的函数dir()可以找到模块内定义的所有名称。以一个字符串列表形式返回:
#!/usr/bin/python3 import importfunc print(dir())
不给定参数时,dir()函数会罗列出当前定义的所有名称
#!/usr/bin/python3 import importfunc print(dir()) a = 1,2,3,4,5 print(type(a)) print(dir()) del a print(dir())
七、标准模块
python本身自带一些标准模块,有些模块直接被构建在解析器里,这些虽然不是一些语言内置功能,但是他却能很高效的使用,甚至是系统级调用也没问题;
这些组件会根据不同的操作系统进行不同形式的配置,比如winreg这个模块就只会提供给wins系统。
应该注意到这有一个特别的模块 sys,它内置在每一个python解析器中。变量sys.ps1 和 sys.ps2定义了主提示符和副提示符所对应的字符串:
>>> import sys >>> sys.ps1 '>>> ' >>> sys.ps2 '... ' >>> sys.ps1 = 'C> ' C> print('test') test
八、包
包是一种管理python模块命名空间的形式,采用“点模块名称”
比如一个模块的名称是A.B,那么他表示一个包的子模块B。
就好像使用模块的时候,你不用担心模块之间的全局变量相互影响一样,采用点模块名称这种形式也不用担心不同库之间的模块重名情况。
这样不同的作者都可以提供NumPy模块,或是Python图形库.
不妨假设你想射击一套统一处理声音文件和数据的模块(或者称之为一个“包”),现存很多种不同的音频文件格式(基本都是通过后缀名区分的,例如:.wav,:file。aiff,:file:.au,)所以你还需要一组怎么写不完的模块来处理这些操作。
在倒入一个包的时候,python会根据sys.path中的目录来寻找这个包中包含的子目录。
目录只有包含一个叫做__init__.py的文件才会被认作是一个包,主要为了避免一些滥俗的名字比如string不小心影响搜索路径中的有效模块。
最简单的情况,放一个空的:file:__init__.py就可以了。
当然这个文件中也可以包含一些初始化代码或者为 __all__变量赋值。
8.1用户可以每次只导入一个包里面的特定模块:
import sound.effects.echo #该方式将会导入子模块:sound.effects.echo。必须使用全名去访问 使用时:sound.effects.echo.echofilter(input,output,delay=0.7,atten=4)
8.2 另一种导入子模块方式
from sound.effects import echo #这同样会导入子模块 echo ,并且他不需要那些冗长的前缀,所以可以如下方式使用: echo.echofilter(input,output,delay=0.7,atten=4)
8.3 还有一种变化就是直接倒入一个函数或者变量:
from sound.effects.echo import echofilter #该方法会导入子模块的echo,并且可以直接使用他的echofilter()函数: echofilter(input,output,delay=0.7,atten=4)
注意当时用 from package import item 这种形式的时候,对应的item既可以是包里面的子模块(子包),或者包里面定义的其他名称,比如函数,类及变量。
import语法会首先把item当做一个包定义的名称,如果没找到,再试图按照一个模块去导入。如果还没找到,抛出一个:exc:ImportError异常。
反之,如果使用 import item.subitem.subsubitem 这种导入形式,除了最后一项,都必须是包,而最后一项则可以是模块或者是包,但是不可一世类,函数或者变量的名字。
九、从一个包中导入*
导入语句遵循如下规则:
如果包定义文件 __int__.py存在一个叫 __all__的列表变量,那么在使用 from package import *的时候就把这个 列表中的所有名字作为包内容导入。
当作为包的作者时,可别忘了在更新包之后保证__all__也需要更新。
假如 file:sounds/effects/__init__.py中包含代码 “__all__ = ["echo","surround","reverse"]”
如果__all__ 真的没有被定义,这表示当你使用 from sounde.effects import *这种语法时,就不会导入包sound.effects里的任何子模块。
以上步骤,只是把包sound.effects和它里面定义的所有内容导入进来(可能运行__init__.py里定义的初始化代码)。
这回把__init__.py里定义的所有名字导入进来。并且他不会破坏我们在这句化之前导入的所有明确指定的模块
import sound.effects.echo import sound.effects.surround from sound.effects import * ''' 以上示例中,在执行from...import* 前,sound.effects中的echo 和surround模块都被导入到了当前 命名空间中(如果定义__all__就更没问题了)。 不建议使用*的方法导入模块,因为这种方法经常会使代码的可读性降低。(不过这样倒的确可以省去不少敲键盘的功夫,而且一些模块都设计成了只能通过特定的方法导入)。 机制,使用 from package import special_submodule这种方法永远不会有错。事实上也是一种推荐方法。除非你导入的子模块有可能和其他包的子模块重名。 如果在结构中包是一个子包(比如这个例子中对于包sound来说),而你又想导入兄弟包(同级别的包)你就得使用导入绝对路径来导入。比如,如果模块sound.filters.vocoder 要使用包sound.effects中的模块echo,你需要写成from sound.effects import echo ''' from . import echo from .. import formats from ..filters import equalizer ''' 无论是隐式还是显式的相对导入都是从当前模块开始的。 主模块的名字永远是"__main__",一个python应用程序的主模块,应道总是使用绝对路径引用。 包还提供一个额外的属性__path__。这是一个目录列表,里面包含的目录都有为这个包服务的__init__.py, 你得在其他__init__.py被执行前定义。可以改变这个变量,用来影响包含包里面的模块和子包。 这个功能并不常用,一般用来扩展包里面的模块。 '''