基础题(五)
22、*arg和**kwarg作用
要想理解*arg和**kwarg的作用,先别着急,通过下面的示例,慢慢思考体会下他们的作用是什么?
*arg
比如现在我有一个最简单的加法(Jiafa)函数:
def Jiafa(x, y): z = x + y return z print(Jiafa(1,2))
这个很简单,一看就知道输出等于3。
那下一个问题是,如果我要算不固定个数的数字相加,那怎么来计算呢?
这时,就使用args和*kwarg,就可以帮助我们解决这种问题。
*args:可以理解为只有一列的表格,长度不固定。
**kwargs:可以理解为字典,长度也不固定。
首先,args和kwarg不是必须成对出现,也不是必须叫这个名字,也可以叫*x和**y。写成这样,只是一种约定俗成,比如给别人讲故事:从前有个张三和李四……大家一听就知道你要说什么了,而不能说从前有个马七狗八,大家虽然也能听懂,但总是不太好理解。
先说args的作用,还是开篇的案例,我们要算不定长的加法,就可以用args来定义了,当然也可以叫x,y。
def Jiafa(*args): sum = 0 for i in args: sum = sum + i print(sum) Jiafa(1, 3, 5) Jiafa(2, 4, 6, 8, )
输出结果,9和20。这个案例很简单,用*args定义就可以引入,相当于定义了不定长度的函数,然后在程序中就可以多次使用。
**kwargs
**kwargs的字典呢?先看一下普通的字典,用一对大括号{}就可以创建字典,比如下面3行程序,就可以编一个字典的程序:
dict = {"system": "系统", "China": "中国", "link": "联接"} x = input("请输入一个英文单词:") print(dict.get(x, "本字典里没找到!"))
如果输入正确,会得到答案,否则会显示没找到。
在这个程序里,dict = {"system": "系统", "China": "中国", "link": "联接"}创建了三对“键和值”(key和value),比如“system”是key,“系统”是key对应的值,也叫键值。
还可以写一个测试单词的小软件。
dict = {"system": "系统", "China": "中国", "link": "联接"}
通过Key找value的语句:
y = input("请输入China的中文意思:") if dict['China'] == y: print("恭喜你,答对了!")
通过value找Key的语句:
z = input("请输入“系统”的英文单词:") if list(dict.keys())[list(dict.values()).index("系统")] == z: print("恭喜你,答对了!")
现在问题来了,如果开始不知道字典里都有哪些内容,需要在程序运程中才知道怎么办?这个时候就可以用kwargs来定义了。我们先用kwargs来定义一个函数,函数内容先都不用写,再看看下面的小程序:
def dict(**kwargs): return kwargs mydict = dict(system="系统", China="中国", link="联接") x = input("请输入单词:") if x in mydict.keys(): print("中文意思:", mydict[x]) else: print("抱歉,没找到。")
用字典也可以达成这样的功能,使用in……keys(),就是判断这个key是不是存在,如果存在就返回它的值。 同样,用**kwargs传递数据的功能,还可以设计一个用户登录的程序:
def dict(**kwargs): return kwargs userdict = dict(user1="1234", user2="5678") x = input("请输入用户名:") if x in userdict.keys(): y = input("请输入密码:") if userdict[x] == y: print("完全正确") else: print("密码错误!") else: print("用户不存在!")
所以从以上的示例可以看到*arg和**kwarg的作用为:
1、函数调用里的*arg和**kwarg:
(1)*arg:元组或列表“出现”
**kwarg:字典“出没”
(2)分割参数
2、函数定义时传的*arg /**kwarg:
(1)接收参数
23、is和==的区别
is和==都是对对象进行比较判断作用的,但对对象比较判断的内容并不相同。下面来看看具体区别在哪。
==比较操作符和is同一性运算符区别:
==是python标准操作符中的比较操作符,用来比较判断两个对象的value(值)是否相等,例如下面两个字符串间的比较:
例1:
>>> a = 'cheesezh' >>> b = 'cheesezh' >>> a == b True
is也被叫做同一性运算符,这个运算符比较判断的是对象间的唯一身份标识,也就是id是否相同。通过对下面几个list间的比较,你就会明白is同一性运算符的工作原理:
例2:
>>> x = y = [4,5,6] >>> z = [4,5,6] >>> x == y True >>> x == z True >>> x is y True >>> x is z False >>> >>> print id(x) 3075326572 >>> print id(y) 3075326572 >>> print id(z) 3075328140
前三个例子都是True,这什么最后一个是False呢?x、y和z的值是相同的,所以前两个是True没有问题。至于最后一个为什么是False,看看三个对象的id分别是什么就会明白了。
下面再来看一个例子,例3中同一类型下的a和b的(a==b)都是为True,而(a is b)则不然。
>>> a = 1 #a和b为数值类型 >>> b = 1 >>> a is b True >>> id(a) 14318944 >>> id(b) 14318944 >>> a = 'cheesezh' #a和b为字符串类型 >>> b = 'cheesezh' >>> a is b True >>> id(a) 42111872 >>> id(b) 42111872 >>> a = (1,2,3) #a和b为元组类型 >>> b = (1,2,3) >>> a is b False >>> id(a) 15001280 >>> id(b) 14790408 >>> a = [1,2,3] #a和b为list类型 >>> b = [1,2,3] >>> a is b False >>> id(a) 42091624 >>> id(b) 42082016 >>> a = {'cheese':1,'zh':2} #a和b为dict类型 >>> b = {'cheese':1,'zh':2} >>> a is b False >>> id(a) 42101616 >>> id(b) 42098736 >>> a = set([1,2,3])#a和b为set类型 >>> b = set([1,2,3]) >>> a is b False >>> id(a) 14819976 >>> id(b) 14822256
通过例3可看出,is同一性运算符只有数值型和字符串型的情况下,a is b才为True,当a和b是tuple(元祖),list,dict或set型时,a is b为False。