zoukankan      html  css  js  c++  java
  • 关于python函数参数的传递*args, **kwargs的区别及用法(实例)

    关于python函数参数的传递*args, **kwargs的区别及用法

    1,区别:在 python 中,*args 和 **kwargs 都代表 1个 或 多个 参数的意思。*args 传入tuple 类型的无名参数(无法修改),而 **kwargs 传入的参数是 dict 类型(可以修改)。

    2,举个栗子

    • 1,*args的用法

      def list1(*args):
          print(args)
          for i in args:
              print(i)
          print("*args end")
      
      if __name__ == '__main__':
          a = [1,2,3,4,5]
          # 使用不同的方式传入参数
          list1(1,2,3,4,5)
          list1(a)
          list1(*a)
      
    • 输出结果:

      (1, 2, 3, 4, 5)
      1
      2
      3
      4
      5
      *args end
      ([1, 2, 3, 4, 5],)
      [1, 2, 3, 4, 5]
      *args end
      (1, 2, 3, 4, 5)
      1
      2
      3
      4
      5
      *args end
      
    • 分析,我们可以看到,第一种方法和第三种方法传入参数的结果时一致性的,都转化为了元组,而第二种传递方法,只是将传入列表,变为元组一项,说明,每个传入的参数(参数列表逗号分隔)都将转化为*args元组的其中一项,如果要传入一个列表。可以使用第三种方式传入(在列表或者元组名前面加*)。

    • 2,**kwargs的用法

      def list2(**kwargs):
          print(kwargs)
          kwargs[0] = 1
          print(kwargs.keys())
      
      if __name__ == '__main__':
          b = {
              "key1": 1,
              "host": '127.0.0.1',
          }
          list2(**b)
          list2(key1=1, host="127.0.0.1")
      
    • 输出结果:

      {'key1': 1, 'host': '127.0.0.1'}
      dict_keys(['key1', 'host', 0])
      {'key1': 1, 'host': '127.0.0.1'}
      dict_keys(['key1', 'host', 0])
      
    • 分析,输出结果一至,并且**kwargs可以修改。

    • 注意:如果给list2直接传入b是会报错的因为**kwargs接收的参数是键值对,要给出键和值,或者使用第一种方法传入整个字典,而不是单纯的传入一个单一的值,这样参数列表会优先匹配单个值的普通参数,或者*args参数,当没有这样的参数时会报错

    • 如果使用下面这种方式:

      list2(b=b)
      
    • 会输出:

      {'b': {'key1': 1, 'host': '127.0.0.1'}}
      dict_keys(['b', 0])
      
    • 字典b将作为键b的值

  • 相关阅读:
    django大全
    centos 下安装python3.6.2
    爬虫基础知识与简单爬虫实现
    HDU5950 Recursive sequence (矩阵快速幂加速递推) (2016ACM/ICPC亚洲赛区沈阳站 Problem C)
    ZOJ5833 Tournament(递归打表)
    ZOJ4067 Books(贪心)
    ZOJ4062 Plants vs. Zombies(二分+贪心)
    ZOJ4060 Flippy Sequence(思维题)
    洛谷P2568 GCD(线性筛法)
    2018.11.6刷题记录
  • 原文地址:https://www.cnblogs.com/jlxa162hhf/p/14161227.html
Copyright © 2011-2022 走看看