您的位置:首页 > 编程语言 > Python开发

Python-modules(模块)

2016-01-20 16:57 609 查看

Python模块以及导入模块

Python中一个模块是一个包含Python定义和语句的文件。一个模块中的定义,可以导入到其他模块或主模块。

例如创建一个Fibonacci.py文件如下:

#Fibonacci numbers module
#path = e:\workspace\python\modules\Fibonacci.py
def fib(n):
result = []
a, b = 0, 1
while b < n:
result.append(b)
a, b = b, a+b
return result


然后在命令行中切换到Fibonacci.py文件的存放路径,再打开Python解释器执行以下命令:

>>> import Fibonacci
>>> Fibonacci.fib(100)
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]


如果需要经常使用这个函数,也可以将这个函数定义一个本地名称:

>>> import Fibonacci
>>> fib = Fibonacci.fib
>>> fib(1000)
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987]


模块的名称就是文件名,在模块中可以通过全局变量__name__来获取使用模块名:

>>> import Fibonacci
>>> Fibonacci.__name__
'Fibonacci'


每个模块都有自己私有的全局标记表,所以模块和模块之间不会出现符号冲突。

有一种变种的模块导入语句,从模块导入模块全局标记表的名称,例如:

>>> from Fibonacci import fib
>>> Fibonacci.fib(10000)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'Fibonacci' is not defined
>>> fib(10000)
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765]


这个导入语句并没有把模块名放到本地符号表中,所以在使用Fibonacci时会出现NameError: name ‘Fibonacci’ is not defined。而直接使用fib则可正常执行。

可以通过以下导入语句将模块的全局符号表中不是以下划线(_)开头的所有符号导入到本地符号表中:

>>> from Fibonacci import *
>>> fib(10000)
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765]


但是这种方式不可取,因为会降低代码的可读性。

把python模块当做可执行脚本

把上面的例子文件修改如下:

#Fibonacci numbers module
#path = e:\workspace\python\modules\Fibonacci.py
def fib(n):
result = []
a, b = 0, 1
while b < n:
result.append(b)
a, b = b, a+b
return result
if __name__ == '__main__':
import sys
print __name__
print fib(int(sys.argv[1]))


然后到py文件所在的目录执行以下命令:

E:\workspace\python\modules>python Fibonacci.py 100
__main__
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]


可以看到脚本可以正常执行,且当前脚本文件的全局变量__name__的值为__main__。

我们依旧可以将这个py文件作为模块在Python解释器或者py文件中导入,例如:

>>> import Fibonacci
>>> Fibonacci.__name__
'Fibonacci'>>>


可以看到,在作为模块导入的时候,脚本并没有执行,并且模块名仍然是Fibonacci。

dir()函数

内置函数dir()用来查找制定模块定义了哪些符号,包括变量、模块和函数等,它返回一个字符串list。

>>> import sys
>>> dir(sys)
['__displayhook__', '__doc__', '__excepthook__', '__name__', '__package__', '__s
tderr__', '__stdin__', '__stdout__', '_clear_type_cache', '_current_frames', '_g
etframe', '_mercurial', 'api_version', 'argv', 'builtin_module_names', 'byteorde
r', 'call_tracing', 'callstats', 'copyright', 'displayhook', 'dllhandle', 'dont_
write_bytecode', 'exc_clear', 'exc_info', 'exc_type', 'excepthook', 'exec_prefix
', 'executable', 'exit', 'flags', 'float_info', 'float_repr_style', 'getcheckint
erval', 'getdefaultencoding', 'getfilesystemencoding', 'getprofile', 'getrecursi
onlimit', 'getrefcount', 'getsizeof', 'gettrace', 'getwindowsversion', 'hexversi
on', 'long_info', 'maxint', 'maxsize', 'maxunicode', 'meta_path', 'modules', 'pa
th', 'path_hooks', 'path_importer_cache', 'platform', 'prefix', 'ps1', 'ps2', 'p
y3kwarning', 'setcheckinterval', 'setprofile', 'setrecursionlimit', 'settrace',
'stderr', 'stdin', 'stdout', 'subversion', 'version', 'version_info', 'warnoptio
ns', 'winver']


dir()函数不会返回内置的函数和变量,如果希望显示它们,可以通过dir(__builtin__)来显示。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: