转载请注明来自公众号『数据挖掘机养成记』

前言

在上一篇文章『[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在函数中被赋予a1,2被赋予a2,这种赋值方式是按照1, 2和 a1, a2在位置上的一一对应关系来赋值的,所以被称作按位置传递。其实我们还可以有另外的调用方式:add_2_int(a2=2, a1=1),显示地告诉函数,我要给a2赋值为2,a1赋值为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

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

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教授新添了ability、hairstyle等新参数,并且修改了身高。这些新参数并未在函数定义时给出,显然,它被写到了X中。运行效果为

gender:  male

height:  175

weight:  65

hairstyle :  bald

ability :  mind-control

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

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

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

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

总结

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

函数定义时,

*可以将按位置传递进来的参数『打包』成元组(tuple)类型

**可以将按关键字传递进来的参数『打包』成字典(dictionary)类型

函数调用时,

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

**可以『解压』待传递到函数中的字典,并按关键字传递到函数入口参数中

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

  1. python函数可选参数传递_Python中函数的参数传递

    1.普通的参数传递 >>> def add(a,b): return a+b >>> print add(1,2) 3 >>> print add ...

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

    转载:http://blog.csdn.net/u012102306/article/details/52250050 收藏一下 在上一篇文章『[Python]给函数传递不定个数的参数』中,我们主要讲 ...

  3. 函数指针(函数作为参数传递给其他函数)

    函数也有地址,函数的地址是存储其机器码的内存的开始的地址,并且函数的地址就是其函数名.因此我们可以将函数作为参数传递给其他函数.正如python中可以将函数轻易的传递给其他函数一样,但是C++中形式上 ...

  4. 20 Python函数、定义一个函数、参数传递、匿名函数、return语句、变量作用域、

    20Python函数 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但你 ...

  5. python函数调用时等价_python 之 函数

    s = 'hello' # print(len(s)) # len() 内置函数:python提前给你的写好了的函数 你直接调用即可 # # n = 0 # for i in s: # n += 1 ...

  6. python average函数怎么用_python之函数的使用

    2.1 定义函数 def函数名(参数): 代码1 代码2 ...... 2.2 调⽤函数 函数名(参数) 注意: 1. 不同的需求,参数可有可⽆. 2. 在Python中,函数必须先定义后使⽤. 2. ...

  7. python class函数报错_Python 的函数是第一类 First-Class 对象

    Python的函数是第一类对象(first-class object).你可以把一个函数复制给变量,或者把函数存储在一个结构中.可以像参数一样把函数传递进另一个函数,还可以从一个函数中返回另一个函数. ...

  8. python里apply用法_Python apply函数的用法

    Python apply函数的用法 发布于 2014-08-07 21:02:24 | 674 次阅读 | 评论: 0 | 来源: 网友投递 Python编程语言Python 是一种面向对象.解释型计 ...

  9. python使用函数的目的_python之函数基本使用

    函数的定义: 函数是一段具有特定功能的.可重用的语句组,用函数名来表示并通过函数名进行功能调用. 使用函数主要有两个目的:降低编程难度和代码重用. python定义一个函数是通过使用def保留字的方式 ...

最新文章

  1. BZOJ-1644: [Usaco2007 Oct]Obstacle Course 障碍训练课(SPFA)
  2. Redis学习(4)-数据类型set和zset
  3. Java 23 种设计模式
  4. springboot配置Filter的两种方法
  5. 就是要让你搞懂 Nginx,这篇就够了!
  6. 用户和组 win2003
  7. 使用DataTable动态绑定GridView
  8. 云计算教程学习入门视频课件:云计算架构参考模型
  9. JAVA(三)java基础知识
  10. 从华住遭遇“抄袭” 看酒店行业互联网发展现状
  11. Unix系统结构由三个层次组成,一部分是内核
  12. cadsee plus看图纸 7.2.0.1
  13. UE4影视特效学习资源整理
  14. 觅风易语言[1-10]
  15. 2021-10-25
  16. Fast and Accurate Recognition of Chinese Clinical Named Entities with Residual Dilated Convolutions
  17. 使用 ifconfig 查看本机 ip
  18. wsl2 + ubuntu安装下载和一些安装推荐
  19. 电脑键盘错乱完美解决
  20. STM32F103时钟系统讲解(精)

热门文章

  1. CSP 复赛注意事项
  2. 全新iPhone发布会确定时间了!从Loog上可以看出有新配色
  3. 传递矩阵的特征多项式
  4. Java、JSP飞机航班信息查询系统
  5. ASP.NET-AJAX笔记总结
  6. 软件研发是高科技吗?
  7. 少年得志中年入狱,李一男能再造一个“四轮的小牛”吗?
  8. 【调剂】郑州大学河南先进技术研究院2022年硕士研究生招生拟调剂信息公告
  9. /etc/shells 777权限,vsftp本地用户不能登陆
  10. Joshua Loth Liebman