• 基础题(五)


    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

  • 相关阅读:
    SkinSharp用法
    nosql和关系型数据库比较?
    Java实现 蓝桥杯VIP 算法提高 进制转换
    Java实现 蓝桥杯VIP 算法提高 3-2字符串输入输出函数
    Java实现 蓝桥杯VIP 算法提高 3-2字符串输入输出函数
    Java实现 蓝桥杯VIP 算法提高 3-2字符串输入输出函数
    Java实现 蓝桥杯VIP 算法提高 3-2字符串输入输出函数
    Java实现 蓝桥杯VIP 算法提高 3-2字符串输入输出函数
    Java实现 蓝桥杯VIP 算法提高 去注释
    Java实现 蓝桥杯VIP 算法提高 去注释
  • 原文地址:https://www.cnblogs.com/zhuifeng-mayi/p/9174902.html
Copyright © 2020-2023  润新知