6 Python的模块 (Modules)

Table of Contents

  • 1 关于模块

    • 1.1 更多关于模块的故事
    • 1.2 将模块作为脚体执行
    • 1.3 模块搜索路径
    • 1.4 “编译过的” Python 文件
  • 2 标准模块
  • 3 dir 函数
  • 4 包(Package)
    • 4.1 Import * from package

1 关于模块

如果你退出了交互模式,那么你定义的东西都都没啦!如果你要写一个长一点的程序,那么最好写在一个文件里,每次需要 运行时就运行一下这个文件,这文件叫做脚本(Scripts)。随着程序变大,写在一个文件里也不行了,你需要把它分割成多个部分,以 方便维护和组织,这些不同的部分叫做模块(Modules)。 模块可以通过 import 来导入,这样我们就可以使用这个模块中定义的函数啦!一个文件对应一个模块,模块名是文件名去掉 扩展名。下面来看一个例子~

# Fibonacci sequence moduledef fib(n):a, b = 0, 1while b < n:print b,a, b = b, a+bdef fib2(n):result = []a, b = 0, 1while b < n:result.append(b)a, b = b, a+breturn result

我们可以在交互模式下导入这个模块,然后使用其中的函数,同时模块内还有一个全局变量,以 __ name __ 表示。

>>> import fibo
>>> fibo.fib(10)
1 1 2 3 5 8
>>> fibo.fib(10)
1 1 2 3 5 8
>>> fibo.__name__
'fibo'

另外,如果经常使用这个函数,还可以将其赋给一个局部变量

>>> fib1= fibo.fib
>>> fib1(10)
1 1 2 3 5 8

1.1 更多关于模块的故事

模块不仅可以包含函数,还可以包含可执行语句,它们负责初始化模块,且仅在第一次导入模块时被执行。 每个模块都有其私有符号表,模块内的所有函数将它们当作全局符号表来使用。 一个模块可以导入(import)另一个模块,import语句习惯于在开始调用,但这并非必要。 下面这种方式将从另一个模块符号表里的内容导入本模块符号表的方式,导入之后,就可以像模块内函数那样使用它们

>>> from fibo import fib, fib2
>>> fib(300)
1 1 2 3 5 8 13 21 34 55 89 144 233
>>> fib2(200)
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144]
>>> fibo.fib(10)
Traceback (most recent call last):File "<stdin>", line 1, in <module>
NameError: name 'fibo' is not defined

注意,并未导入fibo,所以不能使用fibo.fib来调用函数。

可以通过下面这种方式,导入另一个模块内所有的符号

>>> from fibo import *
>>> fib(10)
1 1 2 3 5 8
>>> fib2(10)
[1, 1, 2, 3, 5, 8]

1.2 将模块作为脚体执行

在命令行输入下面的内容会执行脚本的内容,

python fibo.py <arguments>

如果只想让脚本中的可执行语句在通过上述方式执行时起作用,而在交互模式 import 时不执行,可以在 脚本的最后加入:

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

原因就在于 命令行执行和交互模式 import 时,__ name __ 的值是不一样的,做一个小实验就会明白: 在 fibo.py 中加入

print __name__def fib(n):a, b = 0, 1while b < n:print b,a, b = b, a+bdef fib2(n):result = []a, b = 0, 1while b < n:result.append(b)a, b = b, a+breturn resultif __name__ == "__main__":import sysfib(int(sys.argv[1]))

在命令行执行时,

python fibo.py 10
__main__
1 1 2 3 5 8

在交互模式 import 时

>>> import fibo
fibo

1.3 模块搜索路径

当模块 spam 被导入时,解释器首先在内置模块中搜索这个名字,如果没有找到,会在 sys.path 指定的一系列目录下 查找 spam.py 这个文件,sys.path 会在这些地方初始化。

  • 包含当前脚本的目录(或者当前目录)
  • PYTHONPATH (一系列目录名,和系统变量PATH格式一样)
  • 安装时默认的设定(the installation-dependent default)

1.4 “编译过的” Python 文件

如果 spam.py 所在文件下有一个名为 spam.pyc 的文件存在,这说明有 spam.py 已经被编译过,编译后的字节码 存放在 spam.pyc 中。这是加速调用大量标准库的 python 程序启动时间的一项重要技术。 正常情况下,你无需为 spam.pyc 的产生做任何事情,当 spam.py 被成功编译时,会尝试写入 spam.pyc, 如果失败了, 那也不会报错,如果写入的信息不完整,spam.pyc会被认为是无效的。

2 标准模块

Python 自带了一个标准模块库,一些模块被内置于解释器中,这些模块不涉及语言的核心,但是与效率以及操作系统 相关,例如系统调用。这些模块在不同平台有所不同。 需要特别注意的是 sys 模块,它可以修改交互模式下的提示符,修改搜索路径,等等。

>>> import sys
>>> sys.ps1
'>>> '
>>> sys.ps1 = '>_:'
>_:sys.ps2
'... '
>_:sys.path.append('/usr/lib')

3 dir 函数

dir 函数可以得到一个模块定义了哪些名称,例如

>>> import fibo
fibo
>>> dir(fibo)
['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'fib', 'fib2']

注意 dir 会列出所有类型的名字:变量,函数,模块等等,不会列出内置的函数和变量,如果想查看内置变量,可以 用

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

4 包(Package)

包是 Python 组织模块名称空间的一种方式,例如模块名 A.B 表示包A中的子模块B. 例如你需要设计一系列模块用于处理声音文件和声音数据,文件有不同的格式,如wav,au,aiff. 数据处理方式也有很多种, 例如混合,合并,等等,那么,你可能需要这样设计和组织模块:

sound/                          Top-level package__init__.py               Initialize the sound packageformats/                  Subpackage for file format conversions__init__.pywavread.pywavwrite.pyaiffread.pyaiffwrite.pyauread.pyauwrite.py...effects/                  Subpackage for sound effects__init__.pyecho.pysurround.pyreverse.py...filters/                  Subpackage for filters__init__.pyequalizer.pyvocoder.pykaraoke.py...

__ init __.py 文件可以用于加载模块前设置路径,设置变量等。 使用包中的模块时,可以这样使用

import sound.effects.echo

调用时,必须写命名

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

另一种导入方式是:

from sound.effects import echo

这样,使用时可以直接使用 echo

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

当然,也可以进一步:

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

4.1 Import * from package

如果我们通过下面的方式导入,会有什么效果呢?

from sound.effects import *

理想情况下,它会导入包下的所有子模块,但实际上,它需要花费很长时间,并且有副作用。 解决这个问题的办法是,在__ init __.py 文件中定义一个变量,这样上述执行会根据这个变量的内容知道应该导入什么。

__all__ = ["echo", "surround", "reverse"]
原文链接:http://docs.python.org/2/tutorial/modules.html

转载于:https://www.cnblogs.com/Iambda/archive/2013/03/01/3933493.html

「学习笔记——Python」Python 的模块(Modules)相关推荐

  1. 「学习笔记-Linux」学习Shell Script

    学习Shell Script Table of Contents 1 什么是Shell Scipt 1.1 程序书写 1.2 程序执行 2 简单Shell练习 2.1 例1 接收用户输入 2.2 例2 ...

  2. Python学习笔记:常用内建模块6 (urllib)

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  3. Python学习笔记:常用内建模块4:hmac

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  4. Python学习笔记:常用内建模块3:struct

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  5. Python学习笔记:使用Python操作数据库

    Python学习笔记:使用Python操作数据库 一.数据库编程接口 为了对数据库进行统一的操作,大多数语言都提供了简单的.标准化的数据库接口(API).在Python Database API 2. ...

  6. python学习笔记26(python中__name__的使用)

    python学习笔记26(python中__name__的使用) 在python中,每个py文件都是一个模块,也都是一个可执行文件,即包含main方法.因此,对每个py文件,可以单独运行,也可以imp ...

  7. 「学习笔记」黑马面面布局开发

    「学习笔记」黑马面面布局开发 黑马面面布局开发 一.目的 1.1 技术方案 1.2 代码规范 1.2 目录规范 二.流程开发 2.1 蓝湖/摹客协作平台 2.2 适配方案 2.3 初始化文件 2.4 ...

  8. 「Vue 学习笔记 1」Vue 项目快速搭建,初始项目各个文件夹作用介绍和启动代码执行流程分析

    「Vue 学习笔记 1」Vue 项目快速搭建,初始项目各个文件夹作用介绍和启动代码执行流程分析 前言 一.我的开发环境 二.使用 Vue CLI (Vue 脚手架)快速搭建项目 三.初始项目的目录结构 ...

  9. 「学习笔记」移动Web开发之flex布局9

    「学习笔记」移动Web开发之flex布局9 一.flex布局体验 1.1 传统布局与flex布局 1.2 初体验 二.flex布局原理 2.1 布局原理 三.flex布局父项常见属性 3.1 常见父项 ...

  10. 「学习笔记」品优购项目-上(页面公共部分 )

    「学习笔记」品优购项目-上 品优购项目-上 目标 品优购项目规划 网站制作流程 品优购项目介绍 品优购项目的学习目的 开发工具以及技术栈 开发工具 技术栈 品优购项目搭建工作 创建的文件夹如下(称为项 ...

最新文章

  1. 一文详解JavaBean 看这篇就够了
  2. Android EventBus使用(不含源码解析)
  3. python贴吧爬虫-Python 爬虫练习: 爬取百度贴吧中的图片
  4. 《Effective-Ruby》读书笔记
  5. Java8 PriorityBlockingQueue源码分析
  6. LeetCode 1136. 平行课程(拓扑排序)
  7. 左移右移位运算_计算机硬件技术基础M2——计算机运算基础(二)
  8. Android 摄像头
  9. pes2019服务器中断,实况足球2019卡顿原因及解决办法分享
  10. python tab键自动补全怎么用_Python语言之使用tab键自动补全
  11. 相关系数excel_如何用Excel计算投资组合的有效前沿?
  12. python实数符号_下列格式化符号中,用来表示浮点实数的是()。 (6.0分)_学小易找答案...
  13. 图片裁剪为特定形状 ppt
  14. 宏基d260linux系统,Devuan GNU+Linux 2.0.0 稳定版发布,无systemd自由版本
  15. python文件批量重命名_文件批量重命名的python代码
  16. 计算机英语实用教程课后答案,计算机英语实用教程课后题参考答案.doc
  17. github pages 无法加载css的问题
  18. 运维学shell还是python_运维DBA要不要学python
  19. 【报告分享】2020年抖音汽车创作者生态白皮书-巨量算数(附下载)
  20. 程序员面试谈薪资的6大技巧(转)

热门文章

  1. php调用应用程序api,使用PHP调用openAPI
  2. cclink 和发那科机器人_发那科 iB系列 | 机器人地装行走轴三大升级介绍
  3. zedgraph支持游标吗_经典格斗游戏中的隐藏人物,当年在游戏厅你能选出来吗
  4. 游戏用计算机配置表显卡,攒机的知识盲区 以及显卡配置推荐详解
  5. matlabrobert锐化_Matlab图像处理—锐化滤波器
  6. 百练OJ:2808:校门外的树
  7. 笔记-项目进度管理-精简
  8. Vue+Openlayer使用overlay实现弹窗弹出显示与关闭
  9. C#中全局作用域的常量、字段、属性、方法的定义与使用
  10. Input中onbeforepaste的作用