- 在编码过程中除了使用Python内置的函数以外,我们也经常需要自己定义函数。今天来回顾python中的函数。
目录
1.定义函数
2.中函数的返回值
3.递归函数
4.Python函数参数
5.Python函数使用默认参数
6.Python函数使用可变参数
7.Python函数使用可变关键字参数
1.定义函数
在Python中,定义一个函数要使用 def 语句,依次写出函数名、括号()、括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用 return 语句返回。
我们以定义一个求绝对值的函数my_abs函数为例:
def my_abs(x):if x >= 0:return xelse:return -x
我们继续定义一个求列表list所有元素的和的函数:
def list_sum(L):result = 0for num in L:result = result + numreturn resultL = [1, 3, 5, 7, 9, 11]
result =list_sum(L) # 调用定义的sum_list函数并获得return返回的结果
print(result)
2.中函数的返回值
2.1 函数没有返回值
def list_sum(l):result = 0for num in l:result = result + numprint('result is {}'.format(result))returnl = [1, 3, 5, 7, 9, 11]
result =list_sum(l) # 调用定义的sum_list函数并获得return返回的结果
print(result) # ==> None
2.2 函数返回多个值
除了返回None、一个值以外,函数也可以返回多个值,在函数中,如果需要返回多个值,多个值之间使用逗号分隔即可,但是需要注意顺序。
def data_of_square(side):C = 4 * sideS = side * sidereturn C, SC, S = data_of_square(16)
print('周长 = {}'.format(C)) # ==> 周长 = 64
print('面积 = {}'.format(S)) # ==> 面积 = 256# 也可以使用一个值存储函数返回的多值结果
result = data_of_square(16)
print(result) # ==> (64, 256)
3.递归函数
在函数内部调用其他函数,是非常常见的,通过合理拆分逻辑,可以降低程序的复杂度。如果在一个函数内部调用其自身,这个函数就是递归函数。
举个例子,我们来计算阶乘 n! = 1 * 2 * 3 * ... * n,用函数 fact(n)表示,可以看出:
fact(n) = n! = 1 * 2 * 3 * ... * (n-1) * n = (n-1)! * n = fact(n-1) * n
所以,fact(n)可以表示为 n * fact(n-1),只有n=1时需要特殊处理。
于是,fact(n)用递归的方式写出来就是:
def fact(n):if n==1:return 1return n * fact(n - 1)fact(1) # ==> 1
fact(5) # ==> 120
4.Python函数参数
函数参数是需要传递给函数内部的数据,函数参数可以是任意的数据类型,只要函数内部逻辑可以处理即可。
def print_param(param):print(param)
特定的参数就需要根据实际,需要对函数入参进行类型的校验,Python提供isinstance()函数,可以判断参数类型,它接收两个参数,第一个是需要判断的参数,第二个是类型。
def my_abs(x):# 这里如果传入字符串就报错了,现在我们进行验证如果不是整数或者浮点数就直接返回noneif not isinstance(x, int) or not isinstance(x, float):print('param type error.')return Noneif x >= 0:return xelse:return -x
5.Python函数使用默认参数
定义函数的时候,还可以有默认参数,默认参数的意思是当这个参数没有传递的时候,参数就使用定义时的默认值。
例如Python自带的 int() 函数:
int('123') # ==> 123
int('123', 8) # ==> 83 #第二个参数是转换进制base,如果不传,默认是十进制 (base=10),如果传了,就用传入的参数
我们来定义一个计算 x 的N次方的函数:
def power(x, n):s = 1while n > 0:n = n - 1s = s * xreturn s# 如果这里把参数n默认设置成2 就只需要传递一个参数即可
def power(x, n=2):s = 1while n > 0:n = n - 1s = s * xreturn s
power(9) # 81
需要注意的是,由于函数的参数按从左到右的顺序匹配,所以默认参数只能定义在必需参数的后面,否则将会出现错误。下面是个错误的例子:
# 错误的定义
def power(n=2, x):s = 1while n > 0:n = n - 1s = s * xreturn s
6.Python函数使用可变参数
除了默认参数,Python函数还接收一种参数叫做可变参数,可变参数即任意个参数的意思,可变参数通常使用*args
来表示。
def func(*args):print('args length = {}, args = {}'.format(len(args), args))func('a') # ==> args length = 1, args = ('a',)
func('a', 'b', 'c') # ==> args length = 3, args = ('a', 'b', 'c')
假设我们要计算任意个数的平均值,就可以定义一个可变参数:
def average(*args):sum = 0for item in args:sum += itemavg = sum / len(args)return avg
在调用的时候,我们就可以这样写:
average(1, 2) # ==> 1.5
average(1, 2, 2, 3, 4) # ==> 2.4
average()
# 报错
Traceback (most recent call last):
ZeroDivisionError: division by zero
在执行
average()
的时候,却报错了,这是因为在使用可变参数时,没有考虑周全导致的,因为可变参数的长度可能是0,当长度为0的时候,就会出现除0错误。因此需要添加保护的逻辑。
7.Python函数使用可变关键字参数
可变关键字参数,一般使用**kwargs来表示。
例如,想要打印一个同学的信息,可以这样处理:
def info(**kwargs):print('name: {}, gender: {}, age: {}'.format(kwargs.get('name'), kwargs.get('gender'), kwargs.get('age')))info(name = 'Alice', gender = 'girl', age = 16)
对于一个拥有必需参数,默认参数,可变参数,可变关键字参数的函数,定义顺序是这样的:
def func(param1, param2, param3 = None, *args, **kwargs):print(param1)print(param2)print(param3)print(args)print(kwargs)func(100, 200, 300, 400, 500, name = 'Alice', score = 100)
# ==> 100
# ==> 200
# ==> 300
# ==> (400, 500)
# ==> {'name': 'Alice', 'score': 100}
当然,这么多类型的参数,很容易导致出错,在实际使用上,不建议定义这么多的参数。
总结完函数部分,python的入门基础知识基本回顾完了。
Python 3 入门基础知识【1】数据类型 安装下载 推荐-CSDN博客
Python 3 入门基础知识 之数据容器及用法【2】 推荐-CSDN博客