阿萌准备编写一个班级通讯录程序,该程序可以记录每位同学的姓名、电话号码和年龄。阿萌该如何设计班级通讯录程序的数据结构呢?
阿萌最初设计的程序数据结构准备采用三个列表,三个列表分别存储每位同学的姓名、电话和年龄。
这样的数据结构也能够解决通讯录存储数据的问题,不过这不是最好的数据结构:一是程序需要同时处理三个列表数据,增加了程序代码的复杂度;二是数据的组织也非常松散,不够紧凑。
案例01代码的数据结构采用了阿萌设计的数据结构,分别创建了三个列表,用于存储每位同学的姓名、电话和年龄。代码使用了三个for循环录入每位同学的数据,并分别添加到三个列表。
从案例01的代码也可以看出,采用三个列表来存储通讯录增加了代码的复杂度,数据也不够紧凑,通讯录的数据分散在三个列表中,导致数据访问也非常麻烦。
Python提供了元组数据结构,英文名称是tuple。元组和列表一样,它也可以把不同类型的数据进行有序排列,并进行同一存储和操作。
与列表不同的是,元组赋值后所存储的数据不能被程序修改。可以将元组看作是只能读取数据不能修改数据的列表。元组的这个特点正好用于存储通讯录的数据项,通讯录生成后,通讯录的每个数据项一般不会变动。
创建元组的语法与列表相同,不同之处是元组使用小括号,列表使用方括号,元素之间也是用英文逗号分隔。
需要注意的是,当元组只有一个元素时,需要在元素的后面加一个英文逗号分隔符,以防止与表达式中的小括号混淆。这是因为小括号既可以表示元组,又可以表示表达式中的优先级算符,这就容易产生歧义。
元组元素也可以是任何类型的数据,元组创建完成后,元组不能再添加元素,也不能更新或删除元素。
案例02的代码演示了如何创建一个元组。当创建的元组只包含一个元素时,需要在元素的后面加一个英文逗号分隔符,以防止与表达式中的小括号混淆。
元组的访问和列表相同,可以直接使用索引访问元组中的单个数据项,也可以使用截取运算符访问子元组。
访问运算符包括[]和[:]运算符,用于访问元组中的单个数据项,或者一个子元组。
案例03的代码演示了如何访问元组的元素。变量名称为s的元组里面又包含了元组元素,当访问内嵌元组元素时,就需要两个索引来访问元组里面的元素。
元组的遍历方式和列表相同,都是使用for循环语句遍历元组的元素。
案例04的代码演示了如何使用for循环遍历元组。
阿萌掌握了元组结构,他准备采用列表和元组作为通讯录程序的数据结构,具体数据结构是使用元组存储同学的姓名、电话和年龄,元组作为列表的数据项。
阿萌根据设计的数据结构绘制了流程图。
有了流程图,阿萌开始编写代码。他启动PythonIDLE,在IDLE的Shell窗口新建一个代码文件,在新建的代码编辑窗口编写代码。
代码解读
在上面的代码中,首先创建一个空列表address_list,用于存储元组数据项,并创建变量count,用于存储同学数量,为了程序测试方便,count赋值为3。
使用for循环输入学生成绩,循环次数为学生人数加1。在每轮循环中,分别要求用户输入同学的姓名、电话和年龄,然后address_list调用append方法加入元组元素,元组元素在append方法的参数中直接创建。
遍历address_list,在每轮循环中使用当前索引获取元组数据项,输出元组元素。
课程小结
元组与列表相同,可以存储不同类型的内容。元组与列表有两个不同点。
第一个不同点是元组的创建使用小括号,而列表使用方括号,当创建只有一个元素的元组时,需要在这个元素的后面添加英文逗号。
第二个不同点是元组创建和赋值后,不能像列表一样添加、删除和修改元素,也就是说元组在程序运行过程中不能被修改。
上机练习
1、编写程序,创建一个元组names,names包含张三、李四、王五、赵二元素。
2、编写程序,创建一个元组numbers,numbers元素为89.3、78、96.1、88、92,遍历元组并求出元组的最大值。
3、编写程序,创建一个元组num,num元素为30,12,89,31,69,95,完成如下操作:
(1)使用print函数输出元组索引3~5的元素;
(2)使用print函数输出元组索引1的元素。