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

转载: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

时间: 2024-08-07 00:28:53

给函数传递不定关键字的参数 和的相关文章

给函数传递不定个数的参数

转载:http://blog.csdn.net/u012102306/article/details/52250028 收藏参考 问题起源 在Python中常常看到有这样的函数,它们的入口参数的个数是不定的.比如有如下代码 In: print zip([1, 2],[3, 4]) Out: [(1, 3), (2, 4)] In: print zip([1, 2],[3, 4],[5, 6]) Out: [(1, 3, 5), (2, 4, 6)] 其中zip是Python自带的一个函数,其作用

Javascript事件函数传递的event对象参数

Event属性和方法: 1. type:事件的类型,如onlick中的click: 2. srcElement/target:事件源,就是发生事件的元素: 3. button:声明被按下的鼠标键,整数,1代表左键,2代表右键,4代表中键,如果按下多个键,酒把这些值加起来,所以3就代表左右键同时按下:(firefox中 0代表左键,1代表中间键,2代表右键) 4. clientX/clientY:事件发生的时候,鼠标相对于浏览器窗口可视文档区域的左上角的位置:(在DOM标准中,这两个属性值都不考虑

PHP函数(二)-不定参数的传递

如果要传递不定数量的参数,需要使用func_get_args()函数来传递 func_num_args()函数用来返回参数的总数 <?php function more_args(){ $args = func_get_args(); for($i=0;$i<func_num_args();$i++){ $a = $i +1; echo "第".$a."个参数是".$args[$i]."<br>"; } } more_ar

python函数 位置参数,关键字参数,可变参数优先级

def fun(arg,args=1,*arg,**keywords): python 一共有这四类参数,第一类最常见,不用多说,第二类,关键字参数,python能通过关键字找到参数,python函数的这种特性使得函数参数更加灵活,不一定要按顺序来传,第三类:一个星号是将非关键字参数收集起来,以tuple的形式保存,第四类则必须要提供”传递参数名=传递参数值”形式传递参数. 至于怎么传,相信大家都知道,这里不多说. 要说明的是在python2中这四类参数传递时是有优先顺序的,不管是定义函数,还是

C++关键字、命名空间、函数重载、缺省参数、内联函数、引用

一 .C++入门 1.C++关键字 2.命名空间 3.C++输入&输出 4.缺省参数 5.函数重载 6.引用 7.内联函数 8.auto关键字 9.基于范围的for循环 10.指针空值nullptr&nullptr_t 二. 正文 1.C++关键字(C++98) C++98中的关键字总共用63个,如下表: 在这这做简单介绍,感兴趣的朋友可以参考相关资料作进一步了解. 2.命名空间 由于在编写程序的过程中,很容易出现变量.函数和类重名的现象,这些变量.函数和类都在全局作用域中,因此会导致很多

C语言结构体及函数传递数组参数示例

注:makeSphere()函数返回Sphere结构体,main函数中,调用makeSphere()函数,传递的第一个参数为数组,传递的数组作为指针. 版权声明:本文为博主原创文章,未经博主允许不得转载.

js中函数传递参数,究竟是值传递还是引用传递?

记住真理: js函数传递参数,不管是简单数据类型,还是引用数据类型,都是值传递!! 下面是js红包书里面的例子: function setName(obj) { obj.name = "Nicholas"; obj = new Object(); obj.name = "Greg"; } var person = new Object(); setName(person); alert(person.name); // "Nicholas" 肯定

Delphi过程、函数传递参数的八种方式

Delphi过程函数传递参数的八种方式 Delphi过程.函数传递参数的八种方式,布布扣,bubuko.com

给wxPython事件处理函数传递参数

给wxPython事件处理函数传递参数 2014-04-30 07:47:08segmentfault-博客--点击数:39 最近捣鼓Python,也就自然捣鼓上了wxPython.我曾经用过Qt和Gtk+写GUI,但几乎所有的Python书都告诉我说最好用的是wxPython,我没有尝试PyQt和PyGtk就开始研究wxPython了.在Qt和Gtk+之间我更喜欢Qt,因为它跨平台做得很好,而且商业化也不错.但wxWidget给人的感觉就完全不同了. 如果说wxWidgets相对于Qt有什么优