zoukankan      html  css  js  c++  java
  • 函数进阶5.1函数参数高级用法

    一、缺省参数

    1. 是什么

    缺省参数也叫做默认参数,是指定义函数时形参变量有默认值,如果调用函数时没有传递参数,那么函数就用默认值,如果传递了参数就用传递的那个数据

    示例

    image-20200902145748782

    2. 做什么

    当调用函数时,有些参数不必传递,而是用默认值,这样的场景往往都用缺省参数

    例如,一个学校现在开始检查每个学生的信息,学生说:报告老师我是xxx学校xxx系xxx年级xxx班学生,名字叫xxxx,大家想只要是这学校的学生那么“xxx学校”就可以省略不用说了,因为大家都知道。所以就可以认为默认的学校就是xxx,而当其他学校的学生介绍时yyy学校名字案例说就一定要说清楚,否则让人弄混了

    来个demo试试看

    def print_info(name, class_name, grade, department_name, school_name="通俗易懂"):
        print("老师好:我是来自 %s学校 %s系 %s年级 %s班级 的学生,我叫%s" % (
            school_name,
            department_name,
            grade,
            class_name,
            name
        ))
    
    
    print_info("dong", "超牛", "二", "软件工程")
    print_info("dong", "超牛", "二", "软件工程", "codetutor.top")
    

      

     

    运行结果

    老师好:我是来自 通俗易懂学校 软件工程系 二年级 超牛班级 的学生,我叫dong
    老师好:我是来自 codetutor.top学校 软件工程系 二年级 超牛班级 的学生,我叫dong
    

      

     

    3. 注意点

    • 缺省参数只能在形参的最后(即最后侧)

    • 缺省参数全挨在一起(在右侧),不是缺省参数挨在一起(在左侧)

    >>> def printinfo(name, age=35, sex):
    ...     print name
    ...
    File "<stdin>", line 1
    SyntaxError: non-default argument follows default argument
    

      

     

    二、命名参数

    1. 是什么

    命名参数是指:在调用函数时,传递的实参带有名字,这样的参数叫做命名参数

    示例

    image-20200902152007236

    2. 做什么

    命名参数能够在调用函数的时候,不受位置的影响,可以给需要的参数指定传递数据

    3. 注意点

    • 命名参数的名字要与形参中的名字相同,不能出现命名参数名字叫做num,而形参中没有变量num

    • 如果形参左侧有普通的形参,调用函数时传递的参数一定要先满足这些形参,然后再根据需要编写命名参数

    def test(a, b, c=100, d=200):
        print("a=%d, b=%d, c=%d, d=%d" % (a, b, c, d))
    
    
    # 下面的方式都成功
    test(11, 22)
    test(11, 22, 33)
    test(11, 22, 33, 44)
    test(11, 22, d=33, c=44)
    
    # 下面的方式都失败
    test(c=1, d=2)  # 缺少a、b的值
    test(c=1, d=2, 11, 22)  # 11, 22应该在左侧
    

      

     

    三、不定长参数

    1. 是什么

    不定长参数:定义函数的时候形参可以不确定到底多少个,这样的参数就叫做不定长参数

    不定长参数有2种方式表示

    • *args :表示调用函数时多余的未命名参数都会以元组的方式存储到args
    • **kwargs:表示调用函数时多余的命名参数都会以键值对的方式存储到kwargs

    注意:

    • ***是必须要写的,否则就变成了普通的形参了
    • 当我们说不定长参数的时候,就是指*args**kwargs

    示例

    image-20200902153628034

    2. 做什么

    通过不定长参数,能够实现调用函数时传递实参个数可以随意变换的需求

    例如

    def test(a, b, *args, **kwargs):
        print("-------------------------------")
        print(a, type(a))
        print(b, type(b))
        print(args, type(args))
        print(kwargs, type(args))
    
    
    test(11, 22)
    test(11, 22, 33, 44, 55, 66)
    test(11, 22, 33, 44, 55, 66, name="wanglaoshi", web_site="http://www.codetutor.top")
    

      

     

    运行结果:

    -------------------------------
    11 <class 'int'>
    22 <class 'int'>
    () <class 'tuple'>
    {} <class 'tuple'>
    -------------------------------
    11 <class 'int'>
    22 <class 'int'>
    (33, 44, 55, 66) <class 'tuple'>
    {} <class 'tuple'>
    -------------------------------
    11 <class 'int'>
    22 <class 'int'>
    (33, 44, 55, 66) <class 'tuple'>
    {'name': 'wanglaoshi', 'web_site': 'http://www.codetutor.top'} <class 'tuple'>
    

      

     

    说明:

    image-20200902154142271

    3. 注意点

    • 加了星号*的变量args会存放所有未命名的变量参数,args为元组
    • 而加**的变量kwargs会存放命名参数,即形如key=value的参数, kwargs为字典
    • 一般情况下*args**kwargs会在形参的最右侧
    • argskwargs的名字可以变,例如叫*aa**bb都是可以,但一般为了能够让其他的开发者快速读懂我们的代码最好还是不改

    4. 特殊情况

    缺省参数在*args后面

    def sum_nums_3(a, *args, b=22, c=33, **kwargs):
        print(a)
        print(b)
        print(c)
        print(args)
        print(kwargs)
    
    
    sum_nums_3(100, 200, 300, 400, 500, 600, 700, b=1, c=2, mm=800, nn=900)
    

      

     

    说明:

    • *args后可以有缺省参数,想要给这些缺省参数在调用时传递参数,需要用命名参数传递,否则多余的未命名参数都会给args
    • 如果有**kwargs的话,**kwargs必须是最后的
  • 相关阅读:
    python读取配置文件 ConfigParser
    python中引号中有双引号
    L​i​n​u​x​下​的​D​a​e​m​o​n​简​介(转)
    华为离职副总裁徐家骏:年薪千万的工作感悟(转)
    《码农周刊》干货精选--Python篇(转)
    三个在线django速成教程(转)
    互联网架构学习相关资料(转)
    人人网张铁安:Feed系统架构分析(转)
    用 mongodb 储存多态消息/提醒类数据(转)
    关于如何构建一个微博型广播 二(转)
  • 原文地址:https://www.cnblogs.com/dong4716138/p/15702844.html
Copyright © 2011-2022 走看看