工厂函数
工厂函数名字叫函数,其实不是函数,是类,返回的都是对象,本文要说的以下几种都是工厂函数:
int、str、float、list、tuple、dict、set、frozenset
一、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
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 "", line 1, in
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
未完待续 ...