归纳起来,Python中函数的定义形式和调用形式主要有如下几种形式:

# 函数的定义形式
def func(name) # 匹配positional参数或者keyword参数
def func(name=value) # 如果不传,有默认参数
def func(*name) # 将额外的positional参数转换成一个tuple,然后赋给name
def func(**name) # 将额外的keyword参数转换成一个dictionary,然后赋给name
def func(*other, name) # Python 3.X中定义keyword-only参数的形式,Python 2.X中不支持,此时,name一定要以keyword的形式传递
def func(*, name) # Python 3.X中定义keyword-only参数的形式, Python 2.X中不支持,此时, name一定要以keyword的形式传递 # 函数的调用
func(name) # 以positional参数调用
func(name=value) # 以keyword参数调用
func(*iterable) # 将iterable对象转换成一连串单个positional参数进行调用
func(**dictionary) # 将dictionary转换成keywrod参数进行调用

这里需要注意3点:

1 在Python 2.X中(在Python 3.X中,这种形式已经不允许了),还有一种定义函数的方式,就是将函数的参数定义成一个tuple,那么,当调用函数的时候,传递一个结构一样的tuple参数,这个tuple参数就会被unpack:

# 定义
def func((a, (b, c)) # 调用
func((1, (2, 3)) # a=1, b=2, c=3
func((1, [2, 3])) # a=1, b=2, c=3,这样调用也是可以的
func((1, 'mn')) # a=1, b='m', c='n', 这样也可以,也就是说调用的时候只要是序列都可以 # 但是定义的时候只能是tuple,不能出现其他序列,比如数组,下面的情形是不对的
def func((a, [b, c]))

2 对于调用形式func(*name)和func(**name),也可以使用apply函数达到同样的效果,但是apply函数只能在Python 2.X中使用,在Python 3.X中被移除了,使用形式为:

def func(*a, **b)

a=(1, 2)
b={'c':3, 'd':4} func(*a, **b) # Python 2.X和Python 3.X均支持 apply(func, a, b) # 仅Python 2.X支持,效果一样

3 对于默认参数,尤其要注意可变对象,每一次以默认形式象调用函数,这个默认的参数会被重用,而不会重置:

def func(a=[]):
a += [1]
print(a) >>>func()
[1] >>>func() # 此时a的值是[1]
[1, 1] >>>func() # 此时a的值是[1, 1]
[1, 1, 1]

函数定义时参数的顺序以及函数调用时参数的顺序

Python中,定义函数和调用函数时,参数的顺序有一定的规则,如果不符合规则,Python会报错:

1 在定义函数时,参数的顺序为:positional参数(name),默认参数(name=value),*name形式(或者只有一个*,但是只在Python 3.X中支持),name或者name=value形式(都只在Python 3.X中支持,叫keyword-only参数,后面name=value是赋默认值),**name形式;

2 在调用函数时,参数的顺序为:positional参数(name),keyword参数(name=value)或者*name形式,**name形式

总之,**name无论在定义函数时,还是在调用函数时,都只应出现在最后。

函数参数的匹配步骤

Python内部,对于函数参数的匹配大致分为5步:

1 首先匹配positional参数(name)

2 匹配keywrod参数(name=value)

3 将额外的非keyword参数匹配给*name形式

4 将额外的keyword参数匹配给**name形式

5 如果有默认值,给未传递的参数赋默认值

经过上述步骤之后,Python还需要确保,每一个参数,只匹配了一个值,否则,就会报错。

Python中函数的参数-arguments的更多相关文章

  1. 深入理解python中函数传递参数是值传递还是引用传递

    深入理解python中函数传递参数是值传递还是引用传递 目前网络上大部分博客的结论都是这样的: Python不允许程序员选择采用传值还是传 引用.Python参数传递采用的肯定是"传对象引用 ...

  2. Python中函数传递参数有四种形式

    Python中函数传递参数有四种形式 fun1(a,b,c) fun2(a=1,b=2,c=3) fun3(*args) fun4(**kargs) 四种中最常见是前两种,基本上一般点的教程都会涉及, ...

  3. 讲讲python中函数的参数

    python中函数的参数 形参:定义函数时代表函数的形式参数 实参:调用函数时传入的实际参数 列如: def f(x,y): # x,y形参 print(x, y) f(1, 2) # 1, 2 实参 ...

  4. python 中函数的参数

    一.python中的函数参数形式 python中函数一般有四种表现形式: 1.def function(arg1, arg2, arg3...) 这种是python中最常见的一中函数参数定义形式,函数 ...

  5. python中函数的参数解析

    python中函数的各种参数梳理: 1.形参:函数定义时传入的参数 2.实参:函数调用时传入的参数 (有形参必传实参,形参里自身特点可不传的,可传可不传) 3.缺省参数:不传为默认值,传了会覆盖(下面 ...

  6. python中函数的参数

    函数参数(一) 思考一个问题,如下: 现在需要定义一个函数,这个函数能够完成2个数的加法运算,并且把结果打印出来,该怎样设计?下面的代码可以吗?有什么缺陷吗? def add2num(): a = 1 ...

  7. python中函数的参数和返回值

    目录 函数 目标 01. 函数参数和返回值的作用 1.1 无参数,无返回值 1.2 无参数,有返回值 1.3 有参数,无返回值 1.4 有参数,有返回值 02. 函数的返回值 进阶 示例 -- 温度和 ...

  8. Python中函数的参数带星号是什么意思?

    参数带星号表示支持可变不定数量的参数,这种方法叫参数收集. 星号又可以带1个或2个,带1个表示按位置来收集参数,带2个星号表示按关键字来收集参数. 1.带一个星号的参数收集模式: 这种模式是在函数定义 ...

  9. python中函数的参数:必传参数(位置参数)、默认值参数、参数组传参、关键字传参

    1.必传参数也叫做位置参数,因为必填,也必须对应位置 2.默认值参数如上图的word 3.参数组参数:传进去的是0个.或多个value的形式,,,和位置参数有点像,只传value值,但是没有限制个数 ...

随机推荐

  1. 百度地图定位JSP代码

    附:百度地图API:http://lbsyun.baidu.com/cms/jsapi/reference/jsapi_reference.html#a1b0?qq-pf-to=pcqq.c2c &l ...

  2. HTML5文本

    1.重要文本.斜体文本 粗体:<strong></strong> 粗体:<b></b> 斜体:<em></em> 斜体:< ...

  3. HDU 5212 莫比乌斯反演

    Code Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submis ...

  4. vim 版本更新

    sudo add-apt-repository ppa:jonathonf/vim sudo apt update sudo apt install vim 如果您想要卸载它, 请使用如下命令 sud ...

  5. shell基础笔记

    什么是shell脚本 我自己对shell脚本的理解就是一系列的shell命令加入逻辑关系,实现类似"批处理"的功能.而不是简单的命令的堆砌,那样的shell脚本bug重重. 脚本开 ...

  6. 使用cgroups来控制磁盘IO带宽

    磨砺技术珠矶,践行数据之道,追求卓越价值 回到上一级页面:PostgreSQL内部结构与源代码研究索引页    回到顶级页面:PostgreSQL索引页 [作者 高健@博客园  luckyjackga ...

  7. Mybatis之XML、注解

    前言 上篇简单介绍了Mybatis的简单实用,本篇先对上次实验环境的一些内容进行优化,然后验证Mybatis的XML配置以及注解方式. 实验环境优化 数据库配置 在mybatis的配置文件中,引入数据 ...

  8. day 6 老王开枪打人

    1.图示 2 程序 1)版本1:框架的搭建 def main(): '''用来控制这个程序的流程''' pass #1.创建alex对象 #2.创建1个枪对象 #3.创建1个弹夹对象 #4.创建子弹对 ...

  9. andriod学习一

    1.Android软件栈       2.Android模拟器        Android SDK 可以通过ADT+Eclipse或者命令行开发,调试,测试应用程序,设备可以使用模拟器或者真实设备, ...

  10. create-react-app react-redux项目 配置模块热更新hmr

    HRM并不是create-react-app专属的,提供一篇博客介绍hrm http://chrisshepherd.me/posts/adding-hot-module-reloading-to-c ...