在计算机科学中,数据结构(data structure)是用来在计算机上存储和组织数据的一种特殊方式,以便数据可以有效地应用于特定的场合。为了帮助读者更好地理解数据的计算机表示,下面首先介绍数据结构相关的基本概念。
数据是客观事物的符号表示,是指所有输入计算机并可被计算机程序处理的符号的总称。
数据元素是数据的基本单位,在计算机中作为整体进行考虑和处理。例如,在保存教师信息的表中,每一条教师记录就是一个数据元素。
数据项是数据不可分割的最小单位,一个数据元素可由若干个数据项组成。
在计算机程序设计语言中,数据类型是变量所具有的数据种类,如C、Java、Python等语言中的整型、浮点型、字符型等都是数据类型。
为什么会有不同的数据类型呢?举一个简单的例子,在计算机中计算“1+2”的程序并不需要多么大的空间来存放,但是计算“100000000+2000000000”的程序就需要一个相对较大的空间来存放。有时候需要计算小数,小数的位数不一样,程序需要的空间也就不一样。数字1和字母a也需要区分,于是开发高级语言的程序员就想出了“数据类型”,用其来描述不同的数据集合。数据类型的专业解释是一个值的集合和定义在这个值的集合上的一组操作的总称。数据类型也可以看作已经实现了的“数据结构”。
逻辑结构用来表示数据的相互关系,常见的逻辑结构包括集合、线性结构、树形结构和图形结构等。
物理结构/存储结构是数据在计算机中的表示,用于描述数据具体在内存中的存储形式,如顺序结构、链式结构、索引结构、哈希结构等。
下面通过计算体重指数的程序例子,简单介绍程序中的基本元素,如变量、函数、表达式以及输入和输出。
计算身体指数程序
【例2-1】 编写程序,输入身高和体重,计算身体质量指数(body mass index,BMI)。BMI的计算公式如下(其中体重的单位为千克,身高的单位为米):
BMI=体重/身高 2
世界卫生组织制定的亚洲人BMI参考标准如表2-1所示。
表2-1 亚洲人BMI参考标准
【程序代码】
【运行结果】
请输入体重(千克):60(回车) 请输入身高(米):1.62(回车) BMI值:22.86236854138088
【程序解析】
① 变量
程序代码中的weight、height和BMI是变量。其中,weight用于存储用户输入的体重数据,height用于存储用户输入的身高数据,BMI用于存储用户的BMI值。
② input()函数
程序代码中input()函数的功能是提示用户输入数据,并以字符串形式返回用户输入的数据。其详细用法见2.1.3节。
③ eval()函数
程序代码中eval()函数的功能是把字符串数据转换成数值型数据。
④ 赋值语句
程序代码中的等号(=)是赋值语句,作用是把等号右侧的数据赋值给等号左侧的变量。其详细用法见2.1.2节。
⑤ print()函数
程序代码中print()函数的功能是在控制窗口输出数据。其详细用法见2.1.3节。
⑥ 注释
注释是代码中穿插的辅助性文字,用于标识代码的含义与功能,以提高代码的可读性。在Python中,注释分为单行注释和多行注释。单行注释以井号(#)为标识,Python解释器看到#时,就会忽略#以后同一行的所有文本。多行注释以3个连续的单引号(''')开始,以3个连续的单引号(''')结束。Python解释器扫描到'''时,就会扫描下一个''',然后忽略这之间的任何文本。
⑦ 缩进
在Python中使用“缩进”即一行代码前面的空白区域,用来确定代码之间的逻辑关系和层次关系。Python代码的缩进可以使用Tab键控制,也可以使用Space键控制。Python对代码的缩进有严格的规定,缩进的改变会导致代码语义的改变。
赋值语句是程序设计中最基本、最常用的语句之一,其作用是在程序运行过程中改变变量的值。
赋值语句
单一赋值语句用于将一个表达式的值赋给一个变量。其语法格式如下:
变量 = 表达式
其中,“=”是赋值号,“表达式”可以是常量或者变量,也可以是由常量、变量和运算符等构成的可以运算的表达式,如15+10、x-8等。
因此,可使用赋值语句将把右边表达式的值赋给左边的变量。例如:
>>> weight=100 >>> s=s+i >>> count=count+1
链式赋值语句用于将一个表达式的值赋给多个不同的变量。其语法格式如下:
变量1 = 变量2 = … = 变量n = 表达式
例如:
>>> x=y=z=1000
与该链式赋值语句等价的单一赋值语句如下:
>>> x=1000 >>> y=x >>> z=x
同步赋值语句用于将不同的值同时赋给多个不同的变量。其语法格式如下:
变量1, … , 变量n =表达式1, … , 表达式n
注意在语法格式中,变量和变量之间的逗号、表达式和表达式之间的逗号,均为英文逗号。
同步赋值语句并非等同于将多个单一赋值语句组合,因为Python在处理同步赋值语句的时候,首先对赋值号“=”右侧的 n 个表达式进行运算,然后将右侧表达式的运算结果同时赋给左侧的 n 个变量。
【例2-2】 编程实现 x 和 y 值的互换。
【程序代码】
【运行结果】
互换后x是:8 互换后y是:7
【程序代码】
【运行结果】
互换后x是:8 互换后y是:7
程序代码2-2a.py使用单一赋值语句,实现“x”和“y”值的互换。程序代码2-2a.py中第1、2行对“x”“y”进行初始化赋值,第3、4、5行实现“x”和“y”值的互换。程序代码2-2b.py使用两个同步赋值语句实现初始化赋值(第1行)和“x”与“y”值的互换(第2行),第2行实际上就是“x,y=8,7”。
同步赋值语句通过减少使用变量,使得赋值过程更加简洁,简化了语句的表达,增加了程序的可读性。
对于上述3种赋值语句,读者要在程序中灵活使用。
为了便于程序与用户进行数据交互,完成输入和输出,用户可以用input()函数和print()函数。
input()函数的功能是提示用户输入数据,并以字符串形式返回用户输入的数据。input()函数的语法格式如下:
变量 = input(["用户提示信息:"])
具体说明如下。
① 方括号([])内的参数是可选参数,所谓可选参数即在使用过程中可以省略的参数。
② "用户提示信息:"用于设置作为提示而显示的文字信息,从而提示用户进行数据的输入。若省略该参数,则用户将可能不知道在何时、何处输入何数,使用户体验不好,因此使用input()函数时,最好用该参数给出相应的输入提示信息。
③ input()函数的返回值是字符串。所谓返回值,就是调用函数得到的结果。对于该函数,无论用户输入的是字符还是数值,其结果都是字符串。当需要输入数值并进行算术运算时,就可以用eval()、float()、int()等函数,把字符串转换成数值。
例如:
>>> r1=input("请输入圆的半径:") 请输入圆的半径:5 >>> r1 '5'
>>> r2=eval(input("请输入圆的半径:")) 请输入圆的半径:5 >>> r2 5
通过上述两段代码可以理解input()函数返回值的数据类型,以及eval()函数此处的转换功能。
用input()函数还可以一次输入多个数据,然后通过eval()函数进行转换,将转换后的结果赋给多个变量。例如:
>>> a,b,c=eval(input("请输入三角形3条边的边长:")) 请输入三角形3条边的边长:3,4,5 >>> a 3 >>> b 4 >>> c 5
其实,在这样的用法中,eval()函数将用英文逗号分隔的数字字符串转换成元组,即eval("3,4,5")的结果是元组(3,4,5),由此再将元组(3,4,5)中的元素按照顺序,依次赋给变量a、b、c。该例子中在输入数据时要注意,数据和数据之间用英文逗号进行分隔,且数据的个数与赋值号左边变量的个数相同。该方法在后续的程序中经常使用,它可以使程序更加简洁。
在程序中可以通过print()函数将结果按照设定的格式进行输出。print()函数的语法格式如下:
print([数据项1, … , 数据项n][, sep=' '][, end='\n'])
具体说明如下。
① 数据项:需要输出的各项数据,可以是常量、变量或表达式等。当数据项和其他参数都为默认值时,则输出一个空行;当只有一个数据项,其他参数为默认值时,则输出该数据项的值后换行;当有多个以英文逗号分隔的数据项,其他参数为默认值时,则在一行中输出多个数据项的值,各值之间默认以空格分隔,并以换行符结尾。
② sep参数:用于设置输出数据项值间的分隔符。若省略该参数,则默认用空格,即各个值之间用空格分隔。
③ end参数:用于设置print()函数的结束字符串。若省略该参数,则默认以换行符('\n')为结束字符串。例如:
1 s=100 2 print(s) 3 print(1,2+3) 4 print() 5 print(1,2,3,sep="和") 6 print(1,2,3,sep="+",end="=") 7 print(1+2+3)
分析上面代码:第2行,输出变量s的值100,以换行符结尾,即输出100后换行;第3行,输出1和2+3的结果5,用空格分隔并换行;第4行,print()函数无任何参数,则输出一个空行;第5行,输出1、2、3,用“和”分隔并换行;第6行,输出1、2、3,用“+”分隔,3后面以“=”结尾且不换行;第7行,在第6行的结果后面输出1+2+3的运算结果6。
输出结果:
100 1 5 1和2和3 1+2+3=6
print()函数常和format()函数配合使用,可按照用户需要实现格式化输出。format()函数的内容请查阅2.5.1节。
【例2-3】 输入圆的半径,求圆的周长和面积并输出。
【程序代码】
【运行结果】
请输入圆的半径:1 半径为1的圆的周长等于:6.28 半径为1的圆的面积等于:3.14