Python的函数具有非常灵活的参数形态,既可以实现简单的调用,又可以传入非常复杂的参数。

可变参数和关键字参数的语法:

  • *args是可变参数,args接收的是一个tuple;
  • **kw是关键字参数,kw接收的是一个dict。

使用*args和**kw是Python的习惯写法,当然也可以用其他参数名,但最好使用习惯用法。

一、可变参数*args

定义:可变参数就是传入的参数个数是可变的,可以是0个,1个,2个,……很多个。
作用:就是可以一次给函数传很多的参数
特征:*args

我们以数学题为例子,给定一组数字a,b…z,请计算sum = a * a + b * b + …+z * z

要定义出这个函数,我们必须确定输入的参数。由于参数个数不确定,我们首先想到可以把a,b,…,z作为一个list或tuple传进来,这样,函数可以定义如下:

def cout(numbers):sum = 0for n in numbers:sum = sum + n * nreturn sum

定义可变参数和定义一个list或tuple参数相比,仅仅在参数前面加了一个*号。在函数内部,参数numbers接收到的是一个tuple,因此,函数代码完全不变。但是,调用该函数时,可以传入任意个参数,包括0个参数:

>>> cout([1, 2, 3])
14
>>> cout((1, 3, 5, 7))
84

如果利用可变参数,调用函数的方式可以简化成这样:

>>> cout(1, 2, 3)
14
>>> cout(1, 3, 5, 7)
84

所以,我们把函数的参数改为可变参数:

def cout(*numbers):sum = 0for n in numbers:sum = sum + n * nreturn sum

定义可变参数和定义一个list或tuple参数相比,仅仅在参数前面加了一个*号。在函数内部,参数numbers接收到的是一个tuple,因此,函数代码完全不变。但是,调用该函数时,可以传入任意个参数,包括0个参数:

>>> cout(1, 2)
5
>>> cout()
0
如果已经有一个list或者tuple,要调用一个可变参数怎么办?可以这样做:
>>> nums = [1, 2, 3]
>>> cout(nums[0], nums[1], nums[2])
14
这种写法当然是可行的,问题是太繁琐,所以Python允许你在list或tuple前面加一个*号,把list或tuple的元素变成可变参数传进去:
>>> nums = [1, 2, 3]
>>> calc(*nums)

*nums表示把nums这个list的所有元素作为可变参数传进去。这种写法相当有用,而且很常见。

二、关键字参数**kw

定义:关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。在调用函数时,可以只传入必选参数。
作用:扩展函数的功能
特征:**kw

请看示例:

def person(name, age, **kw):print('name:', name, 'age:', age, 'other:', kw)

函数person除了必选参数name和age外,还接受关键字参数kw。在调用该函数时,可以只传入必选参数:
>>> person(‘Michael’, 30)
name: Michael age: 30 other: {}

也可以传入任意个数的关键字参数:
>>> person('Bob', 35, city='Beijing')
name: Bob age: 35 other: {'city': 'Beijing'}>>> person('Adam', 45, gender='M', job='Engineer')
name: Adam age: 45 other: {'gender': 'M', 'job': 'Engineer'}

关键字参数有什么用?它可以扩展函数的功能。比如,在person函数里,我们保证能接收到name和age这两个参数,但是,如果调用者愿意提供更多的参数,我们也能收到。试想你正在做一个用户注册的功能,除了用户名和年龄是必填项外,其他都是可选项,利用关键字参数来定义这个函数就能满足注册的需求。

和可变参数类似,也可以先组装出一个dict,然后,把该dict转换为关键字参数传进去:

>>> extra = {'city': 'Beijing', 'job': 'Engineer'}
>>> person('Jack', 24, city=extra['city'], job=extra['job'])
name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'}当然,上面复杂的调用可以用简化的写法:
>>> extra = {'city': 'Beijing', 'job': 'Engineer'}
>>> person('Jack', 24, **extra)
name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'}

extra表示把extra这个dict的所有key-value用关键字参数传入到函数的kw参数,kw将获得一个dict,注意kw获得的dict是extra的一份拷贝,对kw的改动不会影响到函数外的extra。

参考自:
小喜

Python-非关键字参数和关键字参数(*args **kw)相关推荐

  1. python 装饰器简单笔记(附 *args **kw)

    1. 装饰器 由于函数也是一个对象,而且函数对象可以被赋值给变量,所以,通过变量也能调用该函数. 现在,假设我们要增强函数的功能,比如,在函数调用前后自动打印日志,但又不希望修改函数的定义,这种在代码 ...

  2. python中可变参数和关键字参数_python的可变参数和关键字参数(*args **kw)

    本文是来自廖大的python教程其中我一直忘记的部分.算是一个笔记把.因为日常这俩参数名字一直搞混 可变参数 在Python函数中,还可以定义可变参数.顾名思义,可变参数就是传入的参数个数是可变的,可 ...

  3. python中可变参数*args_Python-可变参数和关键字参数(*args **kw)

    前言: Python的函数具备很是灵活的参数形态,既能够实现简单的调用,又能够传入很是复杂的参数.函数 可变参数和关键字参数的语法:code *args是可变参数,args接收的是一个tuple:ci ...

  4. python 可变参数 关键字参数_Python关键字及可变参数*args,**kw原理解析

    可变参数 顾名思义,函数的可变参数是传入的参数可以变化的,1个,2个到任意个.当然可以将这些 参数封装成一个 list 或者 tuple 传入,但不够 pythonic.使用可变参数可以很好解决该问题 ...

  5. Python中*args、**kws 理解与使用(可变参数以及关键字参数)

    函数中的可变参数和关键字参数使用 可变参数 *arg在python的底层提前装包好,将数据装入元组中,若没有数据就是空元组.可以一次接受多个数据,不需要预先定义好需要接受参数的个数. def func ...

  6. python函数可以按照参数名称方式传递参数_python函数传入参数(默认参数、可变长度参数、关键字参数)...

    1.python中默认缺省参数----定义默认参数要牢记一点:默认参数必须指向不变对象! 1 def foo(a,b=1):2 printa,b3 4 foo(2) #2 1 5 foo(3,100) ...

  7. python函数用法详解2(变量的作用域(全局变量、局部变量)、共享全局变量、函数返回值、函数的参数(位置参数、关键字参数、默认参数、不定长参数)、拆包、交换变量值、引用、可变和不可变类型)

    1. 变量作⽤域         变量作⽤域指的是变量⽣效的范围,主要分为两类:局部变量和全局变量. 局部变量         定义在函数体内部的变量,即只在函数体内部⽣效. def testA(): ...

  8. python可变参数和关键字参数位置_python的位置参数、默认参数、关键字参数、可变参数区别...

    一.位置参数 调用函数时根据函数定义的参数位置来传递参数. #!/usr/bin/env python # coding=utf-8def print_hello(name, sex): sex_di ...

  9. Python的位置参数、默认参数、关键字参数、可变参数之间的区别

    1. 位置参数 调用函数时需根据定义的参数位置来传参 def print_hello(name, sex):print('hello %s %s, welcome to python world!' ...

  10. python 可变参数 关键字参数_Python之 可变参数和关键字参数

    原标题:Python之 可变参数和关键字参数 刚开始接触 python 的时候,对 python 中的 *wargs (可变参数) 和 **kwargs (关键字参数)的理解不是很透彻,看了一下 &l ...

最新文章

  1. 所有各数据库或文件的连接串定义CHM文件.
  2. SQLite中的运算符表达式
  3. Linux sed Examples--转载
  4. AGC023F - 01 on Tree
  5. STM32F103_步进电机
  6. linux环境重装rabbitmq,Linux系统安装RabbitMQ详细教程-Go语言中文社区
  7. CodeForces 589J Cleaner Robot
  8. Unity游戏框架设计
  9. 用户如何设置浏览器主页的历史记录和管理加载项
  10. 冲突等价(ConflictEquivalence) 可串行化调度(Serializable Schedules)
  11. SQLLDR载数加速,优化参数
  12. Redlock(redis 分布式锁)原理分析
  13. Arduino无法下载,重刷Bootloader后解决问题
  14. 计算机专业问卷调查,大学生计算机专业调查问卷.doc
  15. 如何查找CAD打印样式文件存储位置?
  16. 简明现代魔法 php,给PHP初学者的一些建议
  17. iOS-Core-Animation-Advanced-Techniques(三)
  18. 【微观金融理论与投资学】之第0章引论
  19. 古典密码(单表密码,维吉尼亚密码,普莱费尔密码,一次一密)
  20. 互怼、IPO、雷潮、寒冬,2018 互联网圈的那些事儿

热门文章

  1. C语言输出字母小树,数字小树,**号小树
  2. Python第十二章-多进程和多线程01-多进程
  3. 使用docker运行dotnetcore站点
  4. java打jar包的方式,jar命令,maven
  5. pytorch 全局变量_Pytorch如何通过深度学习展现全局
  6. 老公吵架把我扔街上_我是如何从在街上卖食物到为顶尖的技术公司工作的方式-第2部分:获取......
  7. 143_Power BIPower Pivot月度、季度、半年度、全年同维度展示
  8. linux man 后面的数字,Linux man命令的使用方法(以及后面数字的含义)
  9. oracle怎么判断地址相似,如何查看oracle数据文件的地址
  10. 超大图上的节点表征学习