目标

  • 函数参数和返回值的作用
  • 函数的返回值进阶
  • 函数的参数进阶
  • 递归函数

01 函数参数和返回值的作用
定义函数时,是否接收参数或者是否返回结果,是根据 实际的功能需求 来决定的!
图片说明

02 函数的返回值

  • 返回值是函数完成工作后,最后给调用者的一个结果,在函数中使用 return 关键字可以返回结果
  • 调用函数一方,可以 使用变量 来接收 函数的返回结果
  • 可以使用元组让函数一次返回多个值(括号可以省略)
    return ( temp,wetness )
    return temp,wetness

如果函数返回的类型是元组,同时希望单独的处理元组中的元素,可以使用多个变量,一次接收函数的返回结果。注意:使用多个变量接受结果时,变量的个数应该和元组中元素的个数保持一致。

gl_temp,gl_wetness = measure ( )

面试题——交换两个数字
题目要求:

  1. 有两个整数变量 a = 6,b = 100
  2. 不使用其他变量,交换两个变量的值
    解法一:
    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 可以记忆键值对参数

多值参数案例演练:
需求:

  1. 定义一个函数 sum_numbers ,可以接收 任意多个整数
  2. 功能:将传递的所有数字累加,并返回累加结果。

代码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)