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__)来显示。
相关文章推荐
- python升级2.7
- Sublime Text搭建python调试环境
- python获取zabbix监控图
- 廖雪峰python教程笔记01
- python中 __getattr__(self,name)和__setattr__(self,name,value)的使用
- Python模拟百度登录实例详解
- 【LEETCODE】129-Sum Root to Leaf Numbers [Python]
- python 日志增量抓取实现
- Xcode7 运行Python
- flask(web服务器)—Python(四)
- 在 pythonanywhere 上搭建 django 程序(Virtualenv+python2.7+django1.8)
- python自动下载图片
- python笔记1
- Python变量类型
- Python学习之路-初学篇之初识python(一):
- Python的Scrapy爬虫框架简单学习笔记
- Python几种常用的测试框架
- python time模块的使用
- Python3 持久化pickle模块
- Python入门