• 大爽Python入门教程 43 函数传参 形参、实参 default、*args、**kwargs


    大爽Python入门公开课教案 点击查看教程总目录

    1 回顾参数

    先来熟悉下参数,参数在函数头定义。
    回顾一下,前两节定义了一些函数的函数头,
    例如

    • def calculate_sum(n):
    • def show_course_average(course_name)

    这些函数是需要传参的,
    n是函数calculate_sum需要的参数。
    course_name是函数show_course_average需要的参数。

    再例如

    • def simple_func():
      这个函数是不需要传参的。

    简而言之,就是定义函数时,
    函数头的括号里,定义的就是参数。

    2 实参形参 parameter、argument

    其实,参数对应的英文有两个
    parameter、 argument

    很多地方这两个说法是混用的,大多数时候其实也不讲究。
    不过这里做教程,严谨的谈论下这两个。

    • parameter 是定义函数时使用的变量,
      也可以说是形式上的参数,形参(formal parameter)
    • argument 是调用函数时传入的变量名,
      也可以说是实际上的参数,实参(actual argument)

    举例如下

    def calculate_sum(n):  # n: parameter,形参,formal parameter
        k = 1
        s = 0
        for i in range(n):
            s += k / (i + 1)
            k = -k
        print("n=%s: S=%s" % (n, s))
    
    a = 100
    calculate_sum(a)  # a: argument,实参,actual argument
    

    大多数时候,不产生混淆的话,都统称为参数就好。

    3 参数默认值

    一般来讲,parameter的数量和argument的数量需要是一样的。
    即声明函数定义了多少个形参,
    调用函数时就需要传多少个实参。

    但是。。。
    也有偷懒的办法。
    如果一个形参,常常使用一个值,每次我们都传一遍实参就划不来了。
    省事的办法是,在定义函数的地方,我们可以给这个参数一个默认参数值(Default Argument Values)。
    如果调用时不写参数,就使用默认的,
    写了参数就是用写了的参数。

    比如,这是一个非常简单的打招呼的函数。

    def greet(name, hello="Hello"):
        print("%s %s" % (hello, name))
    
    greet("Lee")
    greet("Lee", "Hi")
    greet("Lee", "Welcome")
    

    其输出为

    Hello Lee
    Hi Lee
    Welcome Lee
    

    即调用时,不指定hello变量的值,
    则使用默认参数"hello"
    指定了,就是用指定的值。

    4 传参方式

    调用函数时,传入的实参和形参是怎么匹配的呢?
    之前的例子,都是通过位置来匹配的。
    第一个实参匹配第一个形参,
    第二个实参匹配第二个形参,
    ......

    使用这样的匹配方式的参数,也叫做positional arguments
    基于位置匹配的参数,简称位置参数。

    除了通过位置来匹配,还可以在调用时,使用形参名来匹配。
    示例如下

    def func(a, b, c):
        print("a: %s" % a)
        print("b: %s" % b)
        print("c: %s" % c)
    
    
    func(c=2, b=1, a=3)
    

    其输出为

    a: 3
    b: 1
    c: 2
    

    上面这句代码func(c=2, b=1, a=3)
    其中abc分别对应三个形参名。
    等号后要传给这些形参的实参值。

    使用这样的方式传递的参数,叫做keyword argument,
    基于形参名匹配的参数,关键字参数。

    这两种可以混用,但是注意:
    positional arguments必须要在keyword argument之前。

    示例如下

    def func(a, b, c):
        print("a: %s" % a)
        print("b: %s" % b)
        print("c: %s" % c)
    
    func(1, 2, c=5)
    

    当然,初学者估计会有疑惑,
    这两种传参方式哪个好,或者说什么时候用哪个。

    这里个人的看法是,
    一般能用positional arguments就用positional arguments,
    发现这个不行了或者麻烦,再用keyword argument

    5 *args

    在形参中,*args用于接受不定数量的位置参数positional arguments
    并会将这些参数打包放在元组中

    具体见下

    def func(*args):
        print(args)
    
    func()
    func(1)
    func(1, 2)
    func(1, 2, 5)
    

    输出如下

    ()
    (1,)
    (1, 2)
    (1, 2, 5)
    

    注意,这里的核心是*符号,后面的args换成别的名字也可以。

    6 **kwargs

    在形参中,**kwargs用于接受不定数量的关键词参数keyword argument
    并会将这些参数打包放在字典中

    具体见下

    def func(**kwargs):
        print(kwargs)
    
    func()
    func(a=1)
    func(a=1, bb=2)
    func(a=1, b=2, value=5)
    

    输出如下

    {}
    {'a': 1}
    {'a': 1, 'bb': 2}
    {'a': 1, 'b': 2, 'value': 5}
    

    注意,这里的核心是**符号,后面的kwargs换成别的名字也可以。

    *args**kwargs暂时不需要会用,能看懂代码就行。

  • 相关阅读:
    C语言强化(五)输出一串数中最小的 k 个
    C语言强化(四)求和为某个值的二叉树路径
    C语言强化(三)求子数组的最大和
    C语言强化(二)设计可以求最小元素的栈
    【转】深入理解Major GC, Full GC, CMS
    一步步优化JVM六:优化吞吐量
    一步步优化JVM五:优化延迟或者响应时间
    一步步优化JVM四:决定Java堆的大小以及内存占用
    一步步优化JVM三:GC优化基础
    一步步优化JVM二:JVM部署模型和JVM Runtime
  • 原文地址:https://www.cnblogs.com/BigShuang/p/15570874.html
Copyright © 2020-2023  润新知