2.1 为什么需要不同的数据类型
著名计算机科学家、Pascal之父、1984年图灵奖得主——尼古拉斯·沃斯(Nicklaus Wirth),有一句名言(其实也是他一本著作的名称)广为流传:
算法(Algorithm)+数据结构(Data Structure)=程序(Program)
简单来说,算法本质上就是解决具体计算问题的实施步骤。它的性能(时间或空间复杂度)与它所处理对象的数据结构高度相关。而所谓的数据结构,简单来说,就是数据及数据之间的关系。
在讲解Python中的数据结构之前,我们先讨论一下更为基础的概念——什么是数据类型。学过编程的读者是否思考过这样的问题:为什么一定要定义不同的数据类型呢?如果所有数据都“大一统”地使用二进制形式,岂不更省事?
为何需要数据类型呢?在回答这个问题之前,我们先来温习一下先贤孔子在《论语·阳货》里的一句话:“子之武城,闻弦歌之声。夫子莞尔而笑,曰:‘割鸡焉用牛刀?’”据此,衍生出了一句中国著名的俗语——杀鸡焉用宰牛刀?这是一个疑问句式。是的,杀鸡的刀用来杀鸡,宰牛的刀用来宰牛,用宰牛的刀杀鸡,岂不“大材小用”?
杀鸡的刀和宰牛的刀,虽然都是刀,但属于不同的类型,如果二者混用,要么出现“大材小用”的情况,要么出现“不堪使用”的情况。由此可以看出,正是有了类型的区分,才可以根据不同的类型实施不同的操作,然后“各司其职”,不易出错,示意图如图2-1所示。
图2-1 “割鸡焉用牛刀”之数据类型比喻
除了不同类型的刀承担的功能不一样,为了安置这两种类型的刀,我们还需要给“杀鸡刀”和“宰牛刀”各配一个刀套。于是,刀套的大小自然也是不同的。
如果将“杀鸡刀”放到“宰牛刀”的刀套里,势必造成空间浪费,而将“宰牛刀”放到“杀鸡刀”的刀套里,必然放不下。在必要时,“宰牛刀”经过打磨可以做成“杀鸡刀”。
是的,在计算机语言中,任何数据类型都需要占据内存,但不同数据类型占据的内存大小是不尽相同的。而在必要时,不同数据类型之间也是可以强制转换的,如前面提到的内置函数int()。
对于不同的数据类型,除了它们占用内存空间不尽相同,在其之上的操作也可能不同。也就是说,数据和对数据的操作(即函数),通常存在一定的绑定性,这正是定义数据类型的本质原因。比如,对于普通的整型数据,它们能进行加、减、乘、除和求余等多种操作。而对于特殊的整型数据——指针(即内存的地址编号),它只能做加法和减法操作,因为做其他类型的操作没有意义。