python3之python的核心数据类型(其他核心类型)

来源:互联网 发布:开机忘记密码 mac 编辑:程序博客网 时间:2024/06/06 18:47
python3之python的核心数据类型(其他核心类型)
----------

到目前为止除了我们看到的核心类型外,还有其他的或许能够称得上核心类型的类型,这取决于我们定义的分类有多大。例如,集合是最近增加到这门语言中的类型它不是映射也不是序列,相反,它们是唯一的不可变的对象的无序集合。集合可以通过调用内置set函数而创建,或者使用python3.0中新的集合常量和表达式创建,并且它支持一般的数学集合操作(python3.0中新的用于集合常量的{....}语法是有意义的,因为集合更像是一个无值的字典的键):

>>>X=set('spam')>>>Y={'h','a','m'}>>>X,Y({'a','p','s','m'},{'a','h','m'})>>>X&Y{'a','m'}>>>X|Y{'a','p','s','h','m'}>>>X-Y{'p','s'}>>>{x**2 for x in [1,2,3,4]}{16,1,4,9}
此外,python最近添加了一些新的数值类型:十进制数(固定精度浮点数)和分数(有一个分子和一个分母的有理数)。它们都用来解决浮点数学的局限性和内在的不精确性。(例子略)python最近还添加了布尔值(预定义的True和False对象实际上是定制后以逻辑结果显示的整数1和0),以及长期以来一直支持的特殊的占位符对象None(它通常用来初始化名字和对象)

如何破坏代码的灵活性
注意:内置函数type返回的类型对象是赋给该类型的另一个对象的一个对象(听起来好像是java中的反射,未确定!!!!),其结果在python3.0中略有不同,因为类型已经完全和类结合起来了,如例:

#In Python 2.6:>>>type(L)<type 'list'>>>>type(type(L))<type 'type'>#In python 3.0:>>>type(L)<class 'list'>>>>type(type(L))<class 'type'>
除了允许交互地探究对象,这个函数的实际应用是,允许编写代码来检查它所处理的对象的类型。实际上,在python脚本中至少有3种方法可以做到这点:
>>>if type(L) == type([]):      print('yes')yes>>>if type(L) == list:      print('yes')yes>>>if isinstance(L,list):      print('yes')yes
现在本书已经介绍了所有的类型检验的方法,尽管这样,我们不得不说,就像在本书后看到的那样,在python程序中这样做基本上都是错误的(这也是一个有经验的C程序员刚开始使用python时的一个标志)。在本书后面,当我们开始编写函数这样较大的代码单元的时候,才会澄清其原因但这是一个(可能是唯一的)核心python概念在代码中检验了特定的类型,实际上破坏了它的灵活性,即限制它只能使用一种类型工作。没有这样的检测,代码也许能够使用整个范围的类型工作
这与前边我们讲到的多态的思想有些关联,它是由python没有类型声明而发展出来的。就像你将会学到的那样,在python中,我们编写对象的接口(所支持的操作)而不是类型。不关注于特定的类型意味着代码会自动地适应它们中的很多类型,任何具有兼容接口的对象均能够工作,而不管它是什么对象类型。尽管支持类型检测(即使在一些极少数的情况下,这是必要的),你将会看到它并不是一个"python式"的思维方法,事实上,你将会发现多态也是使用python的一个关键思想

用户定义的类
我们将深入学习python中的面向对象编程(这门语言一个可选的但很强大的特性)。用抽象的术语来说,类定义了新的对象类型,扩展了核心类型。如例:

>>> class Worker:      def __init__(self,name,pay):        self.name=name        self.pay=pay      def lastName(self):        return self.name.split()[-1]      def giveRaise(self,percent):        self.pay *= (1.0+percent)
这个类定义了一个新的对象的种类,有name和pay两个属性,也有两个方法(注意:__init__这个方法,前后都是两个下划线,不然会报错的)。就像函数那样去调用类,会生成我们新类型的实例,并且类的方法调用时,类的方法自动获取被处理的实例(其中的self参数):

>>>bob=Worker('Bob Smith',50000)>>>sue=Worker('Sue Jones',60000)>>>bob.lastName()'Smith'>>>sue.lastName()'Jones'>>>sue.giveRaise(.10)>>>sue.pay66000.0
隐含的'self'对象是我们把这叫做面向对象模型的原因,即一个类中的函数总有一个隐含的对象。


原创粉丝点击