前面我们写的Python程序代码使用了Python语言自身提供的print函数和input函数,也使用了一些其它函数。这些函数的共同性质就是它们都能完成一些特定的功能,print函数用于输出功能,input函数用于输入功能。

在前面使用函数时,我们把函数看成黑盒,把输入扔进黑盒,黑盒会对输入进行处理,最后输出结果。这节课我们要打开函数的盒子,看一看函数的内部是什么样子?
语句重复的代码
案例1:不使用循环结构,计算自然数10以内的累加和。
案例1的代码如下:
#计算10以内的数字累加和
#声明变量sum,并初始化为0
sum = 0
#求10以内的累加和
sum += 1
sum += 2
sum += 3
sum += 4
sum += 5
sum += 6
sum += 7
sum += 8
sum += 9
#输出sum
print("%s:%d" % ("10以内数字的累加和为",sum))
代码创建了变量sum并初始化为零,然后连续9条语句求自然数1至自然数9的累加和,最后输出sum变量。上面的程序代码和程序的执行结果都没有问题,但这不是最好的编程方式。因为上面代码的重复语句太多,代码看上去也不够简洁,需要使用更好的方法改变代码结构,避免编写大量的重复语句。
功能重复的代码
可以使用for循环结构来避免编写重复的代码。
#计算10以内的数字累加和
#声明变量sum,并初始化为0
sum = 0
#使用for循环语句求10以内数的累加和
for i in range(0,10):
sum += i
#输出sum
print("%s:%d" % ("10以内数字的累加和为",sum))
使用for循环结构求自然数10以内的累加和,程序代码看上去简洁多了,也没有了重复语句。for循环改变了代码的结构,提高了代码的复用性。
案例2:求自然数10以内和20以内的累加和。
案例2的代码如下:
#计算10以内和20以内的数字累加和
#声明变量sum,并初始化为0
sum = 0
#使用for循环语句求10以内数的累加和
for i in range(0,10):
sum += i
#输出sum
print("%s:%d" % ("10以内数字的累加和为",sum))
#使用for循环语句求20以内数的累加和
sum = 0
for i in range(0,20):
sum += i
#输出sum
print("%s:%d" % ("20以内数字的累加和为",sum))
上面的程序代码完成两个功能:一个功能是求自然数10以内的累加和并输出;第二个功能是求自然数20以内的累加和并输出。这两个功能相同,代码也几乎完全相同,只是循环次数不同,这种情况就属于功能性重复,循环可以解决代码重复的问题,但解决不了功能性重复的问题。
使用函数解决代码重复的问题
在案例1和案例2代码中,案例1是代码重复,案例2是功能重复。

我们可以设想一下,在上面的程序代码中,如果我们把求自然数累加和的代码单独编写为一个代码块,自然数作为代码块的一个参数传入进去,该代码块对传入的自然数求累加和,并把求和结果返回给调用这个代码块的语句,这样就解决了程序中功能性重复的问题。

在Python语言中,Python提供了函数用来解决类似上面功能性重复的问题,其实函数的作用不仅用于解决功能性重复的问题,更重要的是用于对程序逻辑进行结构化或过程化的一种编程方法。
它可以将能够完成独立功能的代码块封装成易于管理的函数,这些函数可以被程序中的其它语句调用,而调用者可以把函数看成黑盒,不用考虑函数的内部结构和特性,只需传入参数和接收返回值就可以了。

函数的结构
在Python语言中,函数分为三部分:第一部分是函数声明,函数声明占一行语句,声明语句开头使用def关键字,在def关键字后面空格后紧跟函数的名称,函数名称后面是一对小括号,括号内是需要传入的参数,参数可以为空;第二部分是函数体,函数体可以占多行语句,函数体内包括函数注释和代码;第三部分是返回语句,如果函数没有返回值可以省略返回语句。

在Python函数结构中,“functionname”表示函数的名称,“parameters”表示传入函数的参数名,多个参数之间使用英文逗号分隔, “函数_文档字符串”是函数的注释文档,主要给出函数的功能、参数说明等信息(注释文档可以省略),“function_suite”是函数的代码。return是返回语句,如果函数没有返回值,返回语句可以省略。“expression”是返回的表达式或数据。
我们了解了函数结构后,就可以使用函数来解决上面程序中求自然数累加和功能重复的问题。
案例代码
#计算自然数累加和
#定义求累加和函数
def summation(number):
sum = 0
for i in range(0,number):
sum += i
return sum;
#求自然数10的累加和
print("%s:%d" % ("10以内数字的累加和为",summation(10)))
#求自然数20的累加和
print("%s:%d" % ("20以内数字的累加和为",summation(20)))
#求自然数100的累加和
print("%s:%d" % ("100以内数字的累加和为",summation(100)))
上面的程序代码就比前边的程序代码简洁强大多了,它可以求任意自然数以内的累加和,而且编写的代码量也很少。程序定义了函数summation,该函数完成求给定自然数以内的累加和功能,自然数由函数的参数number指定。
代码语句调用函数时,直接写上函数名称即可,函数名称后面是一对小括号,需要传入的参数放在小括号内。因为summation函数返回传入自然数的累加和,因此print语句输出了函数的返回值。

函数给编写程序带来了便捷性,我们可以把程序的共用代码,或者说是程序的通用功能封装成函数。当需要使用函数时,只需要在代码的相应位置调用函数即可。

求自然数累加和是一个通用功能,它可以求任何自然数的累加和。因此将求自然数累加和功能的代码封装到一个函数里,程序需要求自然数累加和时,直接调用函数即可。
我们在处理复杂问题时,往往需要把复杂问题分解为一些相对简单的部分,分别处理这些部分,然后用各个部分的解去构造整个问题的解。
函数就是完成这样的功能,函数可以把相对独立的某个功能抽取出来,使之成为程序中的一段独立代码,并为这段代码取一个名字,做成一个函数定义,当要使用函数功能时,可以在程序中直接调用该函数。
现在我们已经初步掌握了Python函数的使用,后面我们会深入讨论函数的参数。