更多课程 选择中心


Python培训

400-996-5531

Python 函数的参数传递

  • 发布:wangs0622
  • 来源:PythonAndMachineLearning
  • 时间:2017-12-04 13:15

编写函数当然是为了调用它,正常情况下在调用函数的时候,都会传入参数。而传入参数的个数少则一两个,多则不限。

值传递与指针传递

在 Python 中,函数调用时有时候会改变调用参数的值,有时候并不会改变调用参数的值,其中的规律如下:

不可改变的参数通过“值传递”

例如:整数,字符串,元组等是通过值复制的形式传递到函数中。在函数内部对参数的改变不会影响外部的值。

通过“指针”传递

例如:列表,字典。其在函数内的改变会影响函数外的值。

如果想要传入的是列表参数,但是却不想在函数内的修改影响到函数外面的值,这种情况下可以创建以明确的拷贝参数:

参数匹配模式

经常能看到如下的函数定义:

第一次看到这种函数参数的定义我是懵逼的,心里在想,这是嘛啊? 怎么感觉像是 Java 呢?

以 * 为开始的函数参数,成为可变的参数,有封装和解包两种含义,分别对应函数的定义与调用两种情况。

首先说说函数定义的情况:

def func(name) 常规的参数,通过位置进行匹配

def func(name=value) 以变量名进行参数匹配的默认参数

def func(*name) 将额外不匹配的参数收集到元组中

def func(**name) 将额外不匹配的关键词参数收集到字典中

如果在函数定义的时候,使用了 *可变参数列表的形式,则在函数调用的时候,我可以传入任意多的参数,额外的参数将会被收集到一个特定的数据结构中。默认参数与关键字参数就不说了,主要说说任意参数的问题,即带有 * 的参数:


可以看出来, *args 参数会将函数调用时赋予的多余参数收集到一个元组中。并将这个元组命名为 args。 **kwargs 参数是将多余的参数收集到字典中,但它只对多余的关键字参数有效。

当函数定义的时候,可以出现多种参数形式的混合定义,例如:

其出现的顺序应该是: 常规参数(name),默认参数(name=value), *name 形式参数, **name 形式参数。

函数调用的情况:解包参数

在函数调用的时候使用 */** 语法用来对调用时的函数参数进行解包:


在函数调用时, *用来进行元组的解包,将元组的参数按顺序排列赋予函数参数。 ** 会以键值的形式解包字典,将得到的参数,按照键值赋予函数参数。

综上所述: 在函数定义的时候,使用 *、** 是为了收集参数。在函数调用的时候,使用 *、** 是为了解包参数。

Key-word Only 参数

注意: 此参数只在 3.0 以后的版本适用

Key-word Only 参数在函数定义参数列表中位于 *args之后,这些参数只接受关键字参数。

(下面给出的例子是在 Python 3.6 环境中运行。之前的例子是在 Python 2.7 运行)


也可以在函数列表中只使用 * 来标识这个函数不接受变长度的参数:


在这种情况下,这个函数只接受三个参数,a 是普通的参数, b,c 是关键字参数。

在函数定义时注意两点:

需要使用 **kwargs 时, 它必须出现在函数参数列表的最后。这样的话,定义时,函数参数列表的排序变为:常规参数(name),默认参数(name=value), *name 形式参数,Key-word Only 参数, **name 形式参数。

** 不能独自的出现在函数定义参数列表中。 * 可以独自出现。

对于包含 Key-word Only 参数 的函数调用问题:

当传递 Key-word Only 参数 的时候,其应该出现在 **kwargs 前,后者 Key-word Only 参数 可以由 **kwargs 解包出来。

Key-word Only 参数 可以出现在 *args 之前或者之后。

为什么要有 Key-word Only 参数? 只能说你在使用的过程中慢慢体会~

本文内容转载自网络,本着分享与传播的原则,版权归原作者所有,如有侵权请联系我们进行删除!

预约申请免费试听课

填写下面表单即可预约申请免费试听! 怕学不会?助教全程陪读,随时解惑!担心就业?一地学习,可全国推荐就业!

上一篇:Python简介和开发环境构建教程
下一篇:Python 学习-类和模块的基础知识

2021年Python全套免费视频教程在哪里?

Python编程学习路线

Python最高有几级?

人工智能与语音遥控的区别?

Copyright © 2023 Tedu.cn All Rights Reserved 京ICP备08000853号-56 京公网安备 11010802029508号 达内时代科技集团有限公司 版权所有

选择城市和中心
黑龙江省

吉林省

河北省

湖南省

贵州省

云南省

广西省

海南省