美文网首页
python基础数据类型(工厂函数)

python基础数据类型(工厂函数)

作者: 蛋炒饭爱吃我 | 来源:发表于2020-04-26 16:13 被阅读0次

    工厂函数

    工厂函数名字叫函数,其实不是函数,是,返回的都是对象,本文要说的以下几种都是工厂函数:
    intstrfloatlisttupledictsetfrozenset
    一、int
    返回一个整型对象,在int类中重写了很多算数类的魔法方法,如加__add__减__sub__乘__mul__地板除__floordiv__,就是当对两个int型对象执行算数操作的时候自动执行的魔法方法,先拿加法举一个简单的例子:
    我们先来看int类中__add__的魔法方法是怎样一个形式:

     |  __add__(...)
     |      x.__add__(y) <==> x+y
    

    首先我们需要知道如果我们这样写:x=5,那么数字5就被python解释为一个int类的对象,这些是python自动帮我们完成的,接下来又把5赋值给x,所以x也是一个int类对象。执行加法运算时+两边必须都是int类对象,而且是+左边是主动的去加右边的数字,我们看代码x.__add__(y) <==> x+y,如果x不是int类对象,那么就不会调用到int类的这个相加的魔法方法,如果x是int类,而y不是int类对象,程序就会报错,报错信息如下:

    image.png
    类型错误:+操作符不支持int类和str类相加
    如果把顺序换一下,我们再来看报错信息:
    image.png
    类型错误:不能隐式地将'int'对象转换为str
    通过上述两条报错信息,应该理解主动被动的关系了吧,谁在前谁在后,并且也知道+两边都是int类才能起到两个整形数相加的效果。int类中还重写了很多其他的方法__radd____rsub__等等其他的魔法方法,用的不是很多这里就不徒增烦恼了(其实我也没理解__radd__的工作原理,网上很多人的解释并没有说服我)
    下面两幅图是int类中的魔法方法:
    image.png
    image.png

    二、str
    str类中也有__add__魔法方法实现的是字符串拼接,但是没有__sub__相减的方法,如果我们想实现字符串相减,需要自己写一个类实现字符串相减,举个例子:

    #重新定义一个类继承str,重写__sub__可以实现字符串相减
    class Newstr(str):
    
        def __sub__(self,other):
            print("我所实现的字符串相减就是长度相减")
            return len(str(self))-len(str(other))
    
    
    string1=Newstr("abcdefg")
    string2=Newstr("xxx")
    
    print(string1-string2)
    print(string2-string1)
    
    
    #重新定义一个类继承str,但是没有重写__sub__,两个字符串不可以相减
    class Newstr(str):
        pass
    
    
    string1=Newstr("abcdefg")
    string2=Newstr("xxx")
    
    print(string1-string2)
    print(string2-string1)
    报错信息如下:
    Traceback (most recent call last):
      File "C:\Users\Administrator\Desktop\test.py", line 25, in <module>
        print(string1-string2)
    TypeError: unsupported operand type(s) for -: 'Newstr' and 'Newstr'
    

    操作字符串有很多内置BIF,下图为常见的BIF


    image.png

    也可以像操作列表那样使用分片操作:


    image.png
    有一点需要说明的是:python字符串是不可变类型,不能被改变,比如向一个索引位置赋值:`string1[0] = "m"` 会导致错误
    >>> string1 = "abcd"
    >>> string1[0]="m"
    Traceback (most recent call last):
      File "<pyshell#29>", line 1, in <module>
        string1[0]="m"
    TypeError: 'str' object does not support item assignment
    >>>但是列表可以
    >>> list1=[1,2,3,4,5]
    >>> list1[0]=6
    >>> list1
    [6, 2, 3, 4, 5]
    

    三、float
    关于float我只说一点,看下面代码:

    image.png

    0.1+0.2的结果怎么是这么个玩意儿?
    接着往下看:

    image.png
    这又是啥玩意儿?
    说明python的浮点数是有误差的,我们就不要相信浮点数的运算了
    >>>0.3 == 0.1 + 0.2
    >>>False
    >>>0.3 < 0.1 + 0.2
    >>>True
    

    怎么解决这个问题呢?

    >>>import decimal
    >>>a = decimal.Decimal( "0.1" )   # 传的参数是字符串
    >>>b = decimal.Decimal( "0.2" )
    >>>print(a+b)
    >>>0.3
    

    也可以进行比较


    image.png

    四、list
    列表分片参照字符串分片,道理都一样,只不过list是可变类型,字符串是不可变类型
    列表添加元素三种方法:append(元素)、extend(列表)、insert(位置,元素),其中appen()和extend()都是向列表末尾添加
    删除列表元素三种方法:remove(元素)、del 列表[下标]、pop():弹栈,默认弹出列表最后一个元素,pop(2):删除指定位置
    列表的方法实在是太多了...

    五、tuple
    六、dict
    七、set
    八、frozenset
    未完待续 ...

    相关文章

      网友评论

          本文标题:python基础数据类型(工厂函数)

          本文链接:https://www.haomeiwen.com/subject/qmqdwhtx.html