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

本文介绍了Python中的工厂函数,包括int、str、float等类型。详细讲解了int类型的加减乘除魔法方法,str类的字符串拼接,float的精度问题,以及list、tuple、dict、set和frozenset的基本操作。通过实例解析了工厂函数的工作原理和常用方法。
摘要由CSDN通过智能技术生成

工厂函数

工厂函数名字叫函数,其实不是函数,是类,返回的都是对象,本文要说的以下几种都是工厂函数:

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

未完待续 ...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值