一、模块

1、模块的概念

模块这一概念很大程度上是为了解决代码的可重用性而出现的

其实这一概念并没有多复杂,简单来说不过是一个后缀为 .py 的 Python 文件而已

例如,我在工作中需要经常打印一段文字,很自然地,我会将它实现为一个函数,等到需要的时候直接调用即可

现在,假如这样的工作不仅仅是我一个人在做,比如有成千上万的人需要在他们的工作打印同样的内容

那么也很自然地,我会将这段函数代码储存成一个单独文件发给需要的人

这样就产生了模块的概念,我的这一份代码可以理解成是一个模块,它是一份具有一定独立功能的通用的程序代码

2、导入模块

对于导入模块,相信大家都不会陌生,基本的语法是 import module,一个最简单的例子如下:

>>> import random
>>> # 这时可以通过 module.function() 引用其中定义的方法
>>> # 其实可以把 module 当作是一个新的命名空间
>>> random.randint(0,1)
# 1

还可以直接导入模块中的方法,基本语法是 from module import function,此时模块中的其它方法将不可用

>>> from random import randint
>>> # 可以直接使用对应的函数名调用函数
>>> randint(0,1)
# 0
>>> # 此时,将无法引用模块中的其它函数
>>> choice([0,1])
# NameError: name 'choice' is not defined

一个常见的用法是将某一个模块中的所有内容导入到当前命名空间中

>>> from random import *
>>> randint(0,1)
# 1
>>> choice([0,1])
# 1

但使用上面的方法或许还存在一些问题,就是当引用模块中的方法名和全局定义的方法名相同时,会引发命名冲突

此时可以通过引用时重命名解决这个问题,其基本语法如下:

import module as alias 或者 from module import function as alias

>>> import random as rd
>>> rd.randint(0,1)
# 0

注意:无论在程序中使用多少次 import 语句,一个模块最多只能导入一次

3、搜索路径

下面,让我们思考一下更深入的问题?

当我们使用 import 语句导入模块时,编译器会在哪里寻找我们需要的模块呢?一般来说,编译器寻找模块的顺序如下:

  1. 当前目录

  2. PYTHONPATH 环境变量设置的目录

  3. 由安装过程决定的默认路径

我们可以通过 sys 模块下的 path 变量查看模块的搜索路径,另外,我们可以使用 pprint 模块格式化打印内容

>>> import sys
>>> import pprint
>>> pprint.pprint(sys.path)
# ['',
# 'C:\\Python\\Python37-32\\Lib\\idlelib',
# 'C:\\Python\\Python37-32\\python37.zip',
# 'C:\\Python\\Python37-32\\DLLs',
# 'C:\\Python\\Python37-32\\lib',
# 'C:\\Python\\Python37-32',
# 'C:\\Users\\user\\AppData\\Roaming\\Python\\Python37\\site-packages',
# 'C:\\Python\\Python37-32\\lib\\site-packages']

如果现在我们自己编写了一个模块,我们怎样才可以让这个模块应用到其它程序呢?

最简单的一个办法莫过于将这个文件添加到上面已有路径中

建议将模块放在 site-packages 文件夹中,site-packages 是一个专门用来存放第三方模块的文件夹

但是这样的做法并非都是可行的,例如,可能因为权限问题你无法访问上面的各个目录

这时候,添加模块的默认搜索路径也不失为一个可行的办法,一般来说有三个方法:

  1. 修改 sys 模块中 path 变量的值:sys.append('pathName')
  2. 修改环境变量 PYTHONPATH 的值
  3. 在 site-packages 文件夹下添加一个路径文件,以 .pth 为后缀名,在文件中加入所需目录名称

4、隐藏测试代码

在编写模块的时候,我们常常需要对模块进行局部功能性测试,等待测试成功之后才会将它应用在其它程序中

由于测试所需,总会留下大量的测试代码在模块中,假如不加处理,这些测试代码将会在引入时对其它程序产生影响

所以,我们需要在程序中隐藏测试代码

我们首先来看一下 Python 中的一个内置变量 __name__,在主程序中,它的值将被设置为 main

>>> __name__
# '__main__'

所以,在编写模块的测试代码时,我们可以在 if __name__ == '__main__' 程序块中编写

if __name__ == '__main__':
# 测试代码

这样,在直接运行模块时,将会执行测试代码;但是在引入模块时,将不会执行测试代码

5、模块查询

当我们看到一个以前从未接触过的模块时,我们可以在哪进行学习和查询呢?通常有以下几种途径

  • mudule.__doc__:列出模块的简短说明
>>> import math
>>> print(math.__doc__)
# This module is always available. It provides access to the
# mathematical functions defined by the C standard.
  • dir(module):列出方法和属性
>>> import math
>>> dir(math)
['__doc__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'copysign', 'cos', 'cosh', 'degrees', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd', 'hypot', 'inf', 'isclose', 'isfinite', 'isinf', 'isnan', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'log2', 'modf', 'nan', 'pi', 'pow', 'radians', 'remainder', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'tau', 'trunc']
  • module.__all__:列出接口

当使用 from module import * 语句时,导入的是 __all__ 中所含有的内容

若没有设置 __all__,则导入 dir(module) 中不以下划线开头的所有内容

  • help(module):查看帮助手册,获取更多信息

  • module.__file__:打印源代码所在的文件路径,帮助我们找到源代码,阅读源代码

  • https://docs.python.org:一个高效的方法当然是直接查看官方文档的说明

    这个网站上包含了绝大部分 Python 模块的说明文档,可以帮助我们快速掌握特定模块的用法

二、包

包也是为了更好的组织模块而发展出来的一个概念,它通常是一个目录,目录名即包名

目录中必须有一个 __init__.py 文件,可以用来完成一些初始化的工作,当然也可以为空

然后就是一些模块文件和子目录,假如子目录中也有 __init__.py 文件,则它就是这个包的子包

【 阅读更多 Python 系列文章,请看 Python学习笔记

Python学习笔记之模块与包的更多相关文章

  1. Python学习笔记 - day9 - 模块与包

    模块与包 一个模块就是一个包含了Python定义和声明的文件,文件名就是模块名加上.py的后缀,导入一个py文件,解释器解释该py文件,导入一个包,解释器解释该包下的 __init__.py 文件,所 ...

  2. Python学习笔记—itertools模块

    这篇是看wklken的<Python进阶-Itertools模块小结> 学习itertools模块的学习笔记 在看itertools中各函数的源代码时,刚开始还比较轻松,但后面看起来就比较 ...

  3. python学习笔记_week5_模块

    模块 一.定义: 模块:用来从逻辑上组织python代码(变量,函数,类,逻辑:实现一个功能), 本质就是.py结尾的python文件(文件名:test.py,对应模块名:test) 包:用来从逻辑上 ...

  4. python学习笔记(八)-模块

    大型python程序以模块和包的形式组织.python标准库中包含大量的模块.一个python文件就是一个模块.1.标准模块 python自带的,不需要你安装的2.第三方模块 需要安装,别人提供的. ...

  5. Python学习笔记-常用模块

    1.python模块 如果你退出 Python 解释器并重新进入,你做的任何定义(变量和方法)都会丢失.因此,如果你想要编写一些更大的程序,为准备解释器输入使用一个文本编辑器会更好,并以那个文件替代作 ...

  6. python学习笔记十——模块与函数

    第五章 模块与函数 5.1 python程序的结构 函数+类->模块              模块+模块->包                 函数+类+模块+包=Python pyth ...

  7. 06 python学习笔记-常用模块(六)

    一.  模块.包 1.什么是模块? Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句,是用来组织代码的.模块能定义函数 ...

  8. python学习笔记:模块——自定义模块的3种导入方式

    一.定义 模块就是用一堆的代码实现了一些功能的代码的集合,通常一个或者多个函数写在一个.py文件里,而如果有些功能实现起来很复杂,那么就需要创建n个.py文件,这n个.py文件的集合就是模块.如果不懂 ...

  9. Python学习笔记1—模块

    模块的使用 引用模块的两种形式 形式一: import module_name 形式二: from module1 import module11   (module11是module的子模块) 例: ...

随机推荐

  1. iOS 运行时添加属性和方法

    第一种:runtime.h里的方法 BOOL class_addProperty(Class cls, const char *name, const objc_property_attribute_ ...

  2. jQuery - 制作点击显示二级菜单效果

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  3. 关于逆元&&lucas定理

    lucas是求组合数C(m,n)%p,有一个公式:C(m,n) = C(m/p,n/p)*C(m%p,n%p). (a*b)%c==a%c*b%c,但是(a/b)%c!=a%c/b%c,所以我们要算b ...

  4. Python中的math和保留小数位数方法

    转载自 http://xukaizijian.blog.163.com/blog/static/17043311920111163272414/ math模块实现了许多对浮点数的数学运算函数.  这些 ...

  5. PCB MS SERVER 数据导出与导入操作步骤----使用第3方工具

    工作每天都与数据库打交道,经常会遇到一些需要将数据库中的数据导出来或将数据导入到数据库 而用微软数据库客户端自带的功能操作步骤好麻烦的,用过的大家都会有相同的感受吧. 微软客户端不好之处整理:这里吐槽 ...

  6. 大数据攻城狮之Hadoop伪分布式篇

    对于初学大数据的萌新来说,初次接触Hadoop伪分布式搭建的同学可能是一脸萌笔的,那么这一次小编就手把手的教大家在centos7下搭建Hadoop伪分布式. 底层环境: VMware Workstat ...

  7. 脑洞大开加偏执人格——可持久化treap版的Link Cut Tree

    一直没有点动态树这个科技树,因为听说只能用Splay,用Treap的话多一个log.有一天脑洞大开,想到也许Treap也能从底向上Split.仔细思考了一下,发现翻转标记不好写,再仔细思考了一下,发现 ...

  8. (转)Win10 TensorFlow(gpu)安装详解

    Win10 TensorFlow(gpu)安装详解 写在前面:TensorFlow是谷歌基于DistBelief进行研发的第二代人工智能学习系统,其命名来源于本身的运行原理.Tensor(张量)意味着 ...

  9. Foeach 时修改集合的值报错

    就是"集合已修改:可能无法执行枚举操作 foreach" 啥的, 不让我改 百度到Foreach是只读的,只供取值用,无法进行新增,修改,删除(仅引用,实际待验证) 解决办法:将F ...

  10. java编译器和java解释器、JVM

    作用: JVM:JVM有自己完善的硬件架构,如处理器.堆栈(Stack).寄存器等,还具有相应的指令系统(字节码就是一种指令格式).JVM屏蔽了与具体操作系统平台相关的信息,使得Java程序只需要生成 ...