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, end=' ')
        a, b = b, a+b
    print()

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

1.深入模块

使用 import 语句直接导入模块的某些定义:

>>> 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(500)
1 1 2 3 5 8 13 21 34 55 89 144 233 377

这种方式将会导入所有除了以下划线开头 _ 的命名. (不推荐)

1.1.作为脚本执行模块

使用这种方式运行 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
>>>

1.2.模块的搜索路径

搜索顺序:

  • 当前目录

  • 环境变量 PYTHONPATH 中的目录列表中搜索

  • Python 默认安装路径中搜索

  • 1.3."编译的" Python 文件

    为了加快加载模块的速度, Python 会在 __pycache_ 目录下缓存每个模块编译后的版本.
    module.version.pyc
    例如: CPython 3.3 版本中, spam.py 编译后的版本: __pycache__/spam.cpython-33.pyc.

    高级技巧:

  • 为了减少一个编译模块的大小, 可以在 Python 命令行中使用 -O 或者 -OO-O 删除所有断言语句, -OO 删除断言语句和 doc 字符串. 后缀为 .pyo

  • .pyc 和 .pyo 只是在加载模块的时候更快一些. 不会影响运行速度.

  • compileall 模块可以为指定目录中的所有模块创建 .pyc 或 .pyo (使用-O参数) 文件.

  • 2.标准模块

    Python 带有一个标准模块库, 并发布有独立的文档, 名为 Python 库参考手册.

    示例: 变量 sys.ps1 和 sys.ps2 定义了主题师傅和辅助提示符:

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

    这两个变量只在解释器的交互模式下才有意义.

    操作修改 sys.path :

    >>> import sys
    >>> sys.path.append('/ufs/guido/lib/python')

    3.dir() 函数

    内置函数 dir() 获取模块中的所有模块定义:

    >>> import fibo, sys
    >>> dir(fibo)
    ['__name__', 'fib', 'fib2']
    >>> dir(sys)  
    ['__displayhook__', '__doc__', '__excepthook__', '__loader__', '__name__',
     '__package__', '__stderr__', '__stdin__', '__stdout__',
     '_clear_type_cache', '_current_frames', '_debugmallocstats', '_getframe',
     '_home', '_mercurial', '_xoptions', 'abiflags', 'api_version', 'argv',
     'base_exec_prefix', 'base_prefix', 'builtin_module_names', 'byteorder',
     'call_tracing', 'callstats', 'copyright', 'displayhook',
     'dont_write_bytecode', 'exc_info', 'excepthook', 'exec_prefix',
     'executable', 'exit', 'flags', 'float_info', 'float_repr_style',
     'getcheckinterval', 'getdefaultencoding', 'getdlopenflags',
     'getfilesystemencoding', 'getobjects', 'getprofile', 'getrecursionlimit',
     'getrefcount', 'getsizeof', 'getswitchinterval', 'gettotalrefcount',
     'gettrace', 'hash_info', 'hexversion', 'implementation', 'int_info',
     'intern', 'maxsize', 'maxunicode', 'meta_path', 'modules', 'path',
     'path_hooks', 'path_importer_cache', 'platform', 'prefix', 'ps1',
     'setcheckinterval', 'setdlopenflags', 'setprofile', 'setrecursionlimit',
     'setswitchinterval', 'settrace', 'stderr', 'stdin', 'stdout',
     'thread_info', 'version', 'version_info', 'warnoptions']

    不传参数时, 返回当前定义的命名:

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

    dir() 不会列出内置函数和变量名.
    但是可以通过列出标准模块 builtins 来查看:

    >>> import builtins
    >>> dir(builtins)  
    ['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException',
     'BlockingIOError', 'BrokenPipeError', 'BufferError', 'BytesWarning',
     'ChildProcessError', 'ConnectionAbortedError', 'ConnectionError',
     'ConnectionRefusedError', 'ConnectionResetError', 'DeprecationWarning',
     'EOFError', 'Ellipsis', 'EnvironmentError', 'Exception', 'False',
     'FileExistsError', 'FileNotFoundError', 'FloatingPointError',
     'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError',
     'ImportWarning', 'IndentationError', 'IndexError', 'InterruptedError',
     'IsADirectoryError', 'KeyError', 'KeyboardInterrupt', 'LookupError',
     'MemoryError', 'NameError', 'None', 'NotADirectoryError', 'NotImplemented',
     'NotImplementedError', 'OSError', 'OverflowError',
     'PendingDeprecationWarning', 'PermissionError', 'ProcessLookupError',
     'ReferenceError', 'ResourceWarning', 'RuntimeError', 'RuntimeWarning',
     'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError',
     'SystemExit', 'TabError', 'TimeoutError', 'True', 'TypeError',
     'UnboundLocalError', 'UnicodeDecodeError', 'UnicodeEncodeError',
     'UnicodeError', 'UnicodeTranslateError', 'UnicodeWarning', 'UserWarning',
     'ValueError', 'Warning', 'ZeroDivisionError', '_', '__build_class__',
     '__debug__', '__doc__', '__import__', '__name__', '__package__', 'abs',
     'all', 'any', 'ascii', 'bin', 'bool', 'bytearray', 'bytes', 'callable',
     'chr', 'classmethod', 'compile', 'complex', 'copyright', 'credits',
     'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'exec', 'exit',
     'filter', 'float', 'format', 'frozenset', 'getattr', 'globals', 'hasattr',
     'hash', 'help', 'hex', 'id', 'input', 'int', 'isinstance', 'issubclass',
     'iter', 'len', 'license', 'list', 'locals', 'map', 'max', 'memoryview',
     'min', 'next', 'object', 'oct', 'open', 'ord', 'pow', 'print', 'property',
     'quit', 'range', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice',
     'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'vars',
     'zip']

    4.包

    示例一个处理声音的模块集:

    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 文件.

    可以每次只导入包里的特定模块:

    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 package import item 时, item 可以是包/模块/命名.
    使用 import item.subitem.subsubitem 时, 最后的子项可以是包/模块, 但不能是前一个子项的类/函数/变量.

    4.1.从 * 导入包.

    如果包中的 __init__.py 中定义了一个名为 __all__ 的列表, 就会按照列表中给出的模块名进行导入.
    示例: 在 sound/effects/__init__.py 文件中:

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

    当使用 from sound.effects import * 导入这个包时, 会从 sound 包中导入这三个子模块.
    如果没定义 __all__, 将不会导入所有子模块.

    但是, 不推荐使用 * 的方式去导入模块命名!!!

    4.2.包内引用

    如果包内使用了子包结构, 可以按绝对位置从相邻的包中引入子模块.
    例如: 如果 sound.filters.vocoder 包需要使用 sound.effects 包中的 echo 模块, 它可以 from sound.Effects import echo.

    也可以使用点号标明关联导入当前包和上级包.
    示例:

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

    4.3.多重目录中的包

    包支持一个更为特殊的特性, __path__. 在包的 __init__.py 文件代码执行之前, 该变量初始化一个目录名列表. 该变量可以修改, 它作用于包中的子包和模块的搜索功能.

    这个功能可以用于扩展包中的模块集, 不过它不常用.

    ©著作权归作者所有,转载或内容合作请联系作者
    • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
      沈念sama阅读 213,254评论 6 492
    • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
      沈念sama阅读 90,875评论 3 387
    • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
      开封第一讲书人阅读 158,682评论 0 348
    • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
      开封第一讲书人阅读 56,896评论 1 285
    • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
      茶点故事阅读 66,015评论 6 385
    • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
      开封第一讲书人阅读 50,152评论 1 291
    • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
      沈念sama阅读 39,208评论 3 412
    • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
      开封第一讲书人阅读 37,962评论 0 268
    • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
      沈念sama阅读 44,388评论 1 304
    • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
      茶点故事阅读 36,700评论 2 327
    • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
      茶点故事阅读 38,867评论 1 341
    • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
      沈念sama阅读 34,551评论 4 335
    • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
      茶点故事阅读 40,186评论 3 317
    • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
      开封第一讲书人阅读 30,901评论 0 21
    • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
      开封第一讲书人阅读 32,142评论 1 267
    • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
      沈念sama阅读 46,689评论 2 362
    • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
      茶点故事阅读 43,757评论 2 351

    推荐阅读更多精彩内容