Python 函数的返回值和参数

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

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

  1. 无参数,无返回值
  2. 无参数,有返回值
  3. 有参数,无返回值
  4. 有参数,有返回值
    函数的参数与返回值图解

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

  1. 如果函数 内部处理的数据不确定,就可以将外界的数据以参数传递到函数内部
  2. 如果希望一个 函数执行完成后,向外界汇报执行结果,就可以增加函数的返回值

02 函数的返回值 进阶

  • 在程序开发中,有时候,会希望 一个函数执行结束后,告诉调用者一个结果,以便调用者针对具体的结果做后续处理
  • 返回值 是函数 完成工作后,最后给调用者的一个结果
  • 在函数中使用 return 关键字返回结果
  • 调用函数一方,可以使用变量接收函数的返回结果
def measure():
    """测量温度、湿度"""
    print("测量开始....")
    temp = 38
    wetness = 50
    print("测量结束....")

    # 元组可以包含多个数据,因此可以返回多个值
    # 如果函数返回类型为元组,小括号可以省略
    # return (temp, wetness)
    return temp, wetness


result = measure()
print(result)

# 需要单独处理温度或者湿度
print(result[0])
print(result[1])

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

print(gl_temp)
print(gl_wetness)

面试题:交换两个数字

题目要求

  1. 有两个整数变量 a = 6 b = 100
  2. 不使用其他变量,交换两个变量的值
a = 6
b = 100

# 解法一:使用其他变量
c = a
a = b
b = c

print(a)
print(b)

# 解法二:不使用其他变量
a = a + b
b = a - b
a = a - b

print(a)
print(b)

# 解法三:Python专有 利用元组
a, b = b, a

print(a)
print(b)

03 函数的参数 进阶

3.1 不可变和可变的参数

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

  • 无论传递的参数是 可变 还是 不可变
    • 只要 针对参数 使用 赋值语句,会在 函数内部 修改 局部变量的引用,不会影响到 外部变量的引用
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)

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

def demo(num_list):
    
    print("函数内部的代码")

    # 使用方法修改列表的内容
    num_list.append(9)

    print(num_list)

    print("函数执行完成")


gl_list = [1, 2, 3]
demo(gl_list)
print(gl_list)

面试题:+=

  • Python中,列表变量调用 +=本质上是在执行列表变量的extend 方法,不会修改变量的引用
def demo(num, num_list):
    print("函数开始")

    # num = num + num
    num += num

    # 列表变量使用 + 不会做相加再赋值的操作
    # num_list = num_list + num_list
    # 而本质上是在调用列表的extend 方法
    num_list += num_list
    # num_list.extend(num_list)
    
    print(num)
    print(num_list)

    print("函数完成")


gl_num = 9
gl_list = [1, 2, 3]
demo(gl_num, gl_list)
print(gl_num)
print(gl_list)

3.2 缺省参数

  • 定义函数时,可以给某个参数指定一个默认值,具有默认值的参数就叫做缺省参数
  • 调用函数时,如果没有传入 缺省参数 的值,则在函数内部使用定义函数时指定的参数默认值
  • 函数的缺省参数,将常见的值设置为参数的缺省值,从而 简化函数的调用
  • 例如:对列表的排序方法
gl_list = [6, 3, 9]

# 默认按照升序排序
gl_list.sort()
print(gl_list)

# 如果需要降序排序,需要执行reverse参数
gl_list.sort(reverse=True)
print(gl_list)

指定函数的缺省参数

  • 在参数后使用赋值语句,可以指定参数的缺省值
def print_info(name, gender=True):
    """

    :param name: 姓名
    :param gender: 性别 True 男 False 女
    """
    gender_text = "男生"
    if not gender:
        gender_text = "女生"
    print("%s 是 %s" % (name, gender_text))


# 假设班上的男生居多
# 提示:在指定缺省参数的默认值时,应该使用最常见的值作为默认值
print_info("小明")
print_info("老王")
print_info("小妹", False)
 

提示

  1. 缺省参数,需要使用 最常见的值 作为默认值
  2. 如果一个参数的值 不能确定,则不应该设置默认值,具体的数值在调用函数时,由外界传递!

缺省参数的注意事项
1)缺省参数的定义位置

  • 必须保证带有默认值的缺省参数在参数列表末尾
  • 所以,以下定义时错误的!
def print_info(name, gender=True, title):

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

  • 调用函数时,如果有多个缺省参数,需要指定参数名,这样解释器才能够知道参数的对应关系!
def print_info(name, title="普通员工", gender=True):
    """

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


# 假设班上的男生居多
# 提示:在指定缺省参数的默认值时,应该使用最常见的值作为默认值
print_info("小明")
print_info("老王")
print_info("小妹", gender=False)

3.3 多值参数(了解即可)

定义支持多值参数的函数

  • 有时可能需要 一个函数 能够处理的参数 个数 时不确定的,这个时候,就可以使用多值参数
  • Python中有 两种 多值参数
    • 参数名前增加一个 * 可以接收元组
    • 参数明前增加两个 * 可以接收字典
  • 一般在给多值参数命名时,习惯使用以下两个名字
    • * args — 存放 元组 参数,前面一个 *
    • **kwargs — 存放 字典 参数,前面两个 *
  • argsarguments 的缩写,有变量的含义
  • kwkeyword 缩写, kwargs 可以记忆 键值对参数
def demo(num, *nums, **person):
    print(num)
    print(nums)
    print(person)


demo(1, 2, 3, 4, 5, name="小明", age=18)

提示:多值参数 的应用会经常出现在网络上一些大牛开发的框架中,知道多值参数,有利于我们能够读懂大牛的代码

多值参数案例( 计算任意多个数字的和)
需求
1、定义一个函数 sum_numbers,可以接收 任意多个参数
2、功能要求:将传递的所有数字累加,并返回累加结果

def sum_numbers(*args):

    num = 0

    print(args)
    # 循环遍历,进行求和
    for n in args:
        num += n

    return num


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_dict = {"name": "张三", "age": 19}

# 会把gl_nums和gl_dict传递给第一参数args
# demo(gl_nums, gl_dict)
# 拆包语法,可以简化元组/字典变量的传递
demo(*gl_nums, **gl_dict)

04 函数的递归

4.1 递归函数的特点

特点

  • 一个函数 内部 调用自己
    • 函数内部可以调用函数,当然在函数内部也可以调用自己

代码特点

  1. 函数内部的 代码 是相同的,只是针对 参数 不同,处理的结果不同
  2. 参数满足一个条件 时,函数不再执行
    • 这个非常重要,通常被称为递归的出口,否则 会出现死循环!!!

代码示例

def sum_number(num):

    print(num)
    # 递归的出口,当满足某个条件时,不再执行函数
    if num == 1:
        return

    # 字典调用自己
    sum_number(num - 1)
    print("完成 %d" % num)


sum_number(3)

代码图示
递归调用代码图示

4.2 递归案例(计算数字累加)

需求

  1. 定义一个函数 sum_numbers
  2. 能够接收一个 num 的整数参数
  3. 计算 1+2+3+…num 的结果

代码示例

def sum_numbers(num):

    # 1、出口
    if num == 1:
        return 1
    # 2、数字的累加
    temp = sum_numbers(num-1)
    return temp + num


result = sum_numbers(3)
print(result)

递归求和代码图示

提示:递归是一个 编程技巧,初次接触递归会感觉有些吃力!,在处理 不确定的循环条件 时,格外有用,例如:遍历整个文件目录的结果

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值