python:认识*与**,判断函数输出

来源:互联网 发布:java线程生成订单号 编辑:程序博客网 时间:2024/06/06 01:27

代码:

[python] view plain copy
  1. def f1(a, b, c=0, *args, **kw):  
  2.     print('a=', a, 'b=', b, 'c=', c, 'args=', args, 'kw=', kw)  
  3. def f2(a, b, c=0, *, d, **kw):  
  4.     print('a=', a, 'b=', b, 'c=', c, 'd=', d, 'kw=', kw)  
  5. f1(1,2)  
  6. f1(1,2,c=3)  
  7. f1(1,2,3,'a','b')  
  8. f1(1,2,3,'a','b',x=99)  
  9. f2(1,2,d=99,ext=None)  
  10. args = (1,2,3,4)  
  11. kw = {'d':99'X':'#'}  
  12. f1(*args, **kw)  
  13. args = (1,2,3)  
  14. f2(*args, **kw)  
答案:

[python] view plain copy
  1. f1(1,2)  # a=1 b=2 c=0 arg=() kw={}  
  2. f1(1,2,c=3)   #a=1 b=2 c=3 arg=() kw={}  
  3. f1(1,2,3,'a','b')  #a=1 b=2 c=3 arg=('a','b') kw={}  
  4. f1(1,2,3,'a','b',x=99)  #a=1 b=2 c=3 arg=('a','b') kw={'x':99}  
  5. f2(1,2,d=99,ext=None)  #a=1 b=2 c=0 d=99 kw={'ext':None}  
  6. f1(*args, **kw)  #a=1 b=2 c=3 arg=(4,) kw= {'d':99, 'X':'#'}  
  7. f2(*args, **kw)  #a=1 b=2 c=3 d=99 kw = {''X':'#'}  

考察知识点:python 操作符**与*的用法

(1) 运算符

**两个乘号就是乘方,比如2**4,结果就是2的4次方,结果是16
一个乘号*,如果操作数是两个数字,就是这两个数字相乘,如2*4,结果为8
*如果是字符串、列表、元组与一个整数N相乘,返回一个其所有元素重复N次的同类型对象,比如"str"*3将返回字符串"strstrstr"

(2) 函数形参

如果是函数定义中参数前的*表示的是将调用时的多个参数放入元组中,**则表示将调用函数时的关键字参数放入一个字典中
如定义以下函数
def func(*args):print(args)
当用func(1,2,3)调用函数时,参数args就是元组(1,2,3)
定义以下函数
def func(**args):print(args)
当用func(a=1,b=2)调用函数时,参数args将会是字典{'a':1,'b':2}

(3) 函数调用

如果是在函数调用中,*args表示将可迭代对象扩展为函数的参数列表
args=(1,2,3)
func=(*args)
等价于函数调用func(1,2,3)
函数调用的**表示将字典扩展为关键字参数
args={'a':1,'b':2}
func(**args)
等价于函数调用 func(a=1,b=2)

补充:

函数def f2(a, b, c=0, *, d, **kw) 中隔开符*,在python2.7中报错,在3.4中可识别。

赋值给arg的元组中只有一个元素时,注意多一个逗号,如arg=(4,)