简介

Python的解释环境是很好用,但是如果我们需要编写一个大型的程序的时候,解释环境就完全不够用了。这个时候我们需要将python程序保存在一个文件里。通常这个文件是以.py结尾的。

对于大型的应用程序来说,一个文件可能是不够的,这个时候我们需要在文件中引用其他的文件,这样文件就叫做模块。

模块是一个包含Python定义和语句的文件。文件名就是模块名后跟文件后缀 .py 。在模块内部,模块名可以通过全局变量 __name__ 获得。

模块基础

还是之前的斐波拉赫数列的例子,我们在fibo.py文件中存放了函数的实现:


  1. def fib(n): # write Fibonacci series up to n
  2. a, b = 0, 1
  3. while a < n:
  4. print(a, end=' ')
  5. a, b = b, a+b
  6. print()

编写完毕之后,我们可以在Python的解释环境中导入它:

  1. >>> import fibo

然后直接使用即可:

  1. >>> fibo.fib(1000)
  2. 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987

常用的函数,我们可以将其赋值给一个变量:

  1. >>> fib = fibo.fib
  2. >>> fib(1000)
  3. 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987

或者,我们在导入的时候,直接给这个模块起个名字:

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

或者导入模块中的函数:

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

每个模块都有它自己的私有符号表,该表用作模块中定义的所有函数的全局符号表。因此,模块的作者可以在模块内使用全局变量,而不必担心与用户的全局变量发生意外冲突。

执行模块

前面我们提到了可以使用import来导入一个模块,并且 __name__ 中保存的是模块的名字。

和java中的main方法一样,如果我们想要在模块中进行一些测试工作,有没有类似java中main方法的写法呢?

先看一个例子:

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

在模块中,我们需要进行一个判断 __name__ 是不是被赋值为 "__main__"

我们这样来执行这个模块:

  1. python fibo.py <arguments>

以脚本执行的情况下,模块的 __name__ 属性会被赋值为 __main__ , 这也是例子中为什么要这样写的原因。

看下执行效果:

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

如果是以模块导入的话,那么将不会被执行:

  1. >>> import fibo
  2. >>>

模块搜索路径

使用import导入模块的时候,解释器首先会去找该名字的内置模块,如果没找到的话,解释器会从 sys.path变量给出的目录列表里寻找。

sys.path的初始目录包括:

  • 当前目录
  • PYTHONPATH 指定的目录
  • 安装的默认值

dir

要想查看模块中定义的内容,可以使用dir函数。

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

上面的例子列出了当前模块中定义的内容,包括变量,模块,函数等。

注意, dir() 不会列出内置函数和变量的名称。如果你想要这些,它们的定义是在标准模块 builtins 中。

我们可以给dir加上参数,来获取特定模块的内容:

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

java中有package的概念,用来隔离程序代码。同样的在Python中也有包。

我们看一个Python中包的例子:

  1. sound/ Top-level package
  2. __init__.py Initialize the sound package
  3. formats/ Subpackage for file format conversions
  4. __init__.py
  5. wavread.py
  6. wavwrite.py
  7. aiffread.py
  8. aiffwrite.py
  9. auread.py
  10. auwrite.py
  11. ...
  12. effects/ Subpackage for sound effects
  13. __init__.py
  14. echo.py
  15. surround.py
  16. reverse.py
  17. ...
  18. filters/ Subpackage for filters
  19. __init__.py
  20. equalizer.py
  21. vocoder.py
  22. karaoke.py
  23. ...

上面我们定义了4个包,分别是sound,sound.formats, sound.effects, sound.filters。

注意,如果是包的话,里面一定要包含 __init__.py 文件。

__init__.py 可以是一个空文件,也可以执行包的初始化代码或设置 __all__ 变量。

当导入的时候, python就会在 sys.path 路径中搜索该包。

包的导入有很多种方式,我们可以导入单个模块:

  1. import sound.effects.echo

但是这样导入之后,使用的时候必须加载全名:

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

如果不想加载全名,可以这样导入:

  1. from sound.effects import echo

那么就可以这样使用了:

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

还可以直接导入模块中的方法:

  1. from sound.effects.echo import echofilter

然后这样使用:

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

如果一个包里面的子包比较多,我们可能会希望使用 * 来一次性导入:

  1. from sound.effects import *

那么如何去控制到底会导入effects的哪一个子包呢?

我们可以在 __init__.py 中定义一个名叫 __all__ 的列表,在这个列表中列出将要导出的子包名,如下所示:

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

这样from sound.effects import * 将导入 sound 包的三个命名子模块。

如果没有定义 __all__from sound.effects import * 语句 不会 从包 sound.effects 中导入所有子模块到当前命名空间;它只会导入包 sound.effects

包的相对路径

Import 可以指定相对路径,我们使用 . 来表示当前包, 使用 .. 来表示父包。

如下所示:

  1. from . import echo
  2. from .. import formats
  3. from ..filters import equalizer

本文已收录于 http://www.flydean.com/07-python-module/

最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!

欢迎关注我的公众号:「程序那些事」,懂技术,更懂你!

Python基础之:Python中的模块的更多相关文章

  1. 【Python基础】07_Python中的模块

    1.模块的概念 模块 就好比 工具包,要想使用这个工具包中的工具,就需要 导入import 这个模块 每一个以扩展名 .py 结尾的 Python源代码文件 都是一个 模块 在模块中定义的 全局变量. ...

  2. Python基础(12)_python模块之sys模块、logging模块、序列化json模块、pickle模块、shelve模块

    5.sys模块 sys.argv 命令行参数List,第一个元素是程序本身路径 sys.exit(n) 退出程序,正常退出时exit(0) sys.version 获取Python解释程序的版本信息 ...

  3. 二十一. Python基础(21)--Python基础(21)

    二十一. Python基础(21)--Python基础(21) 1 ● 类的命名空间 #对于类的静态属性:     #类.属性: 调用的就是类中的属性     #对象.属性: 先从自己的内存空间里找名 ...

  4. Python 3基础教程20-Python中导入模块和包

    本文介绍Python中导入模块和包 #目录: # 导入模块和包--- # | # 上级包.上级模块.导入模块和包的init模块----- # | # 同级包.同级模块.上级包的init模块.test模 ...

  5. Python基础笔记系列十:模块

    本系列教程供个人学习笔记使用,如果您要浏览可能需要其它编程语言基础(如C语言),why?因为我写得烂啊,只有我自己看得懂!! 模块 #1.类比于java中的jar包,模块能让你能够有逻辑地组织你的Py ...

  6. Python基础(十)re模块

    Python基础阶段快到一段落,下面会陆续来介绍python面向对象的编程,今天主要是补充几个知识点,下面开始今天的内容. 一.反射 反射的作用就是列出对象的所有属性和方法,反射就是告诉我们,这个对象 ...

  7. 改写《python基础教程》中的一个例子

    一.前言 初学python,看<python基础教程>,第20章实现了将文本转化成html的功能.由于本人之前有DIY一个markdown转html的算法,所以对这个例子有兴趣.可仔细一看 ...

  8. python基础之python中if __name__ == '__main__': 的解析

    当你打开一个.py文件时,经常会在代码的最下面看到if __name__ == '__main__':,现在就来介 绍一下它的作用. 模块是对象,并且所有的模块都有一个内置属性 __name__.一个 ...

  9. Py修行路 python基础 (二十三)模块与包

    一.模块 1)定义: 模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 2)为何要用模块: 退出python解释器然后重新进入,那之前定义的函数或者变量都将丢失,因 ...

  10. Python基础(15)_python模块、包

    一.模块 1.什么是模块:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀 模块的本质:模块的本质是一个py文件 2.模块分为三类:1)内置模块:2)第三方模块: ...

随机推荐

  1. 【Azure 应用服务】App Service多个部署槽(Slot)之间,设置Traffic百分比后,如何来判断请求是由那一个槽(Slot)来进行处理呢?

    问题描述 当我们部署应用到App Service后,为了实现对生成的最小影响,通常是把新版本部署在一个预生产的槽中,然后进行验证.另一方面,为了进行A/B验证,需要把生成槽的流量,切入一部分到预生产槽 ...

  2. D3.js 力导向图的显示优化(二)- 自定义功能

    摘要: 在本文中,我们将借助 D3.js 的灵活性这一优势,去新增一些 D3.js 本身并不支持但我们想要的一些常见的功能:Nebula Graph 图探索的删除节点和缩放功能. 文章首发于 Nebu ...

  3. linux系统信息命令笔记

    1,时间和日期 2,磁盘信息 4,进程概念介绍 4.1,ps 基本命令使用 ps aux 显示内容太多了.一般用ps a 或 ps au 4.2, top命令的基本使用 top 可以动态的显示运行中的 ...

  4. kotlin协程异常处理之-try catch

    kotlin协程小记 协程的async使用 kotlin协程异常处理之-try catch kotlin协程异常处理之-CoroutineExceptionHandler 一.try catch tr ...

  5. Java this关键字使用 详解+ 证明

    1 package com.bytezero.thistest; 2 /** 3 * 4 * @Description 5 * @author Bytezero·zhenglei! Email:420 ...

  6. Java // 使用二维数组打印 10 行杨辉三角

    1 // 使用二维数组打印 10 行杨辉三角 2 public static void main(String[] args) 3 { 4 //1.声明 并初始化二维数组 5 int[][]yangh ...

  7. 基于python的定时PC定时录音机实现

    一 概念基础 这次用python实现一个定时录音机的功能,可以让你的i电脑秒变定时录音机. 这里用到了wave库,time库等.熟悉该源码,即可了解这些库的用法.   二 源码解析 1.录音函数,该函 ...

  8. 在salesforce中如何获取Security Token

    Trailhead练习Soap API使用Soap UI时,需要Security Token才能登录,在Lightning一直找不到,后来切换到Classic才找到.现在提供一个简单粗暴的方式,快速定 ...

  9. day04-原生的API&注解方式

    原生的API&注解方式 1.MyBatis原生的API调用 1.1原生API快速入门 需求:在前面的项目基础上,使用MyBatis原生的API完成,即直接通过SqlSession接口的方法来完 ...

  10. exec函数族使用说明

    exec函数不创建新进程,只用磁盘上的程序替换当前进程的正文段.数据段.堆段和栈段.然后从main函数开始运行. exec函数族使用说明 #include <unistd.h> int e ...