zoukankan      html  css  js  c++  java
  • Python——函数的几种形式还有多值递归拆包操作

    一、函数的几种形式

    1. 函数根据有没有参数和 返回值,可以组合成下面的四组

    - 无参,无值
    - 无参,有值
    - 有参,有值
    - 有参,无值
    

    2.那么我们到底给那种呢?

    我给出了如下的总结:

    2.1 无参数,无返回值

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

    1. 只是单纯地做一件事情,例如 显示菜单
    2. 在函数内部 针对全局变量进行操作,例如:新建名片,最终结果 记录在全局变量

    注意:

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

    2.2 无参数,有返回值

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

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

    1.3 有参数,无返回值

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

    • 函数内部的代码保持不变,针对 不同的参数 处理 不同的数据
    • 例如 名片管理系统 针对 找到的名片修改删除 操作

    2.4 有参数,有返回值

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

    • 函数内部的代码保持不变,针对 不同的参数 处理 不同的数据,并且 返回期望的处理结果
    • 例如 名片管理系统 使用 字典默认值提示信息 提示用户输入内容
      • 如果输入,返回输入内容
      • 如果没有输入,返回字典默认值

    二、关于返回值

    1.代码实例

    
    
    def measuer():
        print("开始...")
        temp = 30
        wetness = 50
        print("结束...")
        #元祖可以使用多个数据,所以可以放回多个值
        # 如果函数返回的元祖,我们可以丢掉小括号
        return temp,wetness
    
    result = measuer()
    
    print(result)
    # 单独的拿出来元素,但是不是恒方便
    print(result[0])
    # 我们可以使用多个变量一次接受返回自
    
    gl_temp,gl_wetbess = measuer()
    print(gl_temp)
    print(gl_wetbess)
    

    2.面试题 —— 交换两个数字

    题目要求

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

    解法 1 —— 使用其他变量

    # 解法 1 - 使用临时变量
    c = b
    b = a
    a = c
    

    解法 2 —— 不使用临时变量

    # 解法 2 - 不使用临时变量
    a = a + b
    b = a - b
    a = a - b
    

    解法 3 —— Python 专有,利用元组

    a, b = b, a
    

    三、函数的参数 进阶

    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:如果传递的参数是 可变类型,在函数内部,使用 方法 修改了数据的内容,同样会影响到外部的数据

    def mutable(num_list):
    
        # num_list = [1, 2, 3]
        num_list.extend([1, 2, 3])
        
        print(num_list)
    
    gl_list = [6, 7, 8]
    mutable(gl_list)
    print(gl_list)
    

    2. 面试题 —— +=

    • python 中,列表变量调用 += 本质上是在执行列表变量的 extend 方法,不会修改变量的引用
    def demo(num, num_list):
    
        print("函数内部代码")
    
        # num = num + num
        num += num
        # num_list.extend(num_list) 由于是调用方法,所以不会修改变量的引用
        # 函数执行结束后,外部数据同样会发生变化
        num_list += 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. 缺省参数

    所谓的缺省,实际上,你可以理解为,默认值

    • 调用函数时,如果没有传入 缺省参数 的值,则在函数内部使用定义函数时指定的 参数默认值
    • 函数的缺省参数,将常见的值设置为参数的缺省值,从而 简化函数的调用
    • 例如:对列表排序的方法
    gl_num_list = [6, 3, 9]
    
    # 默认就是升序排序,因为这种应用需求更多
    gl_num_list.sort()
    print(gl_num_list)
    
    # 只有当需要降序排序时,才需要传递 `reverse` 参数
    gl_num_list.sort(reverse=True)
    print(gl_num_list)
    
    • 关于缺省参数需要注意的事情:
    1. 首先,参数使用赋值语句,可以指定为缺省值(默认值)
    比如这个的代码
        def print_info(name, gender=True):
    
    2. **必须保证** **带有默认值的缺省参数** **在参数列表末尾**
    
    3. 在 **调用函数时**,如果有 **多个缺省参数**,**需要指定参数名**,这样解释器才能够知道参数的对应关系!
    
    以下是具体的代码案例
    
    
    ```python
    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("老王", title="班长")
    print_info("小美", gender=False)
    
    

    3.多值参数

    1. 如何定义一个多值参数?
    def demo(num, *args, **kwargs):
    
        print(num)
        print(args)
        print(kwargs)
    
    
    demo(1, 2, 3, 4, 5, name="小明", age=18, gender=True)
    
    
    • 我们希望这个函数能够处理的参数的个数不确定的时候,我们就可以用的上了
    • Python中的多值参数,有两种
      • 参数名前增加 一个 * 可以接收 元组
      • 参数名前增加 两个 * 可以接收 字典
    • 一般在给多值参数命名时,习惯使用以下两个名字
      • *args —— 存放 元组 参数,前面有一个 *
      • **kwargs —— 存放 字典 参数,前面有两个 *

    4. 元祖和字典的拆包

    def demo(*args, **kwargs):
    
        print(args)
        print(kwargs)
    
    
    # 需要将一个元组变量/字典变量传递给函数对应的参数
    gl_nums = (1, 2, 3)
    gl_xiaoming = {"name": "小明", "age": 18}
    
    # 会把 num_tuple 和 xiaomin, gl_xiaoming)
    demo(*glg 作为元组传递个 args
    # demo(gl_nums_nums, **gl_xiaoming)
    
    

    它主要完成的是以下的任务:希望将一个元组/字典变量直接传递给args/kwargs

    递归函数,

    其实这个是一种算法。详见我的博客,算法分类

  • 相关阅读:
    Interviewe(hdu3486)
    Cornfields(poj2019)
    C. Watching Fireworks is Fun(Codeforces 372C)
    A. Points on Line
    Fence(poj1821)
    7
    如何使用Visual Studio调试C#程序
    do…while语句
    通过ASP.NET Ajax技术模拟实现NBA比赛文字直播功能
    RecyclerView的基础用法
  • 原文地址:https://www.cnblogs.com/BM-laoli/p/12430463.html
Copyright © 2011-2022 走看看