对数据的操作

对数据的操作

由于每种数据类型的存储内容和方式不同,对其进行处理和操作的方式也就不同。对数据的操作主要有两种方式,一种是运算符,另一种是函数。这两种方式和我们在数学中接触的方式是基本一致的。首先我们以最简单的数字类型的数据为例来进行说明,然后针对每种数据类型以及操作再进行详细说明。此处是关于函数的简单应用,更加详细的内容参见第4章。

输出结果是:

在这里,使用了运算符“+”、函数round() 以及函数print()。其中round()函数有输出值(返回值),而print()函数则没有返回值,只执行函数体内的内容。举个生活中的谚语和常识,“牛吃草,挤出来的是奶”,这就是有返回值的函数;“肉包子打狗,一去不回头”,可以类比无返回值的函数,实际上这种函数很多是输出函数,如本例中的print(a),即将a 的值打印在屏幕上。而实际上运算符也可以想象成一个函数,那么同学们想一想这个函数“+()”的输入有几个呢?如果是x+1,那么在这个式子中,输入就是x和1,有两个输入。

下面给出不同数据类型的定义和基本操作。Python有5个标准的数据类型:

●numbers(数字);

●string(字符串);

●list(列表);

●tuple(元组);

●dictionary(字典)。

其中列表、元组及字典属于集合类型的数据类型。

数字

数值型数据存储于数字数据类型中,它们是不可改变的数据类型,这意味着改变数字数据类型会分配一个新的对象。

一旦声明一个变量并指定一个数字数据,这个变量就成为一个numbers对象,可以用del语句删除这个对象,一旦删除,就不存在这个变量了。如下例所示:

输出结果:

在数字数据类型中,可以处理的类型包括:int(有符号整型)、long(长整型,也可以代表八进制和十六进制)、float(浮点型)、complex(复数)和布尔值。

1.int

Python可以处理任意大小的整数,但实际上和计算机的位数有关,例如,在32位的计算机上,取值范围为-231~231-1,即-2 147 483 648~2 147 483 647。整数的写法和数学上的写法一样,如1、300、-5等。由于计算机采用二进制,因此也可以采用十六进制(每到16进位)表示整数,前面加上前缀0x,后边用0~9,a~f表示,如0xf2(f表示15,整个数为十进制的15×16+2=242)。

2.long

Python的长整数没有指定位宽,即没有限制长整数数值的大小,但实际上由于计算机内存有限,长整数数值不可能无限大。

3.float

浮点数用来处理实数,即带有小数的数字。每个数占8字节(64位),其中52位表示底,11位表示指数,剩下的一位表示符号。一般的浮点数可以用数学写法,如4.25、-63.08等。但是对于很大或很小的浮点数,就必须用科学计数法表示,把10用e替代,4.28×109就是4.28e9,0.0012可以写成1.2e-3,等等。

小P 来解惑

小明遇到一道题需要计算:

小P 说:我来帮忙,开始噼里啪啦键入代码。

小明说:和我的数学公式很像啊,只是乘号变成了“*”,除号变成了“/”,开方变成了“sqrt()”。

小P 说:是的,Python 对数学式子的计算和数学的表达式很像,所见即所得,很方便。

小明说:这可太好了!

4.complex

复数由实部和虚部组成,一般形式为a+jb,其中a是复数的实数部分,b是复数的虚数部分,这里的a和b都是实数。

5.布尔值

对于布尔值,大家可能有点陌生,但是说到“真”与“假”,大家一定就熟悉了。布尔值和布尔代数的表示完全一致,也就是一个真或假的值,例如,3>2的判断结果为真,这个运算式的结果就是True。一个布尔值只有True、False两种值,在Python中,可以直接用True、False表示布尔值(请注意大小写),也可以通过布尔运算计算出来,布尔值可以用and、or和not运算。

“欲破曹兵,宜用火攻。万事俱备,只欠东风。”在这句话中包含着一个逻辑判断,如果有了东风,就万事俱备,即万事俱备的判断结果为True;如果没有东风,则万事俱备的判断结果为False。为了帮助大家理解布尔值,我们来执行一个任务(开启幸运之门)。

小P 来解惑

第一关:找到一把金钥匙或一把银钥匙

第二关:找到一把金钥匙和一把银钥匙

第三关:找到一把金钥匙或一把银钥匙,并且找到一颗红宝石

我们把找到钥匙定义为真(T r u e),没找到定义为假(False),“或”用or表示,“并且”用and表示。下面看看两个闯关者的战绩。

第一关:

闯关者1:找到一把金钥匙,True or False,结果为True,闯关成功!

闯关者2:找到一把银钥匙,False or True,结果为True,闯关成功!

第二关:

闯关者1:找到一把金钥匙和一把银钥匙,True and True,结果为True,闯关成功!

闯关者2:只找到一把银钥匙,False and True,结果为False,闯关失败!

第三关:

闯关者1:找到一把银钥匙和一颗红宝石(False or True)and True,结果为True,闯关成功!

说明:闯关者2在第二关已经失败,没机会闯第三关,故无相应战绩。

到这里,大家应该已经初步了解布尔值的使用方法和运算规则了吧?

布尔值经常用在条件判断中,使用方法可参看表2-1。

表2-1 布尔运算

6.空值

空值是Python里一个特殊的值,用None表示。None不能理解为0,因为0是有意义的,而None是一个特殊的空值。

字符串

现实世界中的信息很多是文本信息,包括文字、符号等,这些文本信息在计算机世界中采用字符串的表达方式。字符串或串是由数字、字母、下划线组成的一串字符。字符串采用单引号(' ')或双引号(" ")括起来,引号内的文本如'关羽'、"xyz"等。字符串是引号中的内容,如"xyz"包括x、y、z 3个字符。如果数字写在引号中,那么此时数字也是字符串。还有些字符无法表达,如换行符、制表符等,这时我们就在前面加“\”来表示特殊的字符,这就是转义字符,如表2-2所示。

表2-2 转义字符表

下面我们利用转义字符来打印一首唐诗:

输出结果为:

下面就要介绍一下对字符串的操作。由于字符串是一串按照顺序存储的文本字符,因此我们可能存在以下一些需求。

●字符串中某一段的字符是什么?

●字符串有多长?

●这个字符串是否以某个特定的字符串/字符开始或结束?这可以帮助我们查找某些特定的字符串,例如,在一堆人名中,我们需要找到名字最后一个字为“博”的同学,或者以“h”开头的词语等。

随机给定一个字符串str="a happy day",每一个字符都有一个编号,这个编号从0开始,也可以倒数,最后一个为-1。这个编号被称之为下标,可以通过下标索引的方式获得字符串的内容。

●单个字符直接用下标访问,例如:str[0]就可以获得字符a,str[-1]就可以获得最后一个字符y。

●一段字符用首尾下标方式获得,如[头下标:尾下标],例如:str[2:4]取的是第三个到第四个字符ha(顾头不顾尾,或左闭右开)。

其他对字符串的操作往往是通过函数来实现的。字符串作为一个可操作的数据对象,使用函数对字符串进行操作有两种方式,一种是将字符串作为函数的参数f(str),另一种是字符串对象调用自身的函数str.f()。表2-3列出了常用操作。

表2-3 对字符串的操作

续表

列表

列表是Python中使用最频繁的数据类型之一,它可以把一大堆不同的数据类型放在一起,形成一个数据集合。例如前面《水浒传》中108将的信息,如果用字符串进行存储,就只能写在一起,即

如果我们想按照排名进行查询就比较困难,而列表就比较方便,可以通过列表的嵌套实现多条记录的存储:

此时每个元素就是一个子列表。

列表是一个有序的集合,与字符串类似,同样可以通过下标来进行访问:

操作实例:

输出结果:

除了可以利用索引来访问元素之外,也可以利用索引修改某个元素,如果要增加元素,需要用后面提到的函数进行操作。

例如:

输出结果:

另外,还可以使用函数对列表进行多种操作,例如,求取元素的个数(len)、增加元素(insert、append)、删除元素(pop),如表2-4所示。

表2-4 对列表的操作

元组

元组是一种与列表相似但是不能修改的数据类型,一旦初始化就不能修改,它没有append()、insert()这样的方法。元组采用“()”标识,内部元素用逗号隔开。但是元组不能二次赋值,相当于只读列表。

例如同样是列出三国武将的名字,如果数据类型采用元组,操作结果如表2-5所示。

表2-5 对元组的操作

现在,Sanguo_Wujiang_t这个元组不能被改变,它也没有append()、insert()这样可以修改元素的方法。如果只是获取元素,这些方法和列表一样,都是通过[下标]进行索引的。

不可变的元组有什么意义?由于元组不可变,因此如果某些数据不希望被别人修改,就可以采用元组,这样代码更安全。因此应该尽可能使用元组代替列表。当元组中只有一个元素时,就需要在后面加一个逗号来消除歧义:

输出结果为第一个元素0。

最后来看一个“可变的”元组:

输出结果是:

这个元组变量为什么发生了改变?实际上在这个元组变量中,最后一项是一个列表,这一项的内部是可以改变的。

字典

前面的列表和元组都是有序的数据类型,但现实世界中的数据集合有些是不排序的,例如,前面我们提到的三国武将信息需要存储,可以采用列表或元组存储,但查询时还需要知道每个武将的编号,这就不太方便,此时如果可以把武将的名字作为索引,即对关键词进行查询就比较方便。在Python中,可以采用字典来实现。

字典是另一种可变容器模型,且可存储任意类型对象,每组数据包括关键词(键)及其所对应的内容(值)。键一般是唯一的,如果重复最后的一个键值对会替换前面的键值对,值不需要唯一。值可以取任何数据类型,但键必须是不可变的,如字符串、数字或元组。

一个简单的字典实例:

输出结果:

这里的人名为键,后面冒号对应的属地为值,即字典的每个键值对key-value用冒号(:)分割,不同的键值对之间用逗号分隔,整个字典用花括号({})括起来,格式如下:

访问某条记录时,把相应的键放入字典的方括号,如Sanguo_dict['关羽']。

1.关于字典键的要求

值可以取任何Python对象,但键有一定的要求。

①同一个键只能出现一次,如果创建时同一个键被赋值两次,则后一个值会被记住。例如:

输出结果为:

②键必须不可变,所以可以用数字、字符串或元组,不能用列表。

2.对字典的常用操作

例如,给定一个字典:

可以执行表2-6所示的操作。

表2-6 对字典的操作