Python 的四种共享传参详解


Python 唯一支持的参数传递方式为共享传参(call by sharing),传递参数一共有四种传递方式,分别为:位置参数,默关键字参数和可变参数,其中可变参数分为两种(*args 和 **kargs)。

一、位置参数

函数调用时,参数会根据函数定义的参数位置而自动传递。

  1. def func(a, b):

  2.    print(a)

  3.    print(b)

  4.    return a+b


  5. >>func("A", "B")

  6.    A

  7.    B

  8.    'AB'


  9. >>func("B", "A")

  10.    B

  11.    A

  12.    'BA'

在上述实例中,我们发现参数的传递必须严格按照参数的定义位置进行传递的,而且函数的参数与调用函数所传递的参数数量不一致时,就会引发TypeError。

二、默认参数

函数调用时,为函数的某个参数提供默认值,调用函数时可选择不传入改参数的值。

  1. def func(a="B", b):

  2.    print(a)

  3.    print(b)

  4.    return a+b


  5. SyntaxError: non-default argument follows default argument

  1. def func(a, b="A"):

  2.    print(a)

  3.    print(b)

  4.    return a+b


  5. >>func("A")

  6.    A

  7.    A

  8.    'AA'


  9. >>func("A", "B"):

  10.    A

  11.    B

  12.    "AB"

从上述实例中,我们发现默认参数必须在位置参数的后面。个人认为默认参数是位置参数的一种缺省形式。这也可以解释为何默认参数必须在位置参数的后面。

三、关键字参数

在进行函数调用时,使用 "参数名"="值" 的形式进行参数指定。清除位置参数在调用时的顺序要求。

  1. def func(a, b):

  2.    print(a)

  3.    print(b)

  4.    return a+b


  5. >>func(b="B", a="A")

  6.    A

  7.    B

  8.    "AB"


  9. def func(a, b="B"):

  10.    print(a)

  11.    print(b)

  12.    return a+b


  13. >>func(a="A")

  14.    A

  15.    B

  16.    'AB'


  17. >>func(a="A", b="C"):

  18.    A

  19.    B

  20.    'AC'

从上述实例可以看出,虽然函数定义时按照位置参的形式定义的,但是依然可以在调用的时候可以使用关键字参数来进行指定,如果函数定义时有默认参数,则依然可以选择缺省或者传入。

四、可变参数

可变参数是指在函数定义时使用 *args (*加参数名)和 **kargs (**加参数名)的形式作为参数,在函数调用时就可以传入多个参数,会在实际工程中更加灵活,其中 *args 对应着传入多个位置参数,**kargs 对应传入多个关键字参数。

  1. def func(*args):

  2.    print(type(args))

  3.    print(args)

  4.    for i in args:

  5.        print(i)


  6. >>func("A", "B")

  7.    <class 'tuple'>

  8.    ('A', 'B')

  9.    A

  10.    B


  11. >>> func()

  12.    <class 'tuple'>

  13.    ()

从上述实例中可以看出,可变参数 *args 在使用时可以自由选择位置参数个数,在函数使用时,函数会自动生成一个元组 (tuple) 来放置位置参数,我们在定义函数的时候只需要操作对应的元组即可,注意一个小细节,为何要使用元组?这实际上也对应了位置参数的位置不可变性。

  1. def func(**kargs):

  2.    print(type(kargs))

  3.    print(args)

  4.    for key, value in kargs.items():

  5.        print("%s : %s" % (key,value) )


  6. >>> func(a="A", b="B")

  7.      <class 'dict'>

  8.      {'a': 'A', 'b': 'B'}

  9.      a : A

  10.      b : B


  11. >>> func(b="B", a="A")

  12.      <class 'dict'>

  13.      {'b': 'B', 'a': 'A'}

  14.      b : B

  15.      a : A


  16. >>> func()

  17.      <class 'dict'>

  18.      {}

从上述实例可以看出,可变参数 **kargs 使用时也可以自由选择关键字参数的个数,在函数使用时,函数会生成一个字典(dict)来放置关键字参数,我们在定义函数时只需要操作对应的字典字典即可,同样注意一个小细节,为何是使用字典?这同样也对应了关键字参数的位置可变性。

五、四种参数的混用

我们在实际应用中,经常会用到这几种参数的搭配使用,下面通过一个例子来解释这四种参数的混用情况。

  1. def func(a, b="B", *args, c,**kargs):

  2.    print(a)

  3.    print(b)

  4.    print(*args)

  5.    print(c)

  6.    print(kargs)


  7. >>> func("A", "X", "Z", c="CC", d="DD", f="FF")

  8.        A

  9.        X

  10.        Z

  11.        CC

  12.        {'d': 'DD', 'f': 'FF'}


  13. >>> func("A",c="CC")

  14.        A

  15.        B


  16.        CC

  17.        {}

从上述实例中可以看出,我们在混用时主要遵循两个原则

1.在函数定义时,顺序为(位置参数,默认参数,*args 可变参数,关键字参数, **kargs 可变参数)。

2.在调用时,位置参数和关键参数一定要有,不可缺省,可变参数可以缺省。特别注意,如果定义了默认参数,又定义了 *args 可变参数,需注意位置参数的个数,因为函数调用默认会先识别默认参数。上述实例中就有这种情况。

因作者个人水平有限,如果文章中有问题或者错误,请大家多多指正,谢谢。

作者简介

杨仁聪,长安大学信息工程学院研究生一年级,交通运输工程专业,从 python 学习开始,梦想能够加入一个世界500强企业,成为一位优秀的 python 工程师。


留言打卡DAY xx

今日主题:聊聊你对 Python 函数中参数的理解~

『留言打卡活动』

公号后台回复 “留言打卡”,了解活动详情。


-------------------End-------------------



©著作权归作者所有:来自51CTO博客作者mb5fe18e7c44408的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. 正确使用异步函数的姿势[每日前端夜话(0x06)]
  2. Numpy中Meshgrid函数介绍及2种应用场景
  3. Python中匿名函数与内置高阶函数详解
  4. 面试必知必会|理解C++虚函数
  5. 类和函数傻傻分不清楚?三个例子讲明白
  6. hive窗口函数/分析函数详细剖析
  7. 【Python】一文说清楚类与函数的选择
  8. 字符串处理函数
  9. PHP中字符串处理的一些常用函数

随机推荐

  1. 模态的jQuery动态高度宽度
  2. 如何使用jQuery捕获对href值的单击
  3. 使用jquery从mysql数据库加载数据
  4. 使用Next设置选定的选项
  5. 如何在使用jquery验证和自定义错误放置时
  6. 为$ .plugin()用法准备插件而不是$(selector
  7. 目前最好用的“点击复制”功能,兼容主流浏
  8. jQuery自动完成在AutoPostBack上丢失文本
  9. jquery插件ztree的总结
  10. jQuery -> 获取后代元素的三种方法