注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Oracle、MySQL资料及经验

.

 
 
 

日志

 
 

Python函数的*和**传入测试  

2016-02-28 10:01:30|  分类: Python |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
Python函数的*和**传入测试

以下我们分别测试对函数f(x)传入x、*x,对函数f(*x)传入x、*x,对函数f(**x)传入x、*x、**x,然后看得到的结果,传入的x代表字符串、列表、元组、字典、集合。
>>> st='AB'
>>> st2='x'
>>> l=['a','b']
>>> t=(1,2)
>>> d={'A':1,'B':2}
>>> s=([1,2])


一、测试f(x)

>>> def f1(x): 
...      print(x)
... 

1. 传入x
>>> f1(st)
AB
>>> f1(st2)
x
>>> f1(l)
['a', 'b']
>>> f1(t)
(1, 2)
>>> f1(d)
{'A': 1, 'B': 2}
>>> f1(s)
[1, 2]
#测试结果:传入x时,原样返回,输入什么类型,就返回什么类型。


2. 传入*x
>>> f1(*st2)
x
>>> l2=['L']
>>> f1(*l2)
L
>>> d2={'x':10}
>>> f1(*d2)
x
>>> f1(*st)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: f1() takes 1 positional argument but 2 were given
>>> f1(*l)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: f1() takes 1 positional argument but 2 were given
>>> f1(*t)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: f1() takes 1 positional argument but 2 were given
>>> f1(*d)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: f1() takes 1 positional argument but 2 were given
>>> f1(*s)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: f1() takes 1 positional argument but 2 were given
#测试结果: 传入*x时,返回类型的元素值,其中字典返回的是key;但如果输入元素个数跟函数参数不一致,则报错。




二、测试f(*x)
>>> def f2(*x): 
...     print(x)

1. f(*x),传入x
>>> f2(st)
('AB',)
>>> f2(st2)
('x',)
>>> f2(l)
(['a', 'b'],)
>>> f2(t)
((1, 2),)
>>> f2(d)
({'A': 1, 'B': 2},)   #把字典内容全部返回
>>> f2(s)
([1, 2],)
#测试结果: 传入x时,把传入原封不动地作为元组的第一个元素返回。


2. f(*x),传入*x
#传入时加*,则把传入组装成一个元组返回。
>>> f2(*st)
('A', 'B')
>>> f2(*st2)
('x',)
>>> f2(*l)
('a', 'b')
>>> f2(*t)
(1, 2)
>>> f2(*d)
('A', 'B')   #字典返回的是key
>>> f2(*s)
(1, 2)

#测试结果: 传入*x时,把传入组装成一个元组返回,其中字典返回的是key。


三、测试f(**x)
>>> def f3(**x): 
...     print(x)

1. f(**x),传入x或*x
>>> f3(st)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: f3() takes 0 positional arguments but 1 was given
>>> st
'AB'
>>> f3(st2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: f3() takes 0 positional arguments but 1 was given
>>> f3(l)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: f3() takes 0 positional arguments but 1 was given
>>> f3(t)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: f3() takes 0 positional arguments but 1 was given
>>> f3(d)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: f3() takes 0 positional arguments but 1 was given
>>> f3(s)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: f3() takes 0 positional arguments but 1 was given

>>> f3(*st)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: f3() takes 0 positional arguments but 2 were given
>>> f3(*st2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: f3() takes 0 positional arguments but 1 was given
>>> f3(*l)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: f3() takes 0 positional arguments but 2 were given
>>> f3(*t)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: f3() takes 0 positional arguments but 2 were given
>>> f3(*d)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: f3() takes 0 positional arguments but 2 were given
>>> f3(*s)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: f3() takes 0 positional arguments but 2 were given
#测试结果: 传入x或*x时,全部报错。


2. f(**x),传入**x
>>> f3(**st)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: f3() argument after ** must be a mapping, not str
>>> f3(**st2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: f3() argument after ** must be a mapping, not str
>>> f3(**l)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: f3() argument after ** must be a mapping, not list
>>> f3(**t)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: f3() argument after ** must be a mapping, not tuple
>>> f3(**d)
{'A': 1, 'B': 2}
>>> d
{'A': 1, 'B': 2}
>>> f3(**s)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: f3() argument after ** must be a mapping, not list
#测试结果: 传入**x时,只有字典原样返回,其他传入都报错。



四、测试参数x=1:
1. 对于f(x)
>>> f1(x=1)
1   #这个好理解。

2. 对于f(*x)
>>> f2(x=1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: f2() got an unexpected keyword argument 'x'

3. 对于f(**x)
>>> f3(x=1)
{'x': 1}



总结:
对可变参数和关键字参数,使用*args和**kw是Python的习惯写法,当然也可以用其他参数名,但最好使用习惯用法。
f(x)、f(x,y)、f(x,y,z)等  可传入*args,args的数据类型为字符串、列表、元组、字典、集合,元素的个数与函数的个数一致时,得到的是一个元组。
f(*args) args的数据类型为字符串、列表、元组、字典、集合,得到的是一个元组。
f(**kw) kw的数据类型为字典和x=?的参数,得到的是一个字典。

对于f(x):传入x时,原样返回,输入什么数据类型,就返回什么数据类型。传入*x时,如果输入元素个数跟函数参数个数一致,则返回数据类型的元素值,其中字典返回的是key;输入元素个数跟函数参数个数不一致时,则报错。
对于f(*x):传入x时,把传入原封不动地作为元组的第一个元素返回。传入*x时,把传入的元素组装成一个元组返回,其中字典返回的是key。f2(x=1)会报错。
对于f(**x):传入x或*x时,全部报错。传入**x时,只有字典key跟函数参数名称一致时,原样返回,其他传入都报错。f3(x=1),把x=1当成字典{'x': 1}
其中标红的是正常情况下有意义的正确输入,需记住。

>>> def f(x,y):
...     print(x,y)
... 
>>> st
'AB'
>>> f(st)   #这个报错也好理解。
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: f() missing 1 required positional argument: 'y'
>>> f(*st)
A B






  评论这张
 
阅读(343)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017