函数是指组织好的,可重复使用的,用来实现单一或相关联功能的代码段,它能够提高应用的模块化和代码的重复利用率。
Python提供了很多内建函数,如print()。除此之外,我们还可以自己创建函数,也就是自定义函数。接下来,看一段代码:
print("*")
print("**")
print("****")
上述代码中,使用多个print()函数输出了一个三角形。如果需要在一个程序的不同位置输出这个图形,那么每次都使用print()函数输出的做法是不可取的。为了提高编写的效率以及代码的重用性,我们可以把具有独立功能的代码块组织成一个小模块,这就是函数。
在Python中,你可以定义一个自己想要功能的函数,自定义函数的语法格式如下所示
def 函数名(参数列表):
“函数_文档字符串”
函数体
return 表达式
基于上述格式,下面对函数定义的规则进行说明:
(1)函数代码块以def开头,后面紧跟的是函数名和圆括号()。
(2)函数名的命名规则跟变量的命名规则是一样的,即只能是字母、数字和下划线的任何组合,但是不能以数字开头,并且不能跟关键字重名。
(3)函数的参数必须放在圆括号中。
(4)函数的第1行语句可以选择性地使用文档字符串来存放函数说明。
(5)函数内容以冒号起始,并且缩进。
(6) return表达式结束函数,选择性地返回一个值给调用方。不带表达式的retu相当于返回None。
定义了函数之后,就相当于有了一段具有特定功能的代码,要想让这些代码能够执行,需要调用函数。调用函数的方式很简单,通过“函数名()”即可完成调用。
# 定义一个函数,能够完成打印信息功能
def print_info():
print("-"*20)
print("人生苦短,我用python!")
print("-"*20)
# 调用函数
print_info()
在介绍函数的参数之前,我们先来解决一个问题。现在要求定义一个函数,这个函数用于计
算两个数的和,并把计算的结果打印出来。把上述要求转换为代码,示例代码如下:
def add():
c = 11 + 22
print(c)
以上函数的功能是计算11和22的和。此时,无论调用这个函数多少次,得到的结果永远都是一样的,而且只能计算固定的两个数字的和,使得这个函数的局限性很大。
为了能让定义的函数更加通用,即计算任意两个数字的和,可以在定义函数的时候添加两个参数,让两个参数来接收传递给函数的值。接下来,通过一个案例来演示函数是如何传递参数的。
def add(a, b):
c = a + b
print(c)
上面案例中,定义了能接收两个参数的函数。其中,a为第一个参数,用于接收函数传递的第1个数值;b为第二个参数,接收的是函数的第2个数值。这时,如果想调用add函数,则需要给函数的参数传递两个数值,如下所示为完整代码:
def add(a, b):
c = a + b
print(c)
# 调用带有参数的函数时,需要在小括号中传递数据。
add(35, 25)
上面代码运行结果为:
50
需要注意的是,如果函数定义了多个参数,那么在调用函数的时候,传输的数据要和定义的参数一一对应。上面的案例中a=35,b=25,c=50。
定义函数时,可以给函数的参数设置默认值,这个参数就被称为默认参数。当调用参数的时候,由于猫人参数在定义时已经被赋值,所以可以直接忽略,而其它参数是必须要传入值的。
如果默认参数没有传入值,则直接使用默认的值;如果默认参数传入了值,则使用传入的新值替代。
下面我们通过一个案例来介绍。
def print_info(name, age=35):
# 打印任何传入的字符串
print("Name:", name)
print("age:", age)
# 调用print_info(name="miki")
print_info(name="miki")
print_info(name="miki", age=9)
运行结果为:
Name: miki
age: 35
Name: miki
age: 9
在上面案例,第1~4行代码定义了带有两个参数的print_info函数。其中,name参数没有设置默认值,age作为默认参数已经设置了默认值。在第6行调用print_into函数时,由于只传入了name参数的值,所以程序会使用age参数的默认值;在第7行调用print_info函数时,同时传入了name和age两个参数的值,所以程序会使用传给age参数的新值。
需要注意的是,带有默认值的参数一定要位于参数列表的最后面,否则程序会报错。例如,给 print_info函数添加一个参数sex,放在参数列表的最后面,则报错信息如下图所示:
通常在定义一个函数时,若希望函数能够处理的参数个数比当初定义的参数个数多,此时可以在函数中使用不定长参数。其基本的语法格式如下:
def 函数名([forml_args,] *args, **kwargs):
"函数_文档字符串"
函数体
return 表达式
在上述格式中,函数共有3个参数。其中,formal_args为形参(也就是前面所用的参数,如(a,b),*args和** kwargs为不定长参数。当调用函数的时候,函数传入的参数个数会优先匹配formal_args参数的个数。如果传入的参数个数和formal_args参数的个数相同,不定长参数会返回空的元组或字典;如果传入参数的个数比formal_args参数的个数多,可以分为如下两种情况:
(1)如果传入的参数没有指定名称,那么*args会以元组的形式存放这些多余的参数
(2)如果传入的参数指定了名称,如m=1,那么* kwargs会以字典的形式存放这些被命名的参数,如{m:1}。
为了大家更好地理解,先通过一个简单的案例进行演示,具体如下所示。
def test(a, b, *args):
print(a)
print(b)
print(args)
test(11, 12
运行结果如下:
11
12
()
在上面案例中,第1~4行代码定义了带有多个参数的test函数。其中,args为不定长参数。当在第5行中调用test函数时,由于只传入11和122这两个数,所以这两个数会从左向右依次匹配test函数定义时的参数a和b,此时,args参数没有接收到数据,所以为一个空元组。
如果在调用test函数时,传入多个参数(这里指的是大于2个参数)情况又是什么样的呢?
下面看一段实例代码:
def test(a, b, *args):
print(a)
print(b)
print(args)
test(11, 12, 13, 14, 15, 16, 17, 18
运行结果如下:
11
12
(13, 14, 15, 16, 17, 18)
如果在参数列表的末尾使用* kwargs参数,示例代码如下
def test(a, b, *args, **kwargs):
print(a)
print(b)
print(args)
print(kwargs)
test(11, 12, 13, 14, 15, 16, 17, 18
运行结果:
11
12
(13, 14, 15, 16, 17, 18)
{}
从两次运行的结果可以看出,如果在调用test函数时传入多个数值,那么这些数值会从左向
右依次匹配函数test定义时的参数。如果跟formal_args参数的个数匹配完,还有多余的参数,则这些多余的参数会组成一个元组,和不定长参数args进行匹配。此时,kwargs参数没有接受到数据,所以为一个空字典。
在调用函数时,什么情况下传入的数据会匹配参数kwargs呢?看下面案例:
def test(a, b, *args, **kwargs):
print(a)
print(b)
print(args)
print(kwargs)
test(11, 12, 13, 14, 15, 16, 17, 18, m=22, n=33)
运行结果为:
11
12
(13, 14, 15, 16, 17, 18)
{'m': 22, 'n': 33}
从上述运行结果可以看出,如果参数是以键值对的形式传入的,则使用** kwargs参数来接收。
所谓“返回值”,就是程序中的函数完成一件事情后,最后给调用者的结果。比如,定义一
个函数来获取室内的温度,一旦调用这个函数,函数就会把拿到的温度值返回给调用者,这个温暖值就是函数的返回值。在Python中,函数的返回值是使用 return语句来完成的。接下来,看一段示例代码。
def add(a, b):
c = a + b
return
或者
def add(a, b):
return a + b
上面的代码中,函数add中包含了return语句,意味着这有个函数的返回值,其返回值就是a和b相加的结果。
根据有没有参数和返回值,函数大概可以分为以下四种类型:
(1)函数无参数,无返回值。
(2)函数无参数,有返回值。
(3)函数有参数,无返回值。
(4)函数有采参数,有返回值。
下面我们分别介绍。
1)无参数、无返回值的参数
无参数、无返回值的函数,既不能接受参数,也没有返回值。
接下来,我们通过打印提示的函数来演示这类函数的使用。
def print_menu():
print("-"*20)
print(" xx涮锅 点菜系统")
print(" 1. 羊肉涮锅")
print(" 2. 牛肉涮锅")
print(" 3. 猪肉涮锅")
print("-" * 20)
print_menu(
运行结果为:
2)无参数、有返回值的函数
此类函数不能接收参数,但是可以返回某个数据,一般情况下,采集数据时会用此类函数。接下来,我们通过一个示例来演示,如下所示:
# 获取温度def get_temperature():
# 这里是温度获取的一些处理过程
# 为了简单起见,先模拟返回一个数据
return 24
temperture = get_temperature()
print('当前的温度为:', temperture
运行结果为:
当前的温度为: 24
3)有参数、无返回值的函数
在实际开发中,有参数、无返回值的函数用的极少,这是因为函数作为功能模块,既然传入了参数,绝大多数情况是希望使用返回值的。这里,大家对有参数、无返回值的函数有所了解即可,实例代码如下:
def test(number_one, number_two):
result = number_one + number_two
print('计算结果为: %d'%result
4)有参数、有返回值得函数
此类函数不能接收参数,但是可以返回某个数据,一般情况下,采集数据时会用此类函数。
接下来,我们通过一个示例来演示。
# 计算1~number的累积和
def calculate(nuber):
result = 0
i = 1
while i <= nuber:
result = result +i;
i +=1
return result
result = calculate(100)
print('1~100的累积和为:', result
运行结果为: