Python中函数的参数-arguments

归纳起来,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还需要确保,每一个参数,只匹配了一个值,否则,就会报错。

原文地址:https://www.cnblogs.com/chaoguo1234/p/9219214.html

时间: 2024-10-08 14:59:00

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

python 中函数的参数

一.python中的函数参数形式 python中函数一般有四种表现形式: 1.def function(arg1, arg2, arg3...) 这种是python中最常见的一中函数参数定义形式,函数参数之间用逗号分隔,调用的时候的参数必须与定义的时候相同,且参数顺序与形参一一对应. ? 1 2 3 4 5 6 7 8 9 def myfunction(a, b):     print a,b #正确调用 myfunction(3,7) #错误调用 myfunction(3) myfunctio

Python中函数的参数定义和可变参数

转自:http://www.cnblogs.com/tqsummer/archive/2011/01/25/1944416.html  简洁易懂啊,好文 刚学用Python的时候,特别是看一些库的源码时,经常会看到func(*args, **kwargs)这样的函数定义,这个*和**让人有点费解.其实只要把函数参数定义搞清楚了,就不难理解了. 先说说函数定义,我们都知道,下面的代码定义了一个函数funcA def funcA():  pass    显然,函数funcA没有参数(同时啥也不干:D

Python中函数的参数传递与可变长参数

1.Python中也有像C++一样的默认缺省函数 1 def foo(text,num=0): 2 print text,num 3 4 foo("asd") #asd 0 5 foo("def",100) #def 100 定义有默认参数的函数时,这些默认值参数位置必须都在非默认值参数后面. 调用时提供默认值参数值时,使用提供的值,否则使用默认值. 2.Python可以根据参数名传参数 1 def foo(ip,port): 2 print "%s:%d

python中函数参数的引用方式

值传递和引用传递时C++中的概念,在python中函数参数的传递是变量指向的对象的物理内存地址!!! python不允许程序员选择采用传值还是传引用.Python参数传递采用的肯定是"传对象引用"的方式.这种方式相当于传值和传引用的一种综合.如果函数收到的是一个可变对象(比如字典或者列表)的引用,就能修改对象的原始值--相当于通过"传引用"来传递对象.如果函数收到的是一个不可变对象(比如数字.字符或者元组)的引用,就不能直接修改原始对象--相当于通过"传值

python中函数的使用方法

本文主要介绍:python中函数的使用方法 代码: #!/usr/bin/env python# -*- coding:utf-8 -*-# author by lh #函数里默认形参如果有初始值的话,调用的时候如果不写实参,则默认是形参里的初始值(ps:如果有多个形参,有默认值的参数一定要放到后面)def f1(a='rt'): temp='Welcome '+a return tempret=f1('lh')print retret1=f1()print ret1 #实参可以是任意类型的参数

python把函数作为参数

python把函数作为参数 在2.1小节中,我们讲了高阶函数的概念,并编写了一个简单的高阶函数: def add(x,y,f): return f(x)+f(y)print add(-5,9,abs) >>> 14 根据函数的定义,函数执行的代码实际上是: abs(-5) + abs(9) 由于参数 x, y 和 f 都可以任意传入,如果 f 传入其他函数,就可以得到不同的返回值. 任务 利用add(x,y,f)函数,计算: 计算平方根可以用函数: >>> math.s

Python中函数的初览

Python中函数的初览 一.函数 1.什么是函数 为了完成某一功能的代码的集合,叫做函数,函数就是行为,就是动作 2.定义 Python中函数的定义,使用关键字def(define function 定义函数) 3.函数的调用 函数定义后,不会自动执行,需要调用者调用才会执行. 4.函数的分类 1)有无参数 2)有无返回值 例:这是一个有参数且有返回值的函数 原文地址:https://www.cnblogs.com/Mr-Liu---/p/11553210.html

如何理解javaSript中函数的参数是按值传递

本文是我基于红宝书<Javascript高级程序设计>中的第四章,4.1.3传递参数小节P70,进一步理解javaSript中函数的参数,当传递的参数是对象时的传递方式. (结合资料的个人理解,有不正确的地方,希望大家指出,谢谢啦!) 参考的资料有: https://github.com/simongong/js-stackoverflow-highest-votes/blob/master/questions21-30/parameter-passed-by-value-or-referen

python中的可变参数

def foo(*args, **kwargs): print 'args = ', args print 'kwargs = ', kwargs print '---------------------------------------' if __name__ == '__main__': foo(1,2,3,4) foo(a=1,b=2,c=3) foo(1,2,3,4, a=1,b=2,c=3) foo('a', 1, None, a=1, b='2', c=3) 输出结果如下:arg