Python函数参数总结




Python函数参数总结

作为一个没有系统学习过python,却要与之日日相对看源码的人,真尼玛痛苦啊。。。经常看到**kws之类的,心中狂虐:这啥?指针的指针?!T^T

昨天看《Python核心编程》的时候,刚好看到了函数部分,于是顺势将目前接触到的集中参数类型都总结一下吧^^

总的来说,除去普通的normal args,python中比较特别的函数参数有:关键字参数、默认参数、非关键字可变长参数(元组)、关键字可变长参数(字典),下面将结合例子进行介绍。

关键字参数:调用时指定参数的名称,且与函数声明时的参数名称一致。使用关键字参数允许函数调用时参数的顺序与声明时不一致,仅根据参数的指定进行赋值。例:

# 函数定义
def foo(x, y):
    print 'x is %s' % x
    print 'y is %s' % y

if __name__ == '__main__':
    # 标准调用
    foo(1, 2)

    # 关键字调用
    foo(y = 1, x = 2)

在标准调用中,x和y依次为1和2;在关键字调用中,x和y的值根据名字指定而与顺序无关。

# 标准调用输出
x is 1
y is 2

# 关键字调用输出
x is 2
y is 1


默认参数:在函数声明时,指定形参的默认值,调用时可不传入改参数(使用默认值)。例:

def tax(cost, rate = 0.17):
    print cost * (1 + rate)
    
if __name__ == '__main__':
    # rate使用默认值0.17
    tax(1000)
    
    # rate指定为0.05
    tax(1000, 0.05)

使用默认值时,rate为0.17,结果为1170;在指定参数rate时,rate为0.05,结果为1050。

# tax(1000)的输出
1170.0

# tax(1000, 0.05)的输出
1050.0


非关键字可变长参数(元组):“非关键字”“可变长”顾名思义是允许在调用时传入多个“非关键字”参数,python会将这些多出来的参数放入一个元组中。例:

# 定义函数,其中*theRest为非关键字可变长参数
def tupleVarArgs(arg1, arg2='defaultB', *theRest):
    print 'formal arg 1: ', arg1
    print 'formal arg 2: ', arg2
    for eachXtrArg in theRest:
        print 'another arg: ', eachXtrArg


我们采用多种调用方式来查看结果,从而理解非关键字可变长参数的使用:

>>> tupleVarArgs('abc')
formal arg 1:  abc
formal arg 2:  defaultB

>>> tupleVarArgs('abc', 'def')
formal arg 1:  abc
formal arg 2:  def

>>> tupleVarArgs('abc', 'def', 'xyz', 123.4)
formal arg 1:  abc
formal arg 2:  def
another arg:  xyz
another arg:  123.4

关键字可变长参数(字典):“关键字”“可变长”顾名思义是允许在调用时传入多个“关键字”参数,python会将这些多出来的<参数名, 参数值>放入一个字典中。需要注意的是,关键字变量参数应该为函数定义的最后一个参数,带**。例:

# 定义函数,其中**theRest为关键字可变长参数
def dictVarArgs(arg1, arg2='defaultB', **theRest):
    print 'formal arg 1: ', arg1
    print 'formal arg 2: ', arg2
    for eachXtrArg in theRest.keys():
        print 'Xtra arg %s: %s' % (eachXtrArg, str(theRest[eachXtrArg]))


我们采用多种调用方式来查看结果,从而理解关键字可变长参数的使用:

>>> dictVarArgs('abc')
formal arg 1:  abc
formal arg 2:  defaultB

>>> dictVarArgs('abc', 'def')
formal arg 1:  abc
formal arg 2:  def

# a=1和b='aha'即为关键字可变参数,他们会被放入theRest字典
>>> dictVarArgs('abc', 'def', a=1, b='aha')
formal arg 1:  abc
formal arg 2:  def
Xtra arg a: 1
Xtra arg b: aha

# 全部采用关键字参数,但只有a和b是可变的,会被放入theRest
>>> dictVarArgs(arg2='def', a=1, b='aha', arg1='put at the last')
formal arg 1:  put at the last
formal arg 2:  def
Xtra arg a: 1
Xtra arg b: aha

# 这次使用了arg2的默认值
>>> dictVarArgs('one', a=1, b='aha', name=('yuki', 'lau'))
formal arg 1:  one
formal arg 2:  defaultB
Xtra arg a: 1
Xtra arg b: aha
Xtra arg name: ('yuki', 'lau')

注意

当非关键字可变长参数和关键字可变长参数出现在同一个函数中时,他们应当遵守如下的顺序约定:

def newfoo(normal_arg1, normal_arg2, *non-keywords, ** keywords):
    pass

当然,你也可以直接向函数中传入元组和字典对象,如:

>>> newfoo(2, 4, *(6, 8), **{'foo': 10, 'bar': 12})

也可以来个“混搭”,孤立的可变长参数将会被放入对应的tuple或dict中,如:

>>> newfoo(2, 4, 3, x=4, y=5, *aTuple, **aDict)

在这个例子中,参数3会被放入aTuple,参数x=4和y=5会被放入aDict

 

当然关于Python函数的参数问题还有很多,本文仅仅介绍几种常用的情况,仅做个简单的了解和参考。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python中,函数之间可以通过位置传参和关键字传参来传递参数。位置传参是指按照参数的位置顺序传递参数值,而关键字传参是指通过参数名来传递参数值。 在位置传参中,可以使用*来解包元组参数。这意味着将元组的每个元素分别传递给函数的位置参数。例如,在调用函数时使用*args,可以将args拆分为独立的三个元素,分别传递给函数的a、b、c参数。如果在调用函数时没有使用*,则args将作为一个整体传递给函数,可能导致参数传递错误。 在关键字传参中,可以使用**来解包字典参数。这意味着将字典的键值对作为关键字参数传递给函数。例如,在调用函数时使用**kwargs,可以将kwargs解包为多个关键字参数传递给函数。 此外,还可以使用缺省参数来指定函数的默认参数值。这样,在调用函数时如果没有传递对应的参数值,将使用默认值。 总结起来,Python函数之间可以通过位置传参、关键字传参、解包元组参数和解包字典参数来传递参数。这些方法可以根据具体的需求和函数定义来选择使用。 #### 引用[.reference_title] - *1* *3* [python 函数传递参数的多种方法](https://blog.csdn.net/dingmizhan4619/article/details/101732903)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [python中函数的五种参数传递的方式](https://blog.csdn.net/qq_63786218/article/details/126690008)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值