函数的进阶

目标

函数参数和返回值的作用

 函数的返回值 进阶

 函数的参数 进阶

 递归函数

01.函数参数和返回值的作用

函数根据 有没有参数 以及 有没有返回值,可以 相互结合,一共有 4种 组合形式

无参数,无返回值

无参数,有返回值

有参数,无返回值

有参数,有返回值

函数的进阶

定义函数时,是否要接收参数,或者是否返回结果,是根据实际的功能需求 来决定的!

1.如果函数 内部处理的数据不确定,就可以将外界的数据以参数传递到函数内部

2.如果希望一个函数 执行完成后向外界汇报执行结果,就可以增加函数的返回值

 1.1 无参数,无返回值

此类函数,不接受参数,也没有返回值,应用场景如下:

1.只是单纯的做一件事,例如 显示菜单

2.在函数内部 针对全局变量进行操作,例如:新建名片,最终结果 记录在全局变量中

注意:

 如果全局变量的数据是一个 可变类型,在函数内部可以使用 方法 修改全局变量的内容——变量的引用不会改变

 在函数内部,使用赋值语句 才会 修改变量的引用

1.2 无参数,有返回值

此类函数,不接受参数,但是有返回值,应用场景如下:

采集数据,例如: 温度计,返回结果就是当前的温度,而不需要传递任何的参数

1.3 有参数,无返回值

此类函数,接收参数,没有返回值,应用场景如下:

函数内部的代码保持不变,针对 不同的参数 处理 不同的数据

例如 名片管理系统 针对 找到的名片修改、删除 操作

1.4 有参数,有返回值

此类函数,接收参数,同时也有返回值,应用场景如下:

 02. 函数的返回值 进阶

 在程序开发中,有时候,会希望 一个函数执行结束后,告诉调用者一个结果,一边调用者针对具体数据做后续处理

 返回值 是函数 完成工作后,最后 给调用者的 一个结果

 在函数中使用 return 关键字可以返回结果

 调用函数一方,可以 使用变量接收 函数的返回结果

问题:一个函数执行后能否返回多个结果?

实例——温度和湿度的测量

 假设要开发一个函数能够同时返回当前的温度和湿度

 先完成返回温度的功能如下:

def measure():
    """返回当前温度"""
    print("开始测量")
    temp = 39
    print("测量结束")
    return temp

result = measure()
print(result)

 在利用 元组 在返回温度的同时,也能够返回 湿度

 改造如下:

def measure():
    """返回当前温度和湿度"""
    print("开始测量")
    temp = 39
    wetness = 50
    print("测量结束")
    return (temp,wetness)

提示:如果一个函数返回的是元组,括号可以省略

技巧

 在python中,可以 将一个元组 使用赋值语句 同时赋值给 多个变量

 注意:变量的数量需要和元组中元素的数量保持一致

temp,wetness = measure()

面试题——交换两个数字

题目要求

1.又两个整数变量 a=6 , b=100

2.不使用其他变量,交换两个变量的值

解法1

a = a+b
b = a-b
a = a-b
print(a)
print(b)

解法2—python专有,利用元组

a,b = b,a
print(a)
print(b)

03.函数的参数 进阶

3.1.不可变和可变参数

问题1:在函数内部,针对参数使用的 赋值语句,会不会影响调用函数时传递的实参变量?——不会!

 无论传递的参数是可变还是不可变

  只要 针对参数 使用 赋值语句,会在 函数内部 修改 局部变量的引用不会影响到 外部变量的引用

def demo(num,num_list):
    print("函数内部")
    # 赋值语句
    num = 200
    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)

问题2:如果传递的参数是 可变类型,在函数内部,使用 方法 修改了数据的内容,同样会影响到外部的数据

gl_list = [1,2,3]
def demo(num_list):
    print("函数内部代码")
    #使用方法修改列表内容
    num_list.extend([8,9])
    print(num_list)
    print("函数执行完成")


demo(gl_list)
print(gl_list)

面试题—— +=

  在 python 中, 列表变量调用 += 本质上是在执行列表变量的 extend 方法,不会修改变量的引用

gl_num = 9
gl_list = [1,2,3,4]
def demo(num,num_list):
    print("函数开始")
    # num = num + num
    num += num
    # 本质上是在调用列表的 extend 方法
    # num_list.extend(num_list)  由于是调用方法,所以不会修改变量的引用
    # 函数执行结束后,外部数据同样会发生变化
    # num_list += num_list
    print(num)
    print(num_list)
    print("函数结束")


demo(gl_num,gl_list)
print(gl_num)
print(gl_list)

3.2 缺省参数

  定义函数时,可以给 某个参数 指定一个默认值,具有默认值的参数就叫做 缺省参数

  调用函数时,如果没有传入 缺省参数 的值,则在函数内部使用定义函数时指定的 参数默认值

  函数的缺省参数,将常见的值设置为参数的缺省参数,从 而简化函数的调用

  例如:对列表排序的方法

gl_num_list = [4,5,6,2,4,9,1,2,3]
# 默认就是升序排序,因为这种应用需求跟多
gl_num_list.sort()
print(gl_num_list)


# 只有当需要降序排序时,才需要传递 reverse 参数
gl_num_list.sort(reverse=True)
print(gl_num_list)

 指定函数的缺省参数

  在函数后使用赋值语句,可以指定参数的缺省值

def print_info(name,gender=True):
    """

    :param name: 班上同学的姓名
    :param gender: True表示男生,False表示女生
    """
    gender_txt = "男生"
    if not gender:
        gender_txt = "女生"
    print("%s是%s" % (name,gender_txt))


print_info("小明")
print_info("老王")
print_info("小美",False)

提示:

1.缺省参数,需要使用 最常见的值 作为默认值

2.如果一个参数的值 不能确定,则不应该设置默认值,具体的数值在调用函数时,由外界传递!

缺省参数的两个注意事项:

1)缺省参数的定义位置

  必须保证 带有默认值的缺省参数 在参数列表末尾

  所以,以下定义是错误的!

def printi_nfo(name,gender=True,title);

2)调用带有多个缺省参数的函数

  在 调用函数时,如果有 多个缺省参数,需要指定参数名,这样解释器才能够知道参数的对应关系!

def print_info(name,title="",gender=True):
    """

    :param name: 班上同学姓名
    :param title: 职位
    :param gender: True 男生, False 女生
    """
    gender_text = "男生"
    if not gender:
        gender_text = "女生"
    print("[%s] %s 是%s" %(title,name,gender_text))

# 提示:在指定缺省参数的默认值时,应该使用最常见的值作为默认值
print_info("小明")
print_info("老王",title="班长")
print_info("小美",gender=False)