通过一个“人员信息统计表”学习列表、元组与字符串的用法
列表,是编程常用的工具,作用是用来处理大量数据;
元组,是Python的特别设置,用来做“常量集合”;
字符串,是编程时经常要处理的内容
1、 声明列表
2、 列表元素的使用
3、 列表中元素的添加,插入,删除,修改
4、 元组的声明和元组元素的使用
5、 切片运算
6、 字符串的声明
7、 字符串的连接、格式化、转换、分割
第一个例程就争取不寻常,它说明list是一个集合,仅仅是个集合,而不是象其它语言的数组是“同类型数据的集合”,对,list可以使用不同类型,请看案例5-1:
运行结果是:
学一下验证自己想法的方法,Python可以快速得到答案,所以可以快速验证,list中可以放置不同类型的元素?try it,第一行正确执行,OK。
第2行和第3行是测试一下是否可以按元素下标(或叫索引)使用列表元素?对照输出的结果,完全没有问题,第4、5行的用意是测试一下list中的元素是否可以按数据原有的类型计算(它不会把所有数据都转化成一种通用类型吧)?通过测试结果看,直接将字符串和数值类型数据分别计算结果十分正常。故list这种集合比传统数组要方便多了。另外,我们利用列表名[索引]的方法使用列表中的元素。同时注意元素索引的的最小值是0,那么若列表中有N个元素,最大索引就是N-1。
当然,若在列表中存放相同类型的元素,那是完全可以的。
下面来一个复杂应用吧,对编程来说,不禁止,即允许,所以不要束缚自己的想象力。
例5-2的第1行定义了一个列表,但是这个列表有两个元素,每一个元素都是一个列表,而且连个列表的组织方式也不一样,其中lst00[0]中有5个字符串,分别是lst[0][0]:“sn”,lst[0][1] :“home”,lst[0][2] : “name”,lst[0][3] : “score_1”,lst[0][4] : “score_2”,lst[1]包含三个数字,两个字符串每个元素分别如下:
lst[1][0]:12、lst[1][1]:’beijing’、lst[1][2]:’zhang3’、lst[1][3]:83.5、lst[1][4]:89
明白了吧:对于lst00而言,有2个元素:lst00[0]和lst00[1],但是由于lst00[0]和lst00[1]又都是列表,所以,lst00[0]这个列表的第一个元素是lst[0][0],第I 个元素是lst[0][i]。本案例将lst[0]当作表头,将lst[1]用作人员信息。
第7行示意了一个简洁的遍历列表元素的方法:for “变量” in 列表,它的含义是:依次用列表元素向“变量”赋值,直到穷尽列表元素。它比计算出列表长度SIZE,在用0到SIZE-1的下标去遍历要简洁方便。要注意的是“变量”的类型要与列表中元素的类型一致。
第7行到第19行演示了用循环遍历和用“下标引用”两种方法使用列表。
本节的案例就是利用列表、元组和字符串的各种内置方法完成一个人员信息管理程序。案例5-3演示了利用列表的内置函数对人员信息进行各种操作,从案例5-3开始,一些简单的注释就放在程序中了,为此程序需要支持UTF字符。
第一个案例就提到过,在程序的第一行标注“# -*- coding: utf-8 -*-”就可以在程序中使用中文字符串和中文注释。
现在看一下5-3的第一部分程序:
这个程序在24行之前,打印了所有的列表元素,其中第15行的目的是遍历lis00列表的lst00[1]到lst00[len_msg]的所有元素,而25行对lst00的列表尾部加入1条记录,25行以后的代码又将列表中所有元素都打印了一遍。可以看到新加入的人员信息在最后一行。
只是这个程序的打印部分应该被定义为函数,这样不但能使程序可读性增强,还能有效缩短代码长度。所以修改5-3,并加入其他功能。
首先看一下提取出来的函数(工具包:list_5.py):
那么要完成案例5-2的功能就可以变得非常简单了:
# -*- coding: utf-8 -*- 此行的目的是使用中文
from list_5 import *
print_lst()
print '\n现在插入一条记录z在列表尾部,然后打印'
lst00.append([12,'东城','李四',87.5,86])
print_lst()
现在这个程序比较容易看懂了吧,源代码不要求通俗,但一定要易懂。
虽然在新的案例5-2代码中没有声明列表lst00,但是第2行的from import引入的list_5中进行了定义。
现在是综合案例的5-3:
接下来再研究元组的案例,元组是个有意思的集合,它是一个元素(直接元素)不可更改的集合,无论是元素值、元素数量都不可更改。
列表用[]定义,元组用()定义,例如
math_const_value=(3.1415,2.71828),元组math_const_value中包含了圆周率和自然对数的底两个常数,使用中若试图改变元组中的这两个数,程序会出现错误。
但是,元组中的元素可以是列表,列表的元素可以改变,所以“元组是直接元素不可改变的集合”,这句话看得懂就可以将这个机制用在C语言指针数组那种情境中,若看不懂,那就说明你不需要看懂。
元组和列表最突出的区别就是“元组一旦定义即不可更改”,而在访问元素的方法方面都是类似的。
下面用几个片断展示一下Python的 “切片运算”,切片的含义是从一个集合中挑选出需要的子集,切片运算适用于列表、元组和字符串,下面的案例混合使用元组、列表和字符串。
设有列表 list_demo[4]=[‘a’,’b’,’c’,’d’]
tuple_demo[5]=[1,2,3,4,5,6,7,8,9]
1)使用缺省风格的下标:
引用前三个元素:print tuple_demo[:3]
2)使用“倒数第N个元素”风格的下标
引用倒数三个元素:print list_demo[-3:-1]
负数的含义是倒数…
3)还可以在引用中使用两个冒号,形如“L: M:N”,表达从L开始到M,每隔N个元素取值。
从第2个元素到 倒数第1个元素,每隔2个元素打印:
print tup[2:-1:2]
4)从匿名集合中切片
可以从一个匿名的集合切片:
print (2,4,6,8,10)[::2],注意第一个冒号两边都是空的,空的含义是total,所以结果是(2,6,10)
匿名的优势在于可以将一个集合运算的结果嵌入新的运算表达式。
观察以上案例的结果应该发现,列表和元组的计算结果任然是列表和元组。
5)匿名集合切片的机制的一个大好处是处理字符串,这样处理字符串也可以用表达式了级别的运算了。
从“beijing”中取出前三个字符
print “Beijing”[:3]
Python 的字符串操作十分简单,这里介绍几个有特色的,读一遍代码即可,很好理解。
1) 替换
print “AAABBBAAA”.replace(“BBB”,”AAA” )
>>> AAAAAAAAA
2) 比较
>>> cmp("beiping","beijing")
1
>>> cmp("beijing","beijing")
0
>>> cmp("beijing","beiping")
-1
3) 查找
print “china beijing”.find(“bei”)
>>>6
这表示“bei”在“china beijing”中的第6个字符开始的地方被找到
4) 大小写转换
stru=“beijing”upper()
print stru
strl=stru.lower()
print strl
5 去掉空格
>>> " china,beijing,chaoyang ".strip()
'china,beijing,chaoyang'
>>> " china,beijing,chaoyang ".lstrip()
'china,beijing,chaoyang '
>>> " china,beijing,chaoyang ".rstrip()
' china,beijing,chaoyang'
注意strip,lstrip和rstrip的区别是分别去掉“左、右和两边”的空格
6) 分割是编程中常用的技巧
>>> "china,beijing,chaoyang".split(",")
['china', 'beijing', 'chaoyang']
从例句可以看到,字符串用split(‘分割标志字符’)来将字符串分割成若干部分,分割结果放入列表,然后可以使用列表的处理方法引用各部分