python3模块⼤全_Python3模块菜鸟教程
Python3 模块
在前⾯的⼏个章节中我们脚本上是⽤ python 解释器来编程,如果你从 Python 解释器退出再进⼊,那么你定义的所有的⽅法和变量就都消失了。
为此 Python 提供了⼀个办法,把这些定义存放在⽂件中,为⼀些脚本或者交互式的解释器实例使⽤,这个⽂件被称为模块。
模块是⼀个包含所有你定义的函数和变量的⽂件,其后缀名是.py。模块可以被别的程序引⼊,以使⽤该模块中的函数等功能。这也是使⽤python 标准库的⽅法。
下⾯是⼀个使⽤ python 标准库中模块的例⼦。
实例(Python 3.0+)
#!/usr/bin/python3
# ⽂件名: using_sys.py
import sys
python菜鸟教程文档print('命令⾏参数如下:')
for i in sys.argv:
print(i)
print('\n\nPython 路径为:', sys.path, '\n')
执⾏结果如下所⽰:
$ python using_sys.py 参数1 参数2
命令⾏参数如下:
using_sys.py
参数1
参数2
Python 路径为: ['/root', '/usr/lib/python3.4', '/usr/lib/python3.4/plat-x86_64-linux-gnu', '/usr/lib/python3.4/lib-dynload',
'/usr/local/lib/python3.4/dist-packages', '/usr/lib/python3/dist-packages']
1、import sys 引⼊ python 标准库中的 sys.py 模块;这是引⼊某⼀模块的⽅法。
2、sys.argv 是⼀个包含命令⾏参数的列表。
3、sys.path 包含了⼀个 Python 解释器⾃动查所需模块的路径的列表。
import 语句
想使⽤ Python 源⽂件,只需在另⼀个源⽂件⾥执⾏ import 语句,语法如下:
import module1[, module2[,... moduleN]
当解释器遇到 import 语句,如果模块在当前的搜索路径就会被导⼊。
搜索路径是⼀个解释器会先进⾏搜索的所有⽬录的列表。如想要导⼊模块 support,需要把命令放在脚本的顶端:
support.py ⽂件代码
#!/usr/bin/python3
# Filename: support.py
def print_func( par ):
print ("Hello : ", par)
return
test.py 引⼊ support 模块:
test.py ⽂件代码
#!/usr/bin/python3
# Filename: test.py
# 导⼊模块
import support
# 现在可以调⽤模块⾥包含的函数了
support.print_func("Runoob")
以上实例输出结果:
$ python3 test.py
Hello : Runoob
⼀个模块只会被导⼊⼀次,不管你执⾏了多少次import。这样可以防⽌导⼊模块被⼀遍⼜⼀遍地执⾏。
当我们使⽤import语句的时候,Python解释器是怎样到对应的⽂件的呢?
这就涉及到Python的搜索路径,搜索路径是由⼀系列⽬录名组成的,Python解释器就依次从这些⽬录中去寻所引⼊的模块。
这看起来很像环境变量,事实上,也可以通过定义环境变量的⽅式来确定搜索路径。
搜索路径是在Python编译或安装的时候确定的,安装新的库应该也会修改。搜索路径被存储在sys模块中的path变量,做⼀个简单的实验,在交互式解释器中,输⼊以下代码:
>>> import sys
>>> sys.path
['', '/usr/lib/python3.4', '/usr/lib/python3.4/plat-x86_64-linux-gnu', '/usr/lib/python3.4/lib-dynload',
'/usr/local/lib/python3.4/dist-packages', '/usr/lib/python3/dist-packages']
>>>
sys.path 输出是⼀个列表,其中第⼀项是空串'',代表当前⽬录(若是从⼀个脚本中打印出来的话,可以更清楚地看出是哪个⽬录),亦即我们执⾏python解释器的⽬录(对于脚本的话就是运⾏的脚本所在的⽬录)。
因此若像我⼀样在当前⽬录下存在与要引⼊模块同名的⽂件,就会把要引⼊的模块屏蔽掉。
了解了搜索路径的概念,就可以在脚本中修改sys.path来引⼊⼀些不在搜索路径中的模块。
现在,在解释器的当前⽬录或者 sys.path 中的⼀个⽬录⾥⾯来创建⼀个fibo.py的⽂件,代码如下:
实例
# 斐波那契(fibonacci)数列模块
def fib(n): # 定义到 n 的斐波那契数列
a, b = 0, 1
while b < n:
print(b, end=' ')
a, b = b, a+b
print()
def fib2(n): # 返回到 n 的斐波那契数列
result = []
a, b = 0, 1
while b < n:
result.append(b)
a, b = b, a+b
return result
然后进⼊Python解释器,使⽤下⾯的命令导⼊这个模块:
>>> import fibo
这样做并没有把直接定义在fibo中的函数名称写⼊到当前符号表⾥,只是把模块fibo的名字写到了那⾥。可以使⽤模块名称来访问函数:
实例
>>>fibo.fib(1000)
1 1
2
3 5 8 13 21 3
4 5
5 89 144 233 377 610 987
>>> fibo.fib2(100)
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
>>> fibo.__name__
'fibo'
如果你打算经常使⽤⼀个函数,你可以把它赋给⼀个本地的名称:
>>> fib = fibo.fib
>>> fib(500)
1 1
2
3 5 8 13 21 3
4 5
5 89 144 233 377
from … import 语句
Python 的 from 语句让你从模块中导⼊⼀个指定的部分到当前命名空间中,语法如下:
from modname import name1[, name2[, ... nameN]]
例如,要导⼊模块 fibo 的 fib 函数,使⽤如下语句:
>>> from fibo import fib, fib2
>>> fib(500)
1 1
2
3 5 8 13 21 3
4 5
5 89 144 233 377
这个声明不会把整个fibo模块导⼊到当前的命名空间中,它只会将fibo⾥的fib函数引⼊进来。
from … import * 语句
把⼀个模块的所有内容全都导⼊到当前的命名空间也是可⾏的,只需使⽤如下声明:
from modname import *
这提供了⼀个简单的⽅法来导⼊⼀个模块中的所有项⽬。然⽽这种声明不该被过多地使⽤。
深⼊模块
模块除了⽅法定义,还可以包括可执⾏的代码。这些代码⼀般⽤来初始化这个模块。这些代码只有在第⼀次被导⼊时才会被执⾏。
每个模块有各⾃独⽴的符号表,在模块内部为所有的函数当作全局符号表来使⽤。
所以,模块的作者可以放⼼⼤胆的在模块内部使⽤这些全局变量,⽽不⽤担⼼把其他⽤户的全局变量搞混。
从另⼀个⽅⾯,当你确实知道你在做什么的话,你也可以通过 modname.itemname 这样的表⽰法来访问模块内的函数。
模块是可以导⼊其他模块的。在⼀个模块(或者脚本,或者其他地⽅)的最前⾯使⽤ import 来导⼊⼀个模块,当然这只是⼀个惯例,⽽不是强制的。被导⼊的模块的名称将被放⼊当前操作的模块的符号表中。
还有⼀种导⼊的⽅法,可以使⽤ import 直接把模块内(函数,变量的)名称导⼊到当前操作模块。⽐如:
>>> from fibo import fib, fib2
>>> fib(500)
1 1
2
3 5 8 13 21 3
4 5
5 89 144 233 377
这种导⼊的⽅法不会把被导⼊的模块的名称放在当前的字符表中(所以在这个例⼦⾥⾯,fibo 这个名称是没有定义的)。
这还有⼀种⽅法,可以⼀次性的把模块中的所有(函数,变量)名称都导⼊到当前模块的字符表:
>>> from fibo import *
>>> fib(500)
1 1
2
3 5 8 13 21 3
4 5
5 89 144 233 377
这将把所有的名字都导⼊进来,但是那些由单⼀下划线(_)开头的名字不在此例。⼤多数情况, Python程序员不使⽤这种⽅法,因为引⼊的其它来源的命名,很可能覆盖了已有的定义。
__name__属性
⼀个模块被另⼀个程序第⼀次引⼊时,其主程序将运⾏。如果我们想在模块被引⼊时,模块中的某⼀程序块不执⾏,我们可以⽤__name__属性来使该程序块仅在该模块⾃⾝运⾏时执⾏。
#!/usr/bin/python3
# Filename: using_name.py
if __name__ == '__main__':
print('程序⾃⾝在运⾏')
else:
print('我来⾃另⼀模块')
运⾏输出如下:
$ python using_name.py
程序⾃⾝在运⾏
$ python
>>> import using_name
我来⾃另⼀模块
>>>
说明:
每个模块都有⼀个__name__属性,当其值是'__main__'时,表明该模块⾃⾝在运⾏,否则是被引⼊。说明:__name__ 与 __main__ 底下是双下划线, _ _ 是这样去掉中间的那个空格。
dir() 函数
内置的函数 dir() 可以到模块内定义的所有名称。以⼀个字符串列表的形式返回:
>>> import fibo, sys
>>> dir(fibo)
['__name__', 'fib', 'fib2']
>>> dir(sys)
['__displayhook__', '__doc__', '__excepthook__', '__loader__', '__name__',
'__package__', '__stderr__', '__stdin__', '__stdout__',
'_clear_type_cache', '_current_frames', '_debugmallocstats', '_getframe',
'_home', '_mercurial', '_xoptions', 'abiflags', 'api_version', 'argv',
'base_exec_prefix', 'base_prefix', 'builtin_module_names', 'byteorder',
'call_tracing', 'callstats', 'copyright', 'displayhook',
'dont_write_bytecode', 'exc_info', 'excepthook', 'exec_prefix',
'executable', 'exit', 'flags', 'float_info', 'float_repr_style',
'getcheckinterval', 'getdefaultencoding', 'getdlopenflags',
'getfilesystemencoding', 'getobjects', 'getprofile', 'getrecursionlimit',
'getrefcount', 'getsizeof', 'getswitchinterval', 'gettotalrefcount',
'gettrace', 'hash_info', 'hexversion', 'implementation', 'int_info',
'intern', 'maxsize', 'maxunicode', 'meta_path', 'modules', 'path',
'path_hooks', 'path_importer_cache', 'platform', 'prefix', 'ps1',
'setcheckinterval', 'setdlopenflags', 'setprofile', 'setrecursionlimit',
'setswitchinterval', 'settrace', 'stderr', 'stdin', 'stdout',
'thread_info', 'version', 'version_info', 'warnoptions']
如果没有给定参数,那么 dir() 函数会罗列出当前定义的所有名称:
>>> a = [1, 2, 3, 4, 5]
>>> import fibo
>>> fib = fibo.fib
>>> dir() # 得到⼀个当前模块中定义的属性列表
['__builtins__', '__name__', 'a', 'fib', 'fibo', 'sys']

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。