Python3 函数进阶

Posted 在奋斗的大道

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python3 函数进阶相关的知识,希望对你有一定的参考价值。

1、函数参数和返回值的作用

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

  1. 无参数,无返回值
  2. 无参数,有返回值
  3. 有参数,无返回值
  4. 有参数,有返回值

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

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

1.1 无参数,无返回值

此类函数,不接收参数,也没有返回值。

1.2 无参数,有返回值

此类函数,不接收参数,但是有返回值。

1.3 有参数,无返回值

此类函数,接收参数,没有返回值。

1.4 有参数,有返回值

此类函数,接收参数,同时有返回值。

2、函数的返回值 进阶

  • 在程序开发中,有时候,会希望 一个函数执行结束后,告诉调用者一个结果,以便调用者针对具体的结果做后续的处理
  • 返回值 是函数 完成工作后,最后 给调用者的 一个结果
  • 在函数中使用 return 关键字可以返回结果
  • 调用函数一方,可以 使用变量 来 接收 函数的返回结果

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

实现思路:

  • 在 Python 中,可以 将一个元组 使用 赋值语句 同时赋值给 多个变量
  • 注意:变量的数量需要和元组中的元素数量保持一致

eg:

def mutilvalue():
    temp = 27
    hum = 45
    return temp, hum

# 按间距中的绿色按钮以运行脚本。
if __name__ == '__main__':

    # 验证多值结果输出
    temp, hum = mutilvalue()
    print(temp)
    print(hum)

3、 函数的参数 进阶 

3.1. 不可变和可变的参数

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

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

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

eg:

def demo(nums, nums_list):
    print("函数内部")

    # 赋值语句
    nums = 200
    nums_list = [1, 2, 3]

    print(nums)
    print(nums_list)

    print("函数代码完成")

# 按间距中的绿色按钮以运行脚本。
if __name__ == '__main__':

    # 验证 可变/不可变参数 赋值语句是否影响调用实参。
    gl_num = 99
    gl_list = [4, 5, 6]
    demo(gl_num, gl_list)
    print(gl_num)
    print(gl_list)

效果截图:

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

eg:

def mutable(num_list):
    # num_list = [1, 2, 3]
    num_list.extend([1, 2, 3])

    print(num_list)

# 按间距中的绿色按钮以运行脚本。
if __name__ == '__main__':

    # 验证 可变参数 数据修改是否影响调用实参
    gl_list = [6, 7, 8]
    mutable(gl_list)
    print(gl_list)

 效果截图:

3.2 缺省参数

  • 定义函数时,可以给 某个参数 指定一个默认值,具有默认值的参数就叫做 缺省参数
  • 调用函数时,如果没有传入 缺省参数 的值,则在函数内部使用定义函数时指定的 参数默认值
  • 函数的缺省参数,将常见的值设置为参数的缺省值,从而 简化函数的调用

缺省参数的注意事项

1) 缺省参数的定义位置

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

错误案例eg:

def fn(first, second="second", *args, **keyword):

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

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

eg:

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

# 按间距中的绿色按钮以运行脚本。
if __name__ == '__main__':

    # 验证 多个缺省参数
    print_info("小明")
    print_info("老王", title="班长")
    print_info("小美", gender=False)

效果截图:

3.3 多值参数 

定义支持多值参数的函数

  • 有时可能需要 一个函数 能够处理的参数 个数 是不确定的,这个时候,就可以使用 多值参数
  • python 中有 两种 多值参数:
    • 参数名前增加 一个 * 可以接收 元组
    • 参数名前增加 两个 * 可以接收 字典
  • 一般在给多值参数命名时,习惯使用以下两个名字

    • *args —— 存放 元组 参数,前面有一个 *
    • **kwargs —— 存放 字典 参数,前面有两个 *
  • args 是 arguments 的缩写,有变量的含义

  • kw 是 keyword 的缩写,kwargs 可以记忆 键值对参数

eg:

# 定义函数模板:fn(位置函数, 可变参数, 可变参数)
def fn(first,  *args, **keyword):
    print(first)
    print(args)
    print(keyword)

# 按间距中的绿色按钮以运行脚本。
if __name__ == '__main__':

    # 验证 多值参数函数调用
    fn(1, 2, 3, 4, brother='周晨曦', subbrother="周晨宇")

效果截图:

4、函数的递归

函数调用自身的 编程技巧 称为递归

4.1 递归函数的特点

特点

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

代码特点

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

eg:

def sum_numbers(nums):
    if nums == 1:
        return 1

    # 假设 sum_numbers 能够完成 num - 1 的累加
    temp = sum_numbers(nums - 1)

    # 函数内部的核心算法就是 两个数字的相加
    return nums + temp

# 按间距中的绿色按钮以运行脚本。
if __name__ == '__main__':
    
    # 验证 函数递归
    print("参数累加结果:%d" % sum_numbers(100))

 效果截图:

 

以上是关于Python3 函数进阶的主要内容,如果未能解决你的问题,请参考以下文章

python3进阶之*args与**kwargs用法

Python3 函数进阶

学习笔记:python3,代码片段(2017)

Python3 变量进阶

scrapy主动退出爬虫的代码片段(python3)

python3开发进阶-Django视图(View)的常见用法