目标
- 函数参数和返回值的作用
- 函数的返回值进阶
- 函数的参数进阶
- 递归函数
01 函数参数和返回值的作用
定义函数时,是否接收参数或者是否返回结果,是根据 实际的功能需求 来决定的!
02 函数的返回值
- 返回值是函数完成工作后,最后给调用者的一个结果,在函数中使用 return 关键字可以返回结果
- 调用函数一方,可以 使用变量 来接收 函数的返回结果
- 可以使用元组让函数一次返回多个值(括号可以省略)
return ( temp,wetness ) return temp,wetness
如果函数返回的类型是元组,同时希望单独的处理元组中的元素,可以使用多个变量,一次接收函数的返回结果。注意:使用多个变量接受结果时,变量的个数应该和元组中元素的个数保持一致。
gl_temp,gl_wetness = measure ( )
面试题——交换两个数字
题目要求:
- 有两个整数变量 a = 6,b = 100
- 不使用其他变量,交换两个变量的值
解法一:
a = a + b
b = a - b
a = a - b
解法二:(python 专有)
a,b = (b,a)
a,b = b,a
03 函数参数的进阶
无论传递的参数是 可变还是不可变,只要 针对参数 使用 赋值语句,会在函数内部修改局部变量的引用,不会影响到外部变量的引用。
但如果传递的参数是 可变类型,在函数内部,使用 方法(而不是赋值) 修改了数据的内容,同样会影响到外部的数据。
注意:(面试题)列表变量使用 += 不会做相加再赋值的操作(与数字和字符串不同),其本质上是在调用列表的 extend 方法。
def demo(num,num_list): print("函数内部的代码") # 在函数内部,针对参数使用赋值语句,不会修改到外部的实参变量 num = 100 num_list = [1,2,3] print(num) print(num_list) print("函数执行完成") gl_num = 99 gl_list = [4,5,6] demo(gl_num,gl_list) print(gl_num) print(gl_list)
函数的缺省参数:
定义函数时,可以给某个参数指定一个默认值,具有默认值的参数就叫做缺省参数。调用函数时,如果没有传入缺省参数的值,则在函数内部使用定义函数时指定的 参数默认值。
函数的缺省参数,将常见的值设置为参数的缺省值,从而简化函数的调用。
在定义函数时,在形参后使用赋值语句,可以指定参数的缺省值。
注意:必须保证带有默认值的缺省形参 在参数列表 末尾
在调用函数时,如果有多个缺省参数,需要指定参数名,这样解释器才能够知道参数的对应关系。
多值参数:
- 当 一个函数 能够处理的参数 个数 是不确定的,这时可以使用多值参数。
- 在python 中有两种多值参数:
参数名前增加一个 * 可以接收 元组
参数名前增加两个 ** 可以接收 字典 - 一般在给多值参数命名时,习惯使用以下两个名字:
*args——存放元组参数,args 是 arguments 的缩写,有变量的含义
* * kwargs——存放字典参数 ,kwargs 可以记忆键值对参数
多值参数案例演练:
需求:
- 定义一个函数 sum_numbers ,可以接收 任意多个整数
- 功能:将传递的所有数字累加,并返回累加结果。
代码1:
def sum_numbers(args): sum = 0 for num in args: sum = sum + num return sum result = sum_numbers((1,2,3,4)) print(result)
代码2:
def sum_numbers(*args): sum = 0 for num in args: sum = sum + num return sum result = sum_numbers(1,2,3,4) print(result)
元组和字典的拆包:
- 在调用带有多值参数的函数时,如果希望:
将一个元组变量直接传递给 args
将一个字典变量直接传递给 kwargs - 就可以使用拆包,简化参数的传递,拆包的方式是:
在元组变量前,增加一个 *
在字典变量前,增加两个 **
def demo(*args,**kwargs): print(args) print(kwargs) gl_nums = (1,2,3) gl_xiaoming = {"name":"小明","age":18} # 会把 gl_nums 和 gl_xiaoming 两个变量传入一个元组 demo(gl_nums,gl_xiaoming) # 将元组变量传给 args 将 字典变量传给 kwargs,即元组和字典的拆包 # 拆包语法: demo(*gl_nums,**gl_xiaoming) demo(1,2,3,name = "小明",age = 18)