在程序中定义函数可以实现代码重用。但当你的代码逐渐变得庞大时,你可能想要把它分割成几个文件,以便能够更简单地维护。同时,你希望在一个文件中写的代码能够被其他文件所重用,这时我们应该使用模块(module)

一、导入模块

在Python中,一个.py文件就构成一个模块。一个模块中的定义可以导入(import)到另一个模块或主模块。

比如你可以通过内置模块platform来查看你当前的操作平台信息:

import platform
s = platform.platform()
print(s)
# 我的输出:Linux-3.15.8-200.fc20.x86_64-x86_64-with-fedora-20-Heisenbug

又比如你可以通过内置模块time获取当前的时间:

import time
s = time.ctime()
print(s)
# 输出:Mon Aug 18 16:04:57 2014

每个模块有其私有的符号表,在该模块内部当成全局符号表来使用。 当我们将一个模块导入到当前模块时,只有被导入模块的名称被放入当前模块的全局符号表里,所以我们不用担心变量名发生冲突。

其他几种导入方式:

1、import a as b:导入模块a,并将模块a重命名为b。

import time as x
s = x.ctime()
print(s)

2、from a import func:直接把模块内的函数或变量的名称导入当前模块符号表里。

from time import ctime
s = ctime() # 这时可以直接调用函数,而不用再使用time.ctime()
print(s)

3、from a import *:导入模块中所有的名字(以下划线开头的名字除外)到当前模块符号表里。

from time import *
s = ctime()
print(s)

注意:导入 * 是不好的,因为它常常产生难以阅读的代码,并且会容易产生名字冲突。

二、模块搜索路径

当导入名为 a 的模块时, 解释器会先从内建模块尝试匹配,如果没找到,则将在 sys.path 记录的所有目录中搜索 a.py 文件,而sys.path则包括:

  • 当前程序所在目录
  • 标准库的安装目录
  • 操作系统环境变量PYTHONPATH所包含的目录

变量 sys.path 是一个字符串列表,它为解释器指定了模块的搜索路径。它通过环境变量 PATHONPATH 初始化为一个默认路径,当没有设置 PYTHONPATH 时, 就使用内建默认值来初始化。你可以通过标准 list 操作来修改它:

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

三、模块的__name__

对于任何一个模块,模块的名字都可以通过全局变量 __name__得到:

import time
s = time.__name__
print(s) # 输出time

一个模块既可以在其它模块中导入使用,也可以当作脚本直接运行。不同的是,当导入到其他模块时,__name__的值是被导入模块的名字;而当作为脚本运行时,__name__的值被设为“__main__”

# test.py
if __name__ == '__main__':
print('This program is being run by itself')
else:
print('I am being imported into another module')

当作脚本执行:

$ python test.py
This program is being run by itself

当作导入模块使用:

>>> import test
I am being imported into another module
>>>

四、dir() 函数

Python3基础六中我们提到,可以通过内置dir()函数查询一个类或者对象的所有属性。除此之外,我们还可以用它列出一个模块里定义的所有名字,它返回一个有序字串列表:

>>> import builtins
>>> dir(builtins)

五、包

可以把多个模块,即多个.py文件,放在同一个文件夹中,构成一个包(Package)。例如:

sound/                          顶级包
__init__.py 初始化这个声音包
formats/ 格式转换子包
__init__.py
wavread.py
wavwrite.py
aiffread.py
aiffwrite.py
auread.py
auwrite.py
...
effects/ 音效子包
__init__.py
echo.py
surround.py
reverse.py
...
filters/ 过滤器子包
__init__.py
equalizer.py
vocoder.py
karaoke.py
...

注意:在每个包文件夹里都必须包含一个 __init__.py 的文件,告诉Python,该文件夹是一个包。__init__.py 可以是一个空文件。

我们可以通过import 包名.模块名导入包中的子模块,例如:

import sound.effects.echo

当然,也可以使用from... import...句式导入包中的模块:

from sound.effects import echo               # 导入echo子模块
from sound.effects.echo import echofilter # 导入echo子模块中的函数或变量
from sound.effects import * # 导入__all__变量中所有的子模块

个人站点:http://songlee24.github.com

Python3基础(八) 模块的更多相关文章

  1. Python3基础笔记---模块

    参考博客:Py西游攻关之模块 模块的概念: 我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式.在Python中,一个.py文件就称之为 ...

  2. Python基础(八) 模块的引入与定义

    模块定义 什么是模块:一个py文件就是一个模块 模块分为三类: 内置模块,(标准库):.python解释器自带的,time,os,sys,等等.200多种. 自定义模块:自己写的模块 第三方库(模块) ...

  3. python基础系列教程——Python3.x标准模块库目录

    python基础系列教程——Python3.x标准模块库目录 文本 string:通用字符串操作 re:正则表达式操作 difflib:差异计算工具 textwrap:文本填充 unicodedata ...

  4. Django基础八之认证模块---auth

    Django基础八之认证模块---auth 目录 Django基础八之认证模块---auth 1. auth介绍 2. autho常用操作 2.1 创建用户 2.2 验证用户 2.3 验证用户是否登录 ...

  5. Python3基础(十二) 学习总结·附PDF

    Python是一门强大的解释型.面向对象的高级程序设计语言,它优雅.简单.可移植.易扩展,可用于桌面应用.系统编程.数据库编程.网络编程.web开发.图像处理.人工智能.数学应用.文本处理等等. 在学 ...

  6. python基础——使用模块

    python基础——使用模块 Python本身就内置了很多非常有用的模块,只要安装完毕,这些模块就可以立刻使用. 我们以内建的sys模块为例,编写一个hello的模块: #!/usr/bin/env ...

  7. python3基础视频教程

    随着目前Python行业的薪资水平越来越高,很多人想加入该行业拿高薪.有没有想通过视频教程入门的同学们?这份Python教程全集等你来学习啦! python3基础视频教程:http://pan.bai ...

  8. python3基础入门-知识点简记

    1.基础语法 编码.标识符.保留字.注释.行与缩进... 2.变量类型 (1)Python3有6个标准的数据类型: Numbers(数字)  数字数据类型用于存储数值  不可改变的数据类型 可细分为  ...

  9. Python3基础-特别函数(map filter partial reduces sorted)实例学习

    1. 装饰器 关于Python装饰器的讲解,网上一搜有很多资料,有些资料讲的很详细.因此,我不再详述,我会给出一些连接,帮助理解. 探究functools模块wraps装饰器的用途 案例1 impor ...

随机推荐

  1. from scipy import spatial 出现 from .qhull import * ImportError: DLL load failed: The specified module could not be found. 错误

    错误描述: 本人机器window8.1 64位,python2.7. Traceback (most recent call last): File "C:/Users/Hamid/Docu ...

  2. LR接口测试---Java Vuser之增删改查

    import lrapi.lr; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Prepared ...

  3. 接口与抽象类的区别-Java

    概念-抽象类: 类是对某一个对象的具体描述,抽象类则是对有共通之处的对象,描述共通之处的类;包含抽象方法的类一定的抽象类,抽象类并不一定包含抽象方法;抽象类中可以有数据成员,但数据成员必须是stati ...

  4. java.lang.RuntimeException: java.lang.NullPointerException...的错误

    先FQ,让电脑能登上谷歌,然后重新安装,应该就好了,我的是这样解决的.如果下次安装又报:java.lang.RuntimeException: java.lang.NullPointerExcepti ...

  5. MySql学习笔记(二) —— 正则表达式的使用

    前面介绍利用一些关键字搭配相应的SQL语句进行数据库查找过滤,但随着过滤条件的复杂性的增加,where 子句本身的复杂性也会增加.这时我们就可以利用正则表达式来进行匹配查找. 1.基本字符匹配 ' o ...

  6. 并发和多线程(七)--volatile

    volatile: 相当于轻量级的synchronized,只能用来修饰变量,线程安全的三个特性通过volatile能实现其中的两个 原子性: 在之前的文章有说到,通过Atomic相关类.synchr ...

  7. LeetCode_18 4Sum

    Given an array nums of n integers and an integer target, are there elements a, b, c, and d in nums s ...

  8. Python学习之前

    编程语言的分类: 1.机器语言:直接以0和1编写指令代码,计算机能直接识别处理: 特点:运行速度最快,太复杂,开发效率低,可执行操作最多. 2.汇编语言:本质上依然是机器语言,用英文代替0和1,更容易 ...

  9. 第九节:web爬虫之urllib(五)

    第四个模块 robotparser: 主要是用来识别网站的 robots.txt 文件,然后判断哪些网站可以爬,哪些网站不可以爬的,其实用的比较少.

  10. java诗词横版--转为竖版

    import java.util.Arrays; /* 诗句横版转成竖版输出 */public class PrintPoem { public static void main(String[] a ...