python包机制简介

前言

每种编程语言都有自己的代码组织方式,Python也不例外。如果只是写一点简单的脚本,一般也不用不上Python的包和模块机制,当你积累的工具代码或工程代码越来越多的时候,为了更好的代码复用和结构组织就需要它的包和模块机制。

包

Python程序由包(package)、模块(module)和函数组成。包是由一系列模块组成的集合。模块是处理某一类问题的函数和类的集合。

Python提供了许多有用的工具包,如字符串处理、图形用户接口、Web应用、图形图像处理等。这些自带的工具包和模块安装在Python的安装目录下的Lib子目录中。
注意:
包必须至少含有一个__int__.py文件按,该文件的内容可以为空。__int__.py用于标识当前文件夹是一个包。

模块

Python的程序是由一个个模块组成的。

模块的创建

每一个.py文件都是一个模块。一个模块将强相关的代码:类,函数,常量等组织在一起。创建一个person.py文件就是创建了名为person的模块。

person.py
1
2
3
4
5
6
7
8
9
10
#!/usr/bin/python
# -*- coding: UTF-8 -*-

def sayHi(msg):
print "Hello %s" % msg

class Person:

def sing(self, music):
print "I'm singing %s" % music
callPerson.py
1
2
3
4
5
6
7
8
9
10
#!/usr/bin/python
# -*- coding: UTF-8 -*-

import person

person.sayHi("Python")

p = person.Person()

p.sing("我的祖国")

注意:

person.py和callPerson.py必须放在同一个目录下或放在sys.path所列出的目录下,否则,Python解释器找不到自定义的模块。

当Python导入一个模块时会按照如下的顺序来查找模块:

  1. 首先查找当前路径
  2. 查找lib目录(/usr/lib64/python2.7)、site-packages目录(/usr/lib64/python2.7/site-packages)
  3. 查找环境变量PATHONPATH设置的目录。
  4. 如果通过以上的路径模块还没有找到,则可以通过sys.path语句的输出的值作为模块的查找路径。

注意: 我们可以通过操作sys.path的值控制查找路径,但一般情况是不需要的。

模块的使用

当模块创建好了之后就可以使用了。使用模块时需要通过import关键字来导入需要使用的模块。例如:

1
import datetime

导入模块后就可以通过模块名来使用模块里面的函数和类。例如:

1
2
3
import datetime

print datetime.datetime.now()

如果想直接使用模块中的函数或类,可以通过如下的方式来实现:

1
2
3
from datetime import datetime

print datetime.now()

注意: 通过这中方式可能导致代码的可读性变差。

如果需要导入该模块下所有的类和函数,可以通过from module_name import *这样格式实现。

Python中的import语句比Java的import语句更加灵活。Python的import语句可以置于程序中任意的位置,甚至可以放在条件语句中。

模块的属性

模块有一些内置属性,用于完成特定的任务,如__name__、__doc__。每个模块都有一个名称。
例如:
__name__:用于判断当前模块是否是程序的入口,如果当前程序正在被使用,__name__的值为“main”。

内置模块

Python提供了一个内联模块bulidin,该模块中定义了一些软件开发总经常用到的模块,利用这些函数可以实现数据类型的转换、数据的计算、序列的处理等功能。

apply()

apply()可以实现调用可变参数列表的函数,把函数的参数存放在一个元组或序列中。
apply()的声明如下:

1
apply(func[,args[,kwargs]])

说明:

  • 参数func是自定义的函数名称;
  • 参数args是一个包含自定义函数参数的列表或元组。args如果省略,则表示被执行的函数没有任何参数。
  • 参数kwargs是一个字典。字典中的key值为函数的参数名称,value值为实际参数的值。

例子:

1
2
3
4
def sum(x = 1,y = 2):
return x + y

print apply(sum,(1,3))

注意: : apply()的元组参数是有序的。

fiter()

filter()可以对某个序列做过滤处理,对自定义函数的参数返回的结果是否为“真”来过滤,并一次性返回处理结果。
filter()的声明如下所示:

1
filter(func or None, sequence) -> list, tuple, or string

说明

  • 参数func是自定义的过滤函数,在函数func(item)中定义过滤的规则。如果func为None,则过滤项item都为真,返回所有的序列元素。
  • 参数sequence为待处理的序列。

filter()的返回值是由func()的返回值组成的序列,返回的类型与参数sequence的类型相同。例如,参数sequence为元组,则返回的类型也是元组。
例子:从给定的列表中过滤出大于0的数字。

1
2
3
4
def func(x):
if x > 0:
return x
print filter(func, range(-9,10))

reduce()

对序列中元素的连续操作可以通过循环来处理(例如对某个序列中的元素累加操作)。Python提供的reduce()也可以实现连续处理的功能。
reduce()的声明如下所示:

1
reduce(func, sequence[,initial])->value

说明:

  • 参数func是自定义的函数,在函数func()中实现对参数sequence的连续操作。
  • 参数sequence为待处理的序列。
  • 参数initial可以省略,如果initial不为空,则initial的值将首先传入func()进行计算。如果sequence为空,则对initial的值进行处理。
    reduce()的返回值是func()计算后的结果。

例子:实现对一个列表中的数字进行累加的操作。

1
2
3
4
5
6
7

def sum(x, y):
return x + y

print reduce(sum,range(0,10))#0+1+2+3+4+5+6+7+8+9
print reduce(sum,range(0,10),10)#10+0+1+2+3+4+5+6+7+8+9
print reduce(sum,range(0,0),10)#range(0,0)返回空列表,所以返回结果就是10

map()

map()可以对多个序列的每个元素都执行相同的操作,并组成列表返回。
map()的声明如下所示:

1
map(func,sequence[,sequence,...])->list
  • 参数func是自定义的函数,实现对序列每个元素的操作。
  • 参数sequence为待处理的序列,参数sequence的个数可以是多个。

map()的返回值是对序列元素处理后的列表。

例子:实现列表中数字的幂运算。

1
2
3
4
def power(x):return x**x
print map(power,range(1,5))
def power2(x,y):return x**y
print map(power2,range(1,5),range(5,1,-1))

注意:
如果map()中提供了多个序列,则每个序列中的元素一一对应进行计算。如果每个序列的长度不相同,则短的序列后补充None,再进行计算。
常用的内联函数如下表所示:

自定义包

包就是一个至少包含__int__.py文件的文件夹。Python包和Java包的作用是相同的,都是为了实现程序的重用。把实现一个常用功能的代码组合到一个包中,调用包提供的服务从而实现重用。
例如,定义一个包parent。在parent包中创建两个子包pack和pack2.pack包中定义一个模块myModule,pack2包中定义一个模块myModule2.最后在包parent中定义一个模块main,调用子包pack和pack2.如下图所示:
包与模块的树形关系图

包pack的int.py程序如下所示:

1
2
3
4
5
6
#!/usr/bin/env python
# -*- coding=utf-8 -*-
if __name__ == '__main__':
print '作为主程序运行'
else:
print 'pack初始化'

这段代码初始化pack包,这里直接输出一段字符串。当pack包将其他模块调用时,将输出“pack包初始化”。
包pack的myModule模块如下所示:

文章目录
  1. 1. 前言
  2. 2. 包
  3. 3. 模块
    1. 3.1. 模块的创建
    2. 3.2. 模块的使用
    3. 3.3. 模块的属性
  4. 4. 内置模块
    1. 4.1. apply()
    2. 4.2. fiter()
    3. 4.3. reduce()
    4. 4.4. map()
  5. 5. 自定义包
|