Python中关于使用模块的基础知识


Posted in Python onMay 24, 2015

 一个模块可以在逻辑上组织Python代码。将相关的代码到一个模块中,使代码更容易理解和使用。模块是可以绑定和借鉴任意命名属性的Python对象。

简单地说,一个模块是由Python代码的文件。一个模块可以定义函数,类和变量。模块还可以包括可运行的代码。
例子:

Python代码的模块名为aname通常位于一个名为aname.py。下面是一个简单的模块,support.py作为例子

def print_func( par ):
  print "Hello : ", par
  return

import语句:

可以通过在其他一些Python源文件执行import语句来使用任何Python源文件作为一个模块。import的语法如下:

import module1[, module2[,... moduleN]

当解释器遇到import语句,它导入(import)模块如果模块出现在搜索路径。搜索路径是一个目录列表,该解释器导入模块之前搜索。例如,导入模块hello.py,需要把下面的命令在脚本的顶部:

#!/usr/bin/python

# Import module support
import support

# Now you can call defined function that module as follows
support.print_func("Zara")

当执行上面的代码,产生以下结果:

Hello : Zara

一个模块被加载一次,不管导入的次数。这可防止模块执行发生多次导入。
 from...import 语句

Python的from语句可以从一个模块中导入特定的属性到当前的命名空间。from...import 语法如下:

from modname import name1[, name2[, ... nameN]]

例如,从模块fib导入函数fibonacci,使用下面的语句:

from fib import fibonacci

此语句不导入整个模块fib到当前的命名空间;它只是介绍了fibonacci从模块fib导入模块的全局符号表列。
from...import * 语句:

它也可以通过使用下面的import语句导入从模块到当前的命名空间的所有名称:

from modname import *

这提供了导入从模块到当前的命名空间中的所有项目一个简单的方法;不过,这个语句应谨慎使用。
定位模块:

当导入一个模块,在下列序列模块由Python解释器搜索:

  •     当前目录
  •     如果未找到该模块,然后Python搜索在shell变量PYTHONPATH每个目录
  •     如果这些方法都失败,Python会检查默认路径。在UNIX上,默认路径是正常是/usr/local/lib/python/

模块搜索路径被存储在系统模块sys作为所述的sys.path变量。在sys.path的变量包含当前目录,PYTHONPATH和相关的默认安装。
PYTHONPATH变量:

在PYTHONPATH是一个环境变量,包括目录列表中。 PYTHONPATH的语法shell变量PATH相同。

下面是Windows系统的典型PYTHONPATH:

set PYTHONPATH=c:\python20\lib;

这里是UNIX系统的典型PYTHONPATH:

set PYTHONPATH=/usr/local/lib/python

命名空间和作用域:

变量名称(标识)映射到对象。名称空间是变量名(键)及其相应的对象(的值)的字典。

Python语句可以在本地命名空间和全局命名空间访问变量。如果局部和全局变量同名,局部变量屏蔽全局变量。

每个函数都有自己的命名空间。类方法遵循相同的作用域规则为普通函数。

Python对变量是否为局部或全局进行假定猜测。它假定任何变量赋值函数中的值是局部的。

因此为了使一个函数内的值赋给一个全局变量,必须先使用global语句。

声明 global VarName 告诉Python VarName是一个全局变量。Python 停止寻找该变量的局部命名空间。

例如,我们在全局命名空间中定义的变量Money 。在该函数的Money ,我们给定Money 的值,因此Python 假定Money 为局部变量。但是,我们设定它,所以一个UnboundLocalError是结果之前访问的局部变量Money 的值。取消global语句解决了这个问题。

#!/usr/bin/python

Money = 2000
def AddMoney():
  # Uncomment the following line to fix the code:
  # global Money
  Money = Money + 1

print Money
AddMoney()
print Money

dir( ) 函数:

使用dir()内置函数返回一个包含一个模块中定义名称的字符串的排序列表。

该列表包含在一个模块中定义的所有模块,变量和函数的名称。下面是一个简单的例子:

#!/usr/bin/python

# Import built-in module math
import math

content = dir(math)

print content;

当执行上面的代码,产生以下结果:

['__doc__', '__file__', '__name__', 'acos', 'asin', 'atan', 
'atan2', 'ceil', 'cos', 'cosh', 'degrees', 'e', 'exp', 
'fabs', 'floor', 'fmod', 'frexp', 'hypot', 'ldexp', 'log',
'log10', 'modf', 'pi', 'pow', 'radians', 'sin', 'sinh', 
'sqrt', 'tan', 'tanh']

在这里,特殊字符串变量__name__是模块的名称,__file__是从中加载的模块的文件名。
globals()和 locals()函数:

globals() 和 locals() 函数可用于返回在根据在它们被称为位置的全局和局部名称空间的名称。

如果locals()被一个函数中调用时,它会返回所有可以在局部从函数访问的名称。

如果globals()从一个函数中调用时,它会返回所有可以从全局函数进行访问的名称。

这两个函数的返回类型是字典。因此,名称可以使用keys()函数提取出来。
reload()函数:

当该模块被导入到一个脚本,在一个模块的顶层部分的代码只执行一次。

因此,如果你想重新执行的顶级代码模块中,可以使用reload()函数。reload()函数导入先前导入的模块了。reload()函数的语法是这样的:

reload(module_name)

在这里,module_name是要重装,不包含模块名字符串的模块的名称。例如,要重新加载hello模块,请执行以下操作:

reload(hello)

Python中的包:

包是用于定义由模块和子包和子子包等的单一的Python应用环境的分层文件目录结构。

考虑一个文件Pots.py在Phone目录中可用。此文件的源代码如下一行:

#!/usr/bin/python

def Pots():
  print "I'm Pots Phone"

类似的方法,我们具有不同功能的另两个文件具有相同的名称如上:

  •     Phone/Isdn.py文件有函数 Isdn()
  •     Phone/G3.py 文件有函数 G3()

现在,创建在Phone目录中多了一个文件__init__.py:

  

Phone/__init__.py

 为了让所有的功能可用,当导入Phone,需要把__init__.py明确的import语句如下:

from Pots import Pots
from Isdn import Isdn
from G3 import G3

当添加完这些行到__init__.py,那么已经导入了Phone包所有这些类的使用。

#!/usr/bin/python

# Now import your Phone Package.
import Phone

Phone.Pots()
Phone.Isdn()
Phone.G3()

当执行上面的代码,产生以下结果:

I'm Pots Phone
I'm 3G Phone
I'm ISDN Phone

在上面的例子我们采取示例每个文件单个函数,但可以保留文件中多个函数。还可以在这些文件定义不同的Python类,可以在包外创建那些类。

Python 相关文章推荐
Python2中的raw_input() 与 input()
Jun 12 Python
python计算一个序列的平均值的方法
Jul 11 Python
Python复制文件操作实例详解
Nov 10 Python
Python 迭代器工具包【推荐】
May 06 Python
python在Windows下安装setuptools(easy_install工具)步骤详解
Jul 01 Python
基于python实现在excel中读取与生成随机数写入excel中
Jan 04 Python
Python实现识别手写数字大纲
Jan 29 Python
Python学生信息管理系统修改版
Mar 13 Python
Python使用Selenium模块实现模拟浏览器抓取淘宝商品美食信息功能示例
Jul 18 Python
DES加密解密算法之python实现版(图文并茂)
Dec 06 Python
PyQt5实现简易计算器
May 30 Python
Python文件打开方式实例详解【a、a+、r+、w+区别】
Mar 30 Python
详解Python中的各种函数的使用
May 24 #Python
Python标准库之Sys模块使用详解
May 23 #Python
Python OS模块常用函数说明
May 23 #Python
在Python中操作时间之tzset()方法的使用教程
May 22 #Python
详解Python中time()方法的使用的教程
May 22 #Python
在Python中操作时间之strptime()方法的使用
Dec 30 #Python
详解Python中的strftime()方法的使用
May 22 #Python
You might like
虫族 ZERG 概述
2020/03/14 星际争霸
PHP has encountered an Access Violation at 7C94BD02解决方法
2009/08/24 PHP
php带密码功能并下载远程文件保存本地指定目录 修改加强版
2010/05/16 PHP
PHP插件PHPMailer发送邮件功能
2017/02/28 PHP
jquery自动完成插件(autocomplete)应用之PHP版
2009/12/15 Javascript
用Jquery实现可编辑表格并用AJAX提交到服务器修改数据
2009/12/27 Javascript
js的表单操作 简单计算器
2011/12/29 Javascript
jquery验证手机号码、邮箱格式是否正确示例代码
2013/07/28 Javascript
JS画线(实例代码)
2013/11/20 Javascript
node.js 开发指南 ? Node.js 连接 MySQL 并进行数据库操作
2014/07/29 Javascript
js实现window.open不被拦截的解决方法汇总
2014/10/30 Javascript
Nodejs Stream 数据流使用手册
2016/04/17 NodeJs
Vue keep-alive实践总结(推荐)
2017/08/31 Javascript
Angular ElementRef简介及其使用
2018/10/01 Javascript
JS中的算法与数据结构之队列(Queue)实例详解
2019/08/20 Javascript
Layui弹框中数据表格中可双击选择一条数据的实现
2020/05/06 Javascript
Vue父组件监听子组件生命周期
2020/09/03 Javascript
vue+canvas实现拼图小游戏
2020/09/18 Javascript
js实现验证码干扰(静态)
2021/02/22 Javascript
[02:56]《DAC最前线》之国外战队抵达上海备战亚洲邀请赛
2015/01/28 DOTA
[42:20]Secret vs Liquid 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
python 远程统计文件代码分享
2015/05/14 Python
python实现求最长回文子串长度
2018/01/22 Python
pytorch 转换矩阵的维数位置方法
2018/12/08 Python
从零开始的TensorFlow+VScode开发环境搭建的步骤(图文)
2020/08/31 Python
在阿联酋购买翻新手机和平板电脑:Teckzu
2021/02/12 全球购物
用缩写的指针比较"if(p)" 检查空指针是否可靠?如果空指针的内部表达不是0会怎么样?
2014/01/05 面试题
学期研究性学习个人的自我评价
2014/01/09 职场文书
婚礼新郎父母答谢词
2014/01/16 职场文书
给学校的建议书
2014/03/12 职场文书
葛优非诚勿扰搞笑征婚台词
2014/03/17 职场文书
阅兵口号
2014/06/19 职场文书
2014年计生协会工作总结
2014/11/21 职场文书
骨干教师申报材料
2014/12/17 职场文书
初中地理教学反思
2016/02/19 职场文书
vue3中的组件间通信
2021/03/31 Vue.js