模块定义
一个包含所有定义的函数和变量的文件,后缀名是.py
,模块可以被别的程序引入,被调用,如同库一样。
import
- 使用
import
来引入模块,每个模块中有着自己的内容,同样引入别的.py
模块 也是使用import 进行调用。 - 当解释器遇到import语句,会优先搜索当前的搜索路径,
- 一个模块只会被导入一次,无论执行多少遍
- 搜索路径是在Python编译或安装的时候确定的,安装新的库应该也会修改。搜索路径被存储在sys模块中的path变量,做一个简单的实验,在交互式解释器中,
from…import
- 从整体模块中导入指定的模块
from modname import name1[,name2.。。]
- 从整体模块中导入所有的模块
from modname import *
模块深入
-
模块除了方法定义,还可以包括可执行的代码。这些代码一般用来初始化这个模块。这些代码只有在第一次被导入时才会被执行。
-
每个模块有各自独立的符号表,在模块内部为所有的函数当作全局符号表来使用。
也就是模块内部的变量并不影响外部,该是全局还是全局变量
-
模块中也可以导入模块
-
也可以只导入模块中特定的部分
form modname import one,two..
,比如函数、变量等。这个时候的modname是没有被导入如符号表中,只有one,two被导入了 -
from modname import *
导入模块中的所有内容,这将把所有的名字都导入进来,但是那些由单一下划线(_)开头的名字不在此例。因为引入的其它来源的命名,很可能覆盖了已有的定义。
>>> from fibo import fib, fib2
>>> fib(500)
1 1 2 3 5 8 13 21 34 55 89 144 233 377
__name__属性
:能够使得模块中的某一内容,在被别人引用的时候不被调用。每个模块都有一个__name__属性,当其值是'__main__'时,表明该模块自身在运行,否则是被引入。
,每一个模块都有__name__
属性
if __name__ == '__main__':
print('程序自身在运行')
else:
print('我来自另一模块')
dir(modname)
内置函数,能够找到模块内定义的所有名称,返回字符串列表
,如果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'