天天看点

《python 与数据挖掘 》一第3章 函  数创建了一个以3为底的匿名对数函数,并赋值给了My_LF使用My_LF调用匿名函数,参数只需要真数即可,底数已设置为3。而使用log()函数需要同时指定真数和对数。如果我们每次都是求以3为底数的对数,使用My_LF更方便。result: 2.0

本章将介绍如何使用python编写函数。函数是python为了代码效率的最大化,减少冗余而提供的最基本的程序结构。在上一章中,我们学会了众多流程控制的语句,在中大型的程序中,同一段代码可能会被使用多次,如果程序由一段又一段冗余的流程控制语句组成,那么程序的可读性会变差。所以,我们需要使用函数去封装这些重复使用的程序段,并加以注释,下次使用的时候就可以直接调用,使代码更清晰明白。

本书在这里第一次讲到函数封装的概念,实际上我们在前面已经接触到了。例如列表操作的各种方法都是函数,在执行list.append(x)的时候在底层程序已经执行了一段代码。如果不封装成函数,每次添加元素都要输入这段代码,显得非常繁琐。程序员没有必要去探究数据结构源码具体是如何编写的,每种数据结构都会提供众多的函数和相对应的说明文档,程序员仅需知道函数的输入和输出就可以使用数据结构去工作了。

函数能使程序变得抽象。抽象节省了工作,并且加大了程序的可读性。例如,写一个求一列数据的极差的程序,我们可以分解成如下工作:

1)求最大值。

2)求最小值。

3)求极差,极差=最大值-<code>`</code>javascript

def fun():

print 'hello,world'

这样就定义了一个fun函数,它没有参数,也没有返回值,仅仅打印出“hello,world”。下面再定义一个有参数也有返回值的函数。

这个函数称为hello,输入参数是your_name,返回加上hello的字符串。程序创建函数后,执行 s = hello('tom')即得到一个新的字符串“hello tom”并赋值给s。python的简洁性可以从函数中体现,python的参数也不需要声明数据类型,但这也有一定的弊端,程序员可能会因不清楚参数的数据类型而输入错误的参数,例如上面的函数若执行hello(1)就会报错。所以一般在函数的开头注明函数的用途、输入和输出。

return语句用于返回一个结果对象。python可以没有返回值,可以有一个返回值,也可以有多个返回值,返回值的数据类型没有限制。当程序执行到函数中的return语句时,就会将指定的值返回并结束函数,如果return后面还有语句,那些语句将不会被执行。所以也可以仅仅用一个return结束函数。在其他语言中很少允许多个返回值,举一个python有多个返回值函数的例子:

lambda语句

python允许使用lambda语句创建匿名函数,也就是说函数没有具体的名称。可能读者会产生疑惑,函数没有了名称应该不会是一件好事。但实际上,使用python编写一些执行脚本时,使用lambda省去了定义函数的过程,代码变得精简。对于一些抽象的、不会在其他地方复用的函数,有时候给函数命名也是个难题(需要避免函数重名),而使用lambda则不需要考虑函数命名的问题。

lamber语句中,冒号前是函数参数,若有多个函数使用逗号分隔,冒号右边是返回值。如此便构建了一个函数对象,def语句也是创建一个函数对象,只是lambda创建的函数对象没有名字。

2

使用lamber函数应该注意下面4点:

1)lambda定义的是单行函数,如果需要复杂的函数,应使用def语句。

2)lamdda参数列表可以包含多个函数,如lambda x,y : x + y 。

3)lambda语句有且只有一个返回值。

4)lambda语句中的表达式不能含有命令,而且仅限一条表达式。

举一个例子,python的数学库中只有以自然底数e和10为底的对数函数,下面我们使用lambda函数创建指定某个数为底的对数函数,如代码清单<code>`</code>javascript3-1所示。

代码清单3-1 匿名函数

my_lf = make_logarithmic_function(3)

print my_lf(9)

*代码详见:示例程序/code/3-1.py