转载:http://blog.csdn.net/u012102306/article/details/52250050 收藏一下

在上一篇文章『[Python]给函数传递不定个数的参数』中,我们主要讲解了*在函数定义和函数调用阶段的不同作用,并留了一个小问题:

我们用*定义了add_int(*a)函数,现在有a_list=[1,2,3],那么我们调用add_int(*a_list)会产生什么效果呢?

如果文章你已看懂,那不难知道,最后被传到函数当中的a(1,2,3),因为经历了先用*解压——把a_list变成1, 2, 3并传到函数中,即add_int(1, 2, 3),再用*打包——把传进来的1, 2, 3变成(1, 2, 3)并赋给函数的形参a

同时我们在上一篇文章中留了一个不求甚解的点——python函数的两种传递参数的方式,这里我们详细展开,并将介绍一种新的、跟*类似的符号的用法

两种传参方式:按位置传递按关键字传递

假设已预先定义好一个执行两数相加的函数:

def add_2_int(a1, a2):return a1+a2

现在要计算1+2的结果,最自然的调用方式是add_2_int(1,2),这样1在函数中被赋予a12被赋予a2,这种赋值方式是按照1, 2 a1, a2在位置上的一一对应关系来赋值的,所以被称作按位置传递。其实我们还可以有另外的调用方式:add_2_int(a2=2, a1=1),显示地告诉函数,我要给a2赋值为2a1赋值为1,这是按照参数关键字来给参数赋值,与顺序、位置无关,所以叫按关键字传递

基于此,再次回顾一下上篇文章中*的用法,如果我们的调用方式是add_2_int(*[1,2] ),这是哪种参数传递方式呢?——答案当然是,按位置传递,因为[1,2]*解压成 1, 2传到函数中,与add_2_int(1,2)等价。

至此,聪明的读者肯定要问了,那按关键字传递有没有类似的『解压』用法呢?——且往下看

从一个例子说起

我们先定义一个简单的类——human,定义方式如下

class human():def __init__(self, gender = 'female', height = 160, weight = 55):   print 'gender: ', gender                print 'height: ', height                print 'weight: ', weight

有性别(gender)、身高(height)、体重(weight)三种基本属性,这三种基本属性都有默认值。

老实做人

接下来我们实例化一个human,取名叫 Catherine

Catherine = human(height=173,weight='67')  

Catherine的性别沿用了human类的默认值,所以没有在参数中给出,而身高体重都根据Catherine的实际情况做了调整,所以实例化类之后的结果是

gender:  female
height:  173
weight:  67

不难发现,我们这里对类进行初始化时,采用的方式是按关键字传递,而关键字和其取值,很容易让人联想到字典里的keyvalue,所以——如果关键字及其取值是『字典』形式,那我们就可以用一些方法『解压』再传给函数了,而对于『字典』的解压方式,显然不能用上面提到的*,因为*只能解压一个序列,像列表、元组等等,这里用到的解压方式,是*的孪生兄弟——**,具体用法如下:

dict_Catherine = {'weight':67,'height':173}
Catherine = human(**dict_Catherine)

**将自动解压出dict_Catherine里的key: value对儿,并将value赋值给函数中与key名字相同的形参(注意,这是在函数调用阶段使用**

变种人

然而,只有三种基本属性的human显然是弱爆了,这个世界还有强大的变种人的存在。为了迎合变种人的各类飘忽不定的属性,我们必须重新定义一个新的human_mutant类,以适应这种新人类的『不定』属性需求,方式如下:

class human_mutant():def __init__(self, gender = 'male', height = 170, weight = 65, **X): print 'gender: ', gender                print 'height: ', height                print 'weight: ', weight                for key,value in X.iteritems():                        print key, ': ',value

不难发现,变种人除了人类的三种属性,另外特意为其量身定做了一个未知的X元素,并用**作用在X元素上,其效果是什么呢?我们看下实例化的结果。

这里我们先实例化一个X教授,代码如下

ProfessorX = human_mutant(ability = 'mind-control', hairstyle = 'bald', height = 175)

我们给X教授新添了abilityhairstyle等新参数,并且修改了身高。这些新参数并未在函数定义时给出,显然,它被写到了X中。运行效果为

gender:  male
height:  175
weight:  65
hairstyle :  bald
ability :  mind-control

所以**在函数定义阶段的作用就是:将未出现在函数参数中的那些按关键字传递的参数及其值,收集起来『打包』成一个字典。比如我们在初始化X教授时,用关键字传递的方式传了abilityhairstyle,然而它们没有出现在函数定义的参数中,这时**的作用就是收集它们,变成字典{'ability': 'mind-control', 'hairstyle': 'bald'},赋值给参数X

OK,讲得差不多了,我们再娱乐一下,实例化一个我很喜欢的万磁王

Magneto = human_mutant(ability = 'metal-control', guard = 'helmet', height = 180, lover = 'ProfessorX')

我们给他加了新护具——头盔,以及超能力——控制金属,还有他的好基友——X教授。

总结

至此,在Python中给函数传递不定『个数』和不定『关键字』的方法我们都搞定了,稍作总结:

  1. 函数定义时,
    *可以将按位置传递进来的参数『打包』成元组(tuple)类型
    **可以将按关键字传递进来的参数『打包』成字典(dictionary)类型

  2. 函数调用时,
    *可以『解压』待传递到函数中的 元组、列表、集合、字符串等类型(关于字符串的解压,我在文中没有提及,有兴趣的读者可以自行尝试),并按位置传递到函数入口参数中
    **可以『解压』待传递到函数中的字典,并按关键字传递到函数入口参数中

转载于:https://www.cnblogs.com/xiaoxiao-niao/p/8215233.html

给函数传递不定关键字的参数 和相关推荐

  1. python函数关键字参数传递_Python给函数传递不定关键字的参数

    转载请注明来自公众号『数据挖掘机养成记』 前言 在上一篇文章『[Python]给函数传递不定个数的参数』中,我们主要讲解了*在函数定义和函数调用阶段的不同作用,并留了一个小问题: 我们用*定义了add ...

  2. C语言 函数传递多个字符串参数

    1. 通过全局变量传递   我们需要定义一个.或多个全局变量 getStr1.getStr2.-,用来接收来自函数中的字符串. char getStr1[100]; char getStr2[100] ...

  3. python 函数传递参数的多种方法

    python中函数根据是否有返回值可以分为四种:无参数无返回值,无参数有返回值,有参数无返回值,有参数有返回值. Python中函数传递参数的形式主要有以下五种,分别为位置传递,关键字传递,默认值传递 ...

  4. iOS实现传递不定长的多个参数

    我们在使用苹果官方的文档的时候会发现可传不定数的参数例如: // [[UIAlertView alloc]initWithTitle:<#(nullable NSString *)#> m ...

  5. c python 传参数 数组_python函数传递数组参数吗

    函数是任何一门编程语言都不可缺少的,而且也是非常重要的一部分.Python中函数的参数,可以分为以下几类: 位置参数,有时也称必备参数,指的是必须按照正确的顺序将实际参数传到函数中,换句话说,调用函数 ...

  6. python 不定参数_人生苦短,我学不会Python。——函数中不定长参数的写法

    定义函数 我们可以定义一个实现自己想要的功能的函数.Python定义函数以def开头,定义函数基本格式如下: def 函数名 (参数列表):"函数_文档字符串"函数体 return ...

  7. arg是什么函数_不定参数函数实现var_arg系列的宏

    电驴的源码日志模块有一个叫 DebugLogError 函数,其签名如下: //代码位于easyMule-master/src/WorkLayer/Log.h 55行void DebugLogErro ...

  8. Python函数 — 位置参数和关键字参数

    1.参数分类 Python函数的参数可以分为默认参数,位置参数,关键字参数,可变参数.函数可以没有参数,也可以有多个参数. 形参:定义函数时的参数,如定义函数def func(a,b)的参数a,b是形 ...

  9. python之函数传递,形式参数和实际参数

    python之函数传递,形式参数和实际参数. 1.函数的参数传递. 函数的参数传递有两种形式 第一种是值传递,经常见于int.str.float.bool型数据.指的是将实际参数的值复制给形式参数一份 ...

最新文章

  1. PyCharm_10个加速省时间技巧
  2. csv文件示例_如何在R中使用数据框和CSV文件-带有示例的详细介绍
  3. 200多位专家热议“智慧城市” 建议尽快完善标准体系
  4. 基于vue的移动web app页面缓存解决方案
  5. sql日期相关函数的使用方法
  6. 云计算产值将超3000亿美元 亚马逊微软谷歌居三甲
  7. HTTPS 跟 HTTP区别简述
  8. 基于HTML5的Web SCADA工控移动应用
  9. java+jquery实现长轮询案例_网页实时聊天之js和jQuery实现ajax长轮询
  10. OpenCV-Python实战(16)——人脸追踪详解
  11. [HDU5739]Fantasia(圆方树DP)
  12. CFileDialog多选文件的最大数量
  13. Java项目:员工出差请假考勤管理系统(java+JSP+LayUI+HTML+servlet+Mysql)
  14. 汉王考勤机管理系统服务器,汉王考勤管理系统7
  15. 景格虚拟教具混合动力汽车动力系统虚拟结构原理展示台复制狗
  16. pcm5102a解码芯片音质评测_音乐更重要,iQOO Pro配备独立解码芯片,Hi-Fi音质更懂你...
  17. 南京大学生租房补贴申领必看
  18. win7 添加XP共享打印机
  19. 用Python玩转二维码
  20. WinRAR 破解方法详解.-----------超级简单 1分钟搞定~

热门文章

  1. 理财产品收益可以保证吗?
  2. 2000年一元钱牡丹图案现在值钱吗?
  3. 闺女在大连上大学,一个月1500生活费她说少
  4. 网抑云了是什么意思,网抑云语录有哪些,网抑云网抑云梗表情包
  5. 关于创业,潮汕人、温州人做生意的多
  6. 作为一个销售人员,要做到这些
  7. 接待顾客接待久了,发现大家讨价还价的方式基本三种
  8. 为什么有的安卓手机越用越慢,刷机也不行?
  9. 配置文件中符号报错,无法识别
  10. TimePickerView(日期选择器)