Python-modules(模块)

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__)来显示。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值