模块
模块就是把一组相关的函数或代码组织到一个文件中,即一个文件就是一个模块。模块是由代码、类和函数组成的,其中类和函数可以有0个或多个。
新建一个firstModule.py,即定义了一个名为firstModule的模块。在该模块定义两个函数和一个类,并在该类中定义一个方法,代码如下:
# _*_ coding:utf-8 _*_ # 自定义模块 def function_one(): print 'firstModule function_one()' def function_two(): print 'firstModule function_two()' class FirstClass: def __init__(self): pass def first_class_function(self): print 'firstModule FirstClass first_class_function()'
另外再新建一个名为ex.py的文件,在其中输入如下代码,调用firstModule模块的函数和类:
import firstModule firstModule.function_one() firstModule.function_two() firstClass = firstModule.FirstClass() firstClass.first_class_function()
输出如下:
firstModule function_one() firstModule function_two() firstModule FirstClass first_class_function()
模块的导入
在前面的例子中,我们知道导入模块需要使用import语句。格式如下:
import module_name
这样可以导入一个模块,要调用模块已经定义的函数,需要使用:
module_name.function_name
要调用模块中的类,需要创建类的对象,然后再通过类对象调用类中的方法。语法格式如下:
class_object=module_name.class_name
class_object.class_function_name
这种方式比较麻烦,每次调用模块中的函数或类时,都需要使用模块名作为前缀。所以,为了解决这种麻烦,python中的from...import..语句可以将模块中的类或函数导入,而不需要使用模块名作为前缀,格式如下:
from module_name import function_name
注意:虽然这样减少了代码的编写,但是降低了代码的可读性。
导入一个模块下的所有类和函数,可以使用如下语句:
from module_name import *
模块属性
python中的每个模块都有一些特定的属性,用于完成某项任务。常用的两个模块属性:
1)__name__属性
__name__属性用于判断当前模块是不是程序入口。如果当前程序正在被使用,__name__的值为__main__。
2)__doc__属性
python中的模块是一个对象,而每个对象都会有一个__doc__属性,该属性用于描述该对象的作用。
模块的内置函数
python提供了一个内联模块-buildin,该模块中定义了许多函数。
1)apply()函数
apply()函数可以实现调用可变参数列表的功能,把函数的参数存放到一个元组或序列中。apply()函数的语法格式如下:
apply(function_name [, args [, kwargs]])
参数function_name所表示函数的返回值就是apply()函数的返回值,apply()函数有如下几个参数。
function_name:该参数是必须的,表示自定义的函数的名称。
args:该参数是可选的,它是一个包含了自定义函数参数的列表和元组。如果不指定该参数,则表示被执行的函数没有任何参数。
kwargs:该参数是可选的,它是一个字典类型的参数,字典中的key值为函数的参数名称,value值为实际参数的值。
下面是一个例子:
def login(username, password): message = '' if(username == 'admin') and (password == 'admin'): message = 'login success.' else: message = 'login error!' return message print apply(login, ('admin', 'admin'))
结果:
login success.
2)filter()函数
filter()函数可以对序列做过滤处理,简单来说就是用函数过滤一个序列,把序列的每一项传递到过滤函数。对自定义函数的参数返回的结果是否为True做过滤,并一次性返回处理结果。如果过滤函数返回的结果为False,那么该元素将从列表中删除该项。filter()函数的语法格式如下:
filter(function_name, sequence)
该函数有两个参数:
function_name:该函数是必须的,它是自定义函数,在函数function_name()中定义过滤的规则。如果function_name()函数的返回值为None,则表示sequence序列中的每一项都为True,从而返回左右的序列元素。
sequence:该参数也是必须的,表示要过滤的序列。
例子:
# _*_ coding:utf-8 _*_ # 验证用户名的函数validate(), 长度在4-12之间 def validate(username): if(len(username) > 4) and (len(username) < 12): return username # 调用filter(), 过滤validate()函数中的元组参数 print filter(validate, ('admin', 'root', 'aaron'))
结果:
('admin', 'aaron')
注意:
filter()中的过滤函数function_name的参数不能为空,否则没有可存储sequence元素的变量,function_name()也不能处理过滤。
要想在注释中使用中文,必须在.py文件的第一行加上# _*_ coding:utf-8 _*_,否则会报SyntaxError: Non-ASCII character... 异常。
3)reduce()函数
reduce()函数可以实现连续处理的功能。例如,对某个序列中的元素进行累加操作。reduce()函数的语法格式如下:
reduce(function_name, sequence[ , initial])
reduce()函数有3个参数:
function_name:该参数是必须的,表示自定义的函数名称,在函数function_name()中实现对参数sequence的连续操作。
sequence:该参数也是必须的,表示待处理的序列。
initial:该参数是可选的,如果指定了该参数的值,则initial所指定的值将首先被传入function_name()函数中进行计算。如果sequence参数的值为空,则对initial所指定的值进行处理。
例子:
# _*_ coding:utf-8 _*_ # 定义计算两个数相乘的函数multiply() def multiply(x, y): return x*y # 使用reduce()函数,对元组中的每一项进行计算,最后将结果返回 print reduce(multiply, (1, 2, 3, 4, 5, 6)) print reduce(multiply, (7, 8), 5)
结果:
720 280
第一个结果为1*2*3*4*5*6连乘的结果。第二个结果为5*7*8的结果。
注意:使用reduce()函数进行累加计算时,必须为reduce()函数中的function_name()函数提供两个参数,分别对应运算符两侧的操作数。
4)map函数
map()函数可以对多个序列中的每个元素执行相同的操作,并返回一个与输入序列长读相同的列表。其中,每一个元素都是对输入序列中相应位置的元素转换的结果。map()函数的语法格式如下:
map(function_name, sequence[, sequence, ...])
其中参数function_name表示自定义函数的名称,实现对序列中每个元素的操作。sequence参数表示待处理的序列,该参数可以为多个。如果传给map()的函数参数接受多个参数,那么就可以给map()传递多个序列,如果这些传进来的序列长度不一样,那么会在短的序列后面补None。函数参数还可以是None,这时就会用序列参数中的元素生成一个元组的序列。下面是使用map()函数的实例:
def add_one(a): return a + 1 def add_two(a, b): return a + b def add_three(a, b, c): return a + b + c a = [1, 2, 3, 4, 5] b = [1, 2, 3, 4, 5] c = [1, 2, 3, 4, 5] result = map(add_one, a) print result result = map(add_two, a, b) print result result = map(add_three, a, b, c) print result
结果:
[2, 3, 4, 5, 6] [2, 4, 6, 8, 10] [3, 6, 9, 12, 15]
转载请注明出处:http://blog.csdn.net/iAm333