python函数参数里的*和**号,形参与实参

过量的参数— 为什么需要在参数前加*号?

在运行时知道一个函数有什么参数,通常是不可能的。另一个情况是一个函数能操作很多对象。更有甚者,调用自身的函数变成一种api提供给可用的应用。
参数归为4类,不是所有的类别都需要。他们必须按下面的次序定义,不用的可以跳过
1)必须的参数
2)可选的参数
3)过量的元组参数
4)过量的关键字参数
这个次序是必须的,因为*args和**kwargs只接受那些没有放进来的其他任何参数。没有这个次序,当你调用一个带有位置参数的函数,python就不知道哪个值是已声明参数想要的,也不知道哪个被作为过量参数对待。

对于参数过量的情况,python提供了两种特别的方法来定义函数的参数,允许函数接受过量的参数,不用显式声明参数。这就是通常看到的

def fun(para1,para2=defaultvalue,*args,**kwargs)

注意args和kwargs只是python的约定。任何函数参数,你可以自己喜欢的方式命名,但是最好和python标准的惯用法一致,以便你的代码,其他的程序员也能轻松读懂。

申明函数时,加上*表示元组,**号表示字典

列表参数

在参数名之前使用一个星号,就是让函数接受任意多的列表参数。

> def multiply(*args):
...     total = 1
...     for arg in args:
...         total *= arg
...     return total
...
> multiply(2, 3)
6
> multiply(2, 3, 4, 5, 6)
720

python把参数收集到一个元组中,作为变量args。显式声明的参数之外如果没有其它多余的参数,args就作为一个空元组。

关键字参数

python在参数名之前使用2个星号来支持任意多的关键字参数。

def accept(**kwargs):
… for keyword, value in kwargs.items():
… print “%s => %r” % (keyword, value)

accept(foo=‘bar’, spam=‘eggs’)
foo => ‘bar’
spam => ‘eggs’

注意:kwargs是一个正常的python字典类型,包含参数名和值。如果没有更多的关键字参数,kwargs就是一个空字典。

实际参数传入时,在tuple变量前加*, 在dict前加**,将其解开

先看一个例子:

function_with_one_star(*d):
    print(d, type(d))

def function_with_two_stars(**d):
    print(d, type(d))

# 上面定义了两个函数,分别用了带一个星号和两个星号的参数,它们是什么意思,运行下面的代码:

function_with_one_star(1, 2, 3)  #传入的是解开的tuple
function_with_two_stars(a = 1, b = 2, c = 3) #传入的是解开的dict

# 结果如下,说明函数会自动将过量的参数组装成tuple或dict
(1, 2, 3) <</span>class 'tuple'>	#只有值,没有keyword,则组装成tuple
{'a': 1, 'c': 3, 'b': 2} <</span>class 'dict'>  #有keyword,则组装成dict

注意,
(1)在给函数传递tuple或dict参数时,如果直接把tuple或dict传进去,则会被当成一个参数,而不是多个参数。

def accept(*s):
    print(sum(s))
list = (0, 1, 2, 3, 7.5)
accept(list)

这段代码会报错:TypeError: unsupported operand type(s) for +=: ‘int’ and ‘tuple’,在函数中产生了int与tuple相加的情况
(2)所以,如果已经把多个参数定义成了一个tuple或dict,那么在作为实参传递时,在在tuple前要加上*将其解开,在dict前加上**将其解开

def accept(*s):
    print(sum(s))
list = (0, 1, 2, 3, 7.5)
accept(*list)

输出结果:13.5 ,这样就正常了。

==================================== ===========================================

python中变量前的单星号和双星号

单星号 *

单星号 * 用于对列表LIST或元组tuple中的元素进行取出(unpacke)。例如,np.arange函数需要独立的开始和停止参数:

import numpy as np
LIST = [3, 6]
print(np.arange(*LIST))
输出:
[3, 4, 5]

双星号 **

双星号 ** 可将字典里的“值”取出

def parrot(voltage, state=‘a stiff’, action=‘voom’):print-- This parrot wouldn’t”, action,printif you put”, voltage, “volts through it.,print “E’s”, state, “!”

d = {“voltage”: “four million”, “state”: “bleedin’ demised”, “action”: “VOOM”}
parrot(**d)


输出:
– This parrot wouldn’t VOOM if you put four million volts through it. E’s bleedin’ demised !
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值