python模块

本文译自https://docs.python.org/2.7/tutorial/。完全是出于个人兴趣翻译的,请勿追究责任。另外,谢绝商业牟利。刊印请与本人和原作者联系,无授权不得刊印,违者必究其责任。如需转发,请注明来源,并保留此行,尊重本人的劳动成果,谢谢。

来源:优快云博客

作者:奔跑的QQEE

python 版本:2.7.13

(本文有删改)

python模块

一、综述

退出python解释器后再打开,上次写的所有方法,变量都已被销毁。如果想让命令保存更久,可将之以文本形式保存,而在执行时将内容读入。

python用一文件保存多个定义,而在另一python文件中调用它们。保存定义的文件叫作模块。模块间可互相调用。

模块不仅保存了定义,还保存了其它python语句。模块文件名是模块名加上后缀.py 。模块名可用全局变量__name__得到。例,首先建一python文件,名为 fibo.py;

# fibo.py

def fib(n):    
    a, b = 0, 1
    while b < n:
        print b,
        a, b = b, a+b

def fib2(n):   
    result = []
    a, b = 0, 1
    while b < n:
        result.append(b)
        a, b = b, a+b
    return result

然后,打开python 解释器。键入命令

>>> import fibo # 导入模块 fibo

调用 fibo.py 中定义的函数时,不应直接调用函数。正确的调用形式是模块名.函数名() 。例:

>>> fibo.fib(1000)
1 1 2 3 5 8 13 21 34 55 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 34 55 89 144 233 377
二、细节

模块里的可执行语句用于初始化此模块。每个模块都有一个仅用于此模块的符号表。该符号表可被此模块中定义的所有方法使用。

不同模块可互相调用。被导模块名会加入到主调模块的全局变量表中。

有各种各样的imprt语句。例:

>>> from fibo import fib, fib2  # 从 fibo 模块中导入fib,fib2
>>> fib(500)
1 1 2 3 5 8 13 21 34 55 89 144 233 377

>>> from fibo import *  #从 fibo 模块导入所有除下划线(_)开头的名称
>>> fib(500)
1 1 2 3 5 8 13 21 34 55 89 144 233 377

注意import * from 某模块/包是不正确的语法。

如此运行python 文件时:

python fibo.py <arguments>

其中的代码将被执行。变量__name__将被置为"__main__"。如果在某块尾添加代码

if __name__ == "__main__":
    import sys
    fib(int(sys.argv[1]))

就可将该模块当作脚本文件执行。因为解析命令行的代码仅在该模块是主文件时运行。例:

$ python fibo.py 50
1 1 2 3 5 8 13 21 34

如果该模块已被导入,import fibo将不起作用。

三、路径

假如要导入一叫 spam 的模块。解释器首先会根据此名称在内置模块中查找。若未找到

,会在sys.path定义的目录列表中查找名为spam.py的文件。

四、解释python(解释型语言)文件

spam.py 解释后的文件是spam.pyc。该文件是spam.py解释后的二进制文件,可快速响应python程序;其中不仅记录了解释后的python命令,而且还记录了文件的修改日期。若spam.pyspam.pyc的修改日期不一致,那么执行spam.py时将忽略现存的spam.pyc文件。

通常不用手动创建.pyc文件。.py文件解释成功后,解释器会尝试将编译后的二进制数据写入.pyc文件中。若尝试失败并不出错;若由于某种原因未写入完全,此时的.pyc文件是不合法的,执行.py程序时将被忽略。

.pyc文件具有平台无关性。因此python模块可在不同架构的机器上运行。

  • 当python命令中加参数-o时,将会把.py文件优化并存储在.pyo文件中。例:python -O -m py_compile xx.py

  • 传递两个-o参数表示进一步优化.py文件。优化时将__doc__从字节码中移除。但某些程序会依赖于此,因此有可能会导致程序出错。

  • 读取.pyc.pyo文件并不比读取.py文件更快。使得执行.pyc.pyo文件更快的原因是加载它们的速度更快。
  • 让脚本执行更快的方法是将脚本中的代码置于一个或多个模块中,而添加一个导入了这些模块的很小的引导文件。
  • 只有.pyc.pyo文件而没有.py文件也是可以的。
五、标准模块

python有一标准模块库,有单独的文档来描述——python库参考(后来叫库参考)。一些模块已内置到了解释器中。例如,为windows操作系统提供了专门的winreg模块;sys.ps1 sys.ps2 分别定义了第一,第二提示符。

>>> import sys
>>> sys.ps1
'>>> '
>>> sys.ps2
'... '
>>> sys.ps1 = 'C> '
C> print 'Yuck!'
Yuck!
C>

这两个变量仅在解释器处在交互模式下才能定义。

变量sys.path是一个规定了解释器搜索路径的字符串列表。默认取变量PYTHONPATH规定的值;若此值未设定,则取系统规定的PYTHONPATH值。可这样修改此值:

>>> import sys
>>> sys.path.append('/ufs/guido/lib/python')
六、dir()函数

dir()函数将列出待查模块中所有变量,模块,函数的名称,并以排序后的字符串列表形式返回。

>>> import fibo, sys
>>> dir(fibo)
['__name__', 'fib', 'fib2']
>>> dir(sys)  
['__displayhook__', '__doc__', '__excepthook__', '__name__', '__package__',
 '__stderr__', '__stdin__', '__stdout__', '_clear_type_cache',
 '_current_frames', '_getframe', '_mercurial', 'api_version', 'argv',
 'builtin_module_names', 'byteorder', 'call_tracing', 'callstats',
 'copyright', 'displayhook', 'dont_write_bytecode', 'exc_clear', 'exc_info',
 'exc_traceback', 'exc_type', 'exc_value', 'excepthook', 'exec_prefix',
 'executable', 'exit', 'flags', 'float_info', 'float_repr_style',
 'getcheckinterval', 'getdefaultencoding', 'getdlopenflags',
 'getfilesystemencoding', 'getobjects', 'getprofile', 'getrecursionlimit',
 'getrefcount', 'getsizeof', 'gettotalrefcount', 'gettrace', 'hexversion',
 'long_info', 'maxint', 'maxsize', 'maxunicode', 'meta_path', 'modules',
 'path', 'path_hooks', 'path_importer_cache', 'platform', 'prefix', 'ps1',
 'py3kwarning', 'setcheckinterval', 'setdlopenflags', 'setprofile',
 'setrecursionlimit', 'settrace', 'stderr', 'stdin', 'stdout', 'subversion',
 'version', 'version_info', 'warnoptions']

若没有指定参数,dir()将返回当前程序中定义的所有内容。

>>> a = [1, 2, 3, 4, 5]
>>> import fibo
>>> fib = fibo.fib
>>> dir()
['__builtins__', '__name__', '__package__', 'a', 'fib', 'fibo', 'sys']

dir()并不会返回内置的函数名和变量名。若要返回,应引入模块__builtin__

>>> import __builtin__
>>> dir(__builtin__)  
['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException',
 'BufferError', 'BytesWarning', 'DeprecationWarning', 'EOFError',
 'Ellipsis', 'EnvironmentError', 'Exception', 'False', 'FloatingPointError',
 'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError', 'ImportWarning',
 'IndentationError', 'IndexError', 'KeyError', 'KeyboardInterrupt',
 'LookupError', 'MemoryError', 'NameError', 'None', 'NotImplemented',
 'NotImplementedError', 'OSError', 'OverflowError',
 'PendingDeprecationWarning', 'ReferenceError', 'RuntimeError',
 'RuntimeWarning', 'StandardError', 'StopIteration', 'SyntaxError',
 'SyntaxWarning', 'SystemError', 'SystemExit', 'TabError', 'True',
 'TypeError', 'UnboundLocalError', 'UnicodeDecodeError',
 'UnicodeEncodeError', 'UnicodeError', 'UnicodeTranslateError',
 'UnicodeWarning', 'UserWarning', 'ValueError', 'Warning',
 'ZeroDivisionError', '_', '__debug__', '__doc__', '__import__',
 '__name__', '__package__', 'abs', 'all', 'any', 'apply', 'basestring',
 'bin', 'bool', 'buffer', 'bytearray', 'bytes', 'callable', 'chr',
 'classmethod', 'cmp', 'coerce', 'compile', 'complex', 'copyright',
 'credits', 'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval',
 'execfile', 'exit', 'file', 'filter', 'float', 'format', 'frozenset',
 'getattr', 'globals', 'hasattr', 'hash', 'help', 'hex', 'id', 'input',
 'int', 'intern', 'isinstance', 'issubclass', 'iter', 'len', 'license',
 'list', 'locals', 'long', 'map', 'max', 'memoryview', 'min', 'next',
 'object', 'oct', 'open', 'ord', 'pow', 'print', 'property', 'quit',
 'range', 'raw_input', 'reduce', 'reload', 'repr', 'reversed', 'round',
 'set', 'setattr', 'slice', 'sorted', 'staticmethod', 'str', 'sum', 'super',
 'tuple', 'type', 'unichr', 'unicode', 'vars', 'xrange', 'zip']
七、包

包使得python模块的命名空间结构化。例,A.B表明B模块包含于A模块。看个例子:

sound/                          #最顶级的包,sound
      __init__.py               #sound包的初始化文件,没有此文件sound便不是包
      formats/                  #子包formats
              __init__.py
              wavread.py
              wavwrite.py
              aiffread.py
              aiffwrite.py
              auread.py
              auwrite.py
              ...
      effects/                  #子包effects
              __init__.py       #子包的初始化文件,没有此文件effects便不是包
              echo.py
              surround.py
              reverse.py
              ...
      filters/                  #子包filters
              __init__.py       #子包的初始化文件,没有此文件filters便不是包
              equalizer.py
              vocoder.py
              karaoke.py
              ...

导入包时,python会根据sys.path定义的路径搜索包。

__init__.py存在时,对应目录才能算是包。该文件可为空。

可导入包中的某个模块,例:

import sound.effects.echo

调用某方法时用完整名,

sound.effects.echo.echofilter(input, output, delay=0.7, atten=4)

另一种方法是:

from sound.effects import echo

调用某方法时可这样做:

echo.echofilter(input, output, delay=0.7, atten=4)

也可用第二种方法直接导入某方法:

from sound.effects.echo import echofilter

调用时这样做:

echofilter(input, output, delay=0.7, atten=4)

注意:用格式from 包 import 项导入项时,项可以是子模块、子包、函数名、类名,变量名。导入前首先检测是否存在指定项。若没有,系统假定指定项是个模块并尝试导入它。查无此项便失败,返回ImportError类型的异常。而用格式import 项.子项.子项的子项导入项时,除最后一项外,其他项必须是包,而最后一项可以是模块,也可以是包,但不能是上一项中定义的类,函数,变量。

八、import * from 包

想象下用from sound.effects import *会发生什么?理论上会找到出现在包中的子模块,然后将它们全部导入。这要花费很长事件,而且可能会出现意想不到的问题。

如果__init__.py文件中定义了名为__all__的列表,那么就会将__all__中规定的模块导入。例:

#sound/effects/__init__.py

__all__ = ["echo", "surround", "reverse"]

执行命令

 from sound.effects import *

将导入sound/effects 包中三个名为echosurroundreverse的模块。

如果没有定义__all__列表,from sound.effects import *不会将sound/effects下的所有子模块导入,只是将包sound.effects导入。

事实上,推荐使用from 包 import 指定模块,因为有时需要导入不同包内同名的模块。

九、包内引用

子模块间经常需要互相引用。

例如,surrond模块可能要引用echo模块。surrond模块只需使用import echofrom echo import sth即可。如果当前包内找不到被导模块,那么就去上级模块查找。

再如,如果模块sound.filters.vocoder需要引用sound.effects中的echo模块,只需这样做:

from sound.effects import echo
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值