当前位置: 首页 > 后端技术 > Python

Python基础:Python中的模块介绍

时间:2023-03-26 01:06:51 Python

[toc]Python的解释环境非常有用,但是如果我们需要编写大型程序,解释环境就不够用了。这时候我们需要将python程序保存在一个文件中。通常这个文件以.py结尾。对于大型应用程序,一个文件可能不够用。这时候我们需要在文件中引用其他文件,所以文件称为模块。模块是包含Python定义和语句的文件。文件名只是模块名称后跟文件后缀.py。在模块内部,模块名称可通过全局变量__name__获得。该模块的基础是前面的斐波那契数列示例。我们已将函数的实现存储在fibo.py文件中:deffib(n):#writeFibonacciseriesuptona,b=0,1whilea>>importfibo直接使用:>>>fibo.fib(1000)01123581321345589144233377610987常用的函数,我们可以把它赋值给一个变量:>>>fib=fibo.fib>>>fib(1000)01123581321345589144233377610987或者,当我们导入时,直接给这个模块一个名字:>>>importfiboasfib>>>fib.fib(500)01123581321345589144233377或者导入模块中的函数:>>>fromfiboimportfibasfibonacci>>>fibonacci(500)01123581321345589144233377每个模块都有自己的专用符号表,用作模块中定义的所有函数的全局符号表。因此,模块的作者可以在模块内使用全局变量,而不必担心与用户的全局变量发生意外冲突。执行模块我们前面提到可以使用import来导入模块,__name__存储模块的名称。像java中的main方法,如果我们想在模块中做一些测试工作,有没有类似java中main方法的写法呢?先看一个例子:if__name__=="__main__":importsysfib(int(sys.argv[1]))在模块中,我们需要判断__name__是否赋值为"__main__"。我们这样执行这个模块:pythonfibo.py当作为脚本执行时,模块的__name__属性将被赋值__main__,这就是示例中为什么这样写的原因。看执行效果:$pythonfibo.py500112358132134如果作为模块导入,则不会执行:>>>importfibo>>>modulesearchpath使用import导入modules时,解释器会首先寻找该名称的内置模块,如果没有找到,解释器会从sys.path变量给出的目录列表中寻找。sys.path的初始目录包括:PYTHONPATH指定的当前目录目录安装dir的默认值要查看模块中定义的内容,可以使用dir函数。>>>a=[1,2,3,4,5]>>>importfibo>>>fib=fibo.fib>>>dir()['__builtins__','__name__','a','fib','fibo','sys']上面的例子列出了当前模块中定义的内容,包括变量、模块、函数等。请注意,dir()不会列出内置函数和变量的名称。如果你想要那些,它们的定义在标准模块内置中。我们可以给dir添加参数,来获取特定模块的内容:>>>importbuiltins>>>dir(builtins)['ArithmeticError','AssertionError','AttributeError','BaseException','BlockingIOError','BrokenPipeError','BufferError','BytesWarning','ChildProcessError','ConnectionAbortedError','ConnectionError','ConnectionRefusedError','ConnectionResetError','DeprecationWarning','EOFError','Ellipsis','EnvironmentError','Exception','False','FileExistsError','FileNotFoundError','FloatingPointError','FutureWarning','GeneratorExit','IOError','ImportError','ImportWarning','IndentationError','IndexError','InterruptedError','IsADirectoryError','KeyError','KeyboardInterrupt','LookupError','MemoryError','NameError','None','NotADirectoryError','NotImplemented','NotImplementedError','OSError','OverflowError','PendingDeprecationWarning','PermissionError','ProcessLookupError','ReferenceError','ResourceWarning','RuntimeError','RuntimeWarning','StopIteration','SyntaxError','SyntaxWarning','SystemError','SystemExit','TabError','TimeoutError','True','TypeError','UnboundLocalError','UnicodeDecodeError','UnicodeEncodeError','UnicodeError','UnicodeTranslateError','UnicodeWarning','UserWarning','ValueError','Warning','ZeroDivisionError','_','__build_class__','__debug__','__doc__','__import__','__name__','__package__','abs','all','any','ascii','bin','bool','bytearray','bytes','callable','chr','classmethod','compile','complex','copyright','credits','delattr','dict','dir','divmod','enumerate','eval','exec','exit','filter','float','format','frozenset','getattr','globals','hasattr','hash','help','hex','id','input','int','isinstance','issubclass','iter','len','license','list','locals','map','max','memoryview','min','next','object','oct','open','ord','pow','print','property','quit','range','repr','reversed','round','set','setattr','slice','sorted','staticmethod','str','sum','super','tuple','type','vars','zip']packagejava那里是包的概念,用来隔离程序代码。Python中也有包。让我们看一个Python包的例子:.py...effects/音效分包__init__.pyecho.pysurround.pyreverse.py...filters/滤镜分包__init__.pyequalizer.pyvocoder.pykaraoke.py...上面我们定义了4包是声音、sound.formats、sound.effects、sound.filters。注意,如果是包,则必须包含__init__.py文件。__init__.py可以是一个空文件,执行包初始化代码,或者设置__all__变量。导入时,python会在sys.path路径下搜索包。导入包的方法有很多种。我们可以导入单个模块:importsound.effects.echo但是这样导入后,使用时必须加载全名:sound.effects.echo.echofilter(input,output,delay=0.7,atten=4)如果你不想加载全名,你可以这样导入:fromsound.effectsimportecho然后你可以这样使用:echo.echofilter(input,output,delay=0.7,atten=4)你也可以直接导入模块中的方法:fromsound.effects.echoimportechofilter然后这样使用:echofilter(input,output,delay=0.7,atten=4)如果一个包中有很多子包,我们可能想用*一次导入:fromsound.effectsimport*那么如何控制导入哪个效果子包呢?我们可以在__init__.py中定义一个名为__all__的列表,在这个列表中列出要导出的分包名称,如下:__all__=["echo","surround","reverse"]likethisfromsound.effectsimport*将导入声音包的三个命名子模块。如果未定义__all__,则fromsound.effectsimport*语句不会将包sound.effects中的所有子模块导入当前命名空间;它只导入包sound.effects。包导入的相对路径可以指定一个相对路径,我们使用.表示当前包,用..表示父包。如下图:从。importechofrom..importformatsfrom..filtersimportequalizer教程,很多你不知道的小技巧等你来发现!欢迎关注我的公众号:《程序那些事儿》,懂技术,更懂你!