python 2.7 中文教程及自动化测试介绍(4)

模块

退出Python解释器再重新进入,函数和变量等的定义都会丢失。 较大的程序使用文本编辑器编辑的文件作为执行输入更好,即创建脚本。 程序变很长时可将它分割成几个更易于维护的文件。你也可能想在几个程序中使用相同的函数,而不是拷贝代码。

Python可在文件中定义,在脚本或者解释器中使用。这样的文件即模块。模块中的定义可导入到其他模块或主模块中(即脚本顶层或命令行可以访问的变量集)。

模块是包含Python定义和语句的文件。文件名就是模块名加上.py 缀。模块名可以由全局变量name 获取。实例:fibo.py:

# Fibonacci numbers module

def fib(n):    # write Fibonacci series up to n
    a, b = 0, 1
    while b < n:
        print b,
        a, b = b, a+b
        
def fib2(n): # return Fibonacci series up to n
    result = []
    a, b = 0, 1
    while b < n:
        result.append(b)
        a, b = b, a+b
    return result

命令行导入:

>>> import fibo

调用

>>> 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

深入模块

除了函数定义,模块也可以包含可执行语句。这些语句一般用来初始化模块。它们仅在第一次导入时执行。要强行加载,可以使用reload(modulename)。

每个模块都有自己私有的符号表,模块内所有的函数将其作为全局符号表使用。 因此模块内部使用全局变量不会和用户的全局变量发生冲突。通过modname.itemname可以引用模块的全局变量。

模块中可以导入其他的模块。 建议导入放在头部。

导入的另外一种形式:不导入模块名,直接导入函数、类、变量等。

>>> from fibo import fib, fib2
>>> fib(500)
1 1 2 3 5 8 13 21 34 55 89 144 233 377

这样不会从局域语义表中导入模块名(如上所示, fibo 没有定义)。

甚至有种方式可以导入模块中的所有定义:

>>> from fibo import fib, fib2
>>> fib(500)
1 1 2 3 5 8 13 21 34 55 89 144 233 377

还可以导入所有非私有的定义:

>>> from fibo import *
>>> fib(500)
1 1 2 3 5 8 13 21 34 55 89 144 233 377

这样可以导入所有非下划线开头的命名。因为可读性不好,一般不推荐使用。但是可以用不过来保存交付式会话。
需要注意的是在实践中往往不鼓励从一个模块或包中使用 * 导入所有,因为这样会让代码变得很难读。不过在交互式会话中很方便。

用脚本的方式执行模块

执行方式:

python fibo.py <arguments>

此时name 设置为"main",这样根据是否是主文件判断执行。比如在fibo.py添加内容:

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。sys.path定义的位置如下:

  • 当前目录
  • PYTHONPATH变量(类似shell的PATH)
  • Python默认的安装目录

初始化之后可以修改sys.path。注意因为当前的目录的优先级较高,尽量不要存在和其他模块名字相同的文件。这是个常见错误。

“编译的” Python 文件

python的字节码文件后缀pyc,以修改时间做为版本号,如果文件没有修改,会直接调用pyc文件而不是py文件,反之调用py文件并生成pyc文件,pyc文件如果生成失败也没有关系。PHP需要每次都编译,所以python的效率会明显比PHP高。

通常你不需要为创建 spam.pyc 文件做任何工作。一旦 spam.py 成功编译,就会尝试生成对应版本的 spam.pyc 。如果有任何原因导致写入不成功,生成的 spam.pyc 文件就会视为无效,随后即被忽略。 spam.pyc 文件的内容是平台独立的,所以 Python 模块目录可以在不同架构的机器之间共享。

部分高级技巧:

以 -O 参数调用Python 解释器时会生成优化代码并保存在.pyo文件中。目前只是删除了assert语句。pyo文件的优先级高过pyc。
    -OO比-O更深一层,删除了文档字符串。因为某些程序依赖于这些变量的可用性,但个别情况下会导致程序不能执行。
    .pyc和.pyo只能提高加载速度,不能提高执行速度。
    指定文件名在命令行执行时,不会生成.pyc或.pyo文件。所以import动作放入专门的导入模块更好。当然也可以手工创建.pyc 或 .pyo 文件。
    可以只发布.pyc或.pyo文件而不发布py文件,加大逆向工程的难度。
    compileall 模块为指定目录中的所有模块创建 .pyc 文件(或者使用-O参数创建 .pyo 文件)。

标准模块

Python有一些标准模块库模块为了效率或者系统调用内置于解释器之中,有些可能不是跨平台的。例winreg 模块在 Windows系统上才有。有一个具体的模块值得注意: sys的变量 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表示A模块中包含了B模块。这样可以避免多个模块之间的命名冲突。

假设你现在想要设计一个模块集(包)来统一处理声音文件和声音数据。存在几种不同的声音格式(通常由它们的扩展名来标识,例如:.wav, .aiff, .au)。为了处理不同类型的文件格式之间转换,你需要维护不断增长的模块集合。还要对声音数据做很多不同的操作(例如混音,添加回声,均衡,艺术效果),所以需要大量模块,结构如下:

sound/                          Top-level package
      __init__.py               Initialize the sound package
      formats/                  Subpackage for file format conversions
              __init__.py
              wavread.py
              wavwrite.py
              aiffread.py
              aiffwrite.py
              auread.py
              auwrite.py
              ...
      effects/                  Subpackage for sound effects
              __init__.py
              echo.py
              surround.py
              reverse.py
              ...
      filters/                  Subpackage for filters
              __init__.py
              equalizer.py
              vocoder.py
              karaoke.py
              ...

包目录中必须包含 init.py 文件,包的查找方式和模块类似。这样可以避免不相关的包名覆盖模块名。 init.py 可以是空文件,也可以有初始化代码或设置all变量。

导入包里的特定模块,例如:

import sound.effects.echo

这样就导入了 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 package import item中的item既可是包中的子模块(包),也可以是包中定义的其它名字,像函数、类或变量。import先检查包中是否有,如果没有回当做模块来加载,再找不到它,会引发ImportError 异常。

相反import item.subitem.subsubitem中每个子项必须是包,最后的子项可以是包或模块,但不能是类、函数或变量等。
import *

看上去from sound.effects import *会导入所有子模块,花掉很长时间,不过包中是根据all列表来处理的。

effects目录的init.py文件如果定义了all, 上述命令就只会导入该列表对应的子模块。比如:

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

如果没有定义 all , from sound.effects import * 语句不会从sound.effects 包中导入所有的子模块,它只保证导入了sound.effects,执行了 init.py, 并导入前面已经导入过的模块:

import sound.effects.echo
import sound.effects.surround
from sound.effects import *

import * 不是建议的写法。推荐from Package import specific_submodule,但是主要不要有重名。
包内引用

绝对路径:

from sound.effects import echo

相对路径:

from . import echo
    from .. import formats
    from ..filters import equalizer

引用

包的特殊属性path指定了包中包含了init.py文件的目录,可以修改用于扩展,但是很少使用

参考资料

时间: 2024-10-11 17:28:42

python 2.7 中文教程及自动化测试介绍(4)的相关文章

python 2.7 中文教程及自动化测试介绍(2)

流程控制 除了前面介绍的 while 语句,Python还更多的流程控制工具. if语句 >>> x = int(raw_input("Please enter an integer: ")) Please enter an integer: 42 >>> if x < 0: ...     x = 0 ...     print 'Negative changed to zero' ... elif x == 0: ...     print

python 2.7 中文教程及自动化测试介绍(1)

简介 Python是一门简单易学,功能强大的编程语言.它具有高效的高层次数据结构,简单但有效的方式支持面向对象编程,语法优雅,动态类型,解释执行.使之成为多数平台上很多领域的脚本和快速应用开发的理想语言. Python解释器及其丰富的标准库的源码或者二进制版本可以从http://www.python.org/免费获取和转发.该还包含很多免费的第三方Python模块.程序.工具的发布链接及附加文档. Python的解释器很容易用C或C++(或其他c可以调用的语言)扩展新功能和数据类型. Pytho

python 2.7 中文教程及自动化测试介绍(3) -- 待整理

数据结构 本章详细讨论一些已学知识,并引入了一些新知识.列表的详细介绍 列表的所有方法如下: list.append(x):附加元素到列表末端,相当于a[len(a):] = [x].    list.extend(L):附加列表L的内容到当前列表后面,相当于 a[len(a):] = L .    list.insert(i, x):在指定位置i插入x.i表示插入位置,原来的i位置如果有元素则往后移动一个位置,例如 a.insert(0, x)会插入到列表首部,而a.insert(len(a)

python 2.7 中文教程 - 解释器

调用python解释器 Python的解释器在linux上通常安装在/usr/bin/python,/usr/local/bin/python,/usr/local/bin/python等地方.Windows一般位于C:\Python27,且一般需要设置PATH环境变量. # [email protected]:[/root]#python Python 2.7.5 (default, Jun 17 2014, 18:11:42)  [GCC 4.8.2 20140120 (Red Hat 4.

unity3d插件Daikon Forge GUI 中文教程-1-Daikon Forge介绍

DF-GUI特点: ·        深编辑器集成:DF-GUI提供广泛的整合与Unity3D编辑环境,包括自定义检查人员对每个组件向导来简化复杂的多步任务,提高生产力的上下文菜单,编辑控件在一个所见即所得的方式创建复杂的布局,并几个精心设计的工作流程增强功能.这种无缝集成可让您更专注于您的UI本身,而不必担心如何使用DF-GUI. ·        全所见即所得的体验:DF-GUI控件都是在Unity编辑器“活” -对控件的属性所做的任何更改都将反映在即时编辑; 没必要打的播放按钮. ·   

Python Kivy 中文教程:安装(Windows)

Kivy 是一套用于跨平台快速应用开发的开源框架,只需编写一套代码,便可运行于各大桌面及移动平台上(包括 Linux, Windows, OS X, Android, iOS, 以及 Raspberry Pi) Kivy 采用 Python 和 Cython  编写,在国外已经十分火爆,受关注程度甚至一度超越了老牌的 Python GUI 工具 PyQt.可惜 Kivy 在国内还鲜为人知,咪博士将会陆续推出一系列 Kivy 中文教程.这一篇先教大家,在 Windows 上 安装 Kivy. 零.

Sublime Text最好的中文教程

原文链接:http://lucida.me/blog/sublime-text-complete-guide/ 摘要(Abstract) 本文系统全面的介绍了Sublime Text,旨在成为最优秀的Sublime Text中文教程. 更新记录 2014/09/27:完成初稿 2014/09/28: 更正打开控制台的快捷键为Ctrl + ` 更正全局替换的快捷键为Ctrl + Alt + Enter 前言(Prologue) Sublime Text是一款跨平台代码编辑器(Code Editor

Android自动化测试介绍

1.随机事件测试.通过adb命令执行测试Monkey 就是SDK中附带的一个工具, 用来做压力测试.应用程序crash 和 ANR时会产生日志. 然后根据关键字分析,就可以把应用出现的问题抓出来. 2.Instrumentation提供对Apk的监控. 3.主应用场景测试,模拟用户点击行为测试.是对Instrumentation的再封装 利用国外的测试工具robotium 参考: ?Monkey工具介绍 ?Monkey命令详解 ?robotium应用举例 ?robotium中文教程 ?Instr

iOS App上架发布到app store市场最新中文教程

iOS -App发布Appstore最新中文教程 这个教程教你怎么把开发好的ios应用上架到appstore市场,一步一步带截图,包括最新的appstore后台系统itunesconnect使用,证书创建和管理,应用id创建和管理,上传ipa等都将一步一步详细介绍. 下面从七个步骤进行详细介绍! 1.创建唯一标示符App IDs 2.申请发布证书 3.申请发布描述文件 4.到iTunes Connect创建App并填写信息 5.Windows下选择证书编译打包 6.Windows下上传IPA到A