可变参数:* 和 ** 区别

代码示例

先说一个*号

def function(x,*y):
    sum = 0 #接收的变量要先定义一个初始值
    for h in y:
       sum = sum + h
    sum = sum + x
    print sum
    return sum

num1 = {1:8,2:9.0,30:3}
num2 = (5,)
num3 = [6]
num4 = [1,3.0,6]
num5 = [] #num =None ,用None Type是不允许的
function(10,*num1)
function(10,*num2)
function(10.58,*num3)
function(10,)
function(10,*num4)
function(10,*num5)
# error ,y=2不可以直接传给*y#
function(x=1,y=2) 

代码说明了几个问题

  • 函数原型中的 *y 参数,可以接收的范围包括: list, tuple, dict, 数据类型(int 或 float都行), 这些序列都可以为空,但是不能传入None类型 , dict 只会在key值为数据类型时,把key值相加
  • 如果去打印,可以看到 *y接收近来的数据会自动转换成一个元组类型 tuple,也就是说在for h in y时,是从y这个元组里取数据,输出结果
  • 可变参数 *y 是可以包含空序列的()
  • 不能直接将序列传入,也就是说,类似于 function(10, (1,2,3)) 或 function(10,[1,2,3]) 是不允许的, 但是可以调用 function(10)或function(10,)来表示空。结果如图:
可变参数:* 和 ** 区别_第1张图片
示意图

** 两个型号表示“关键字传递”,毫无疑问是针对字典dict

def person(name, age, **kw):
    print 'name:', name, 'age:', age, 'other:', kw

person('Mike',28)
person('Mike',28,key="value")
person('Mike',28,key="value",A=7)
  • 如图上面 *y 一样,**也可以传递空的字典
  • **kw支持多个Key:value输入,中间用逗号隔开。
    因为dict是无序序列,因此输出时候不会按照你输入的key排列,下列输出效果所示(和输入相反)
日志打印

你可能感兴趣的:(可变参数:* 和 ** 区别)