内容正文:
第三章 算法的程序实现
3.1用计算机编程解决问题的一般过程
1.抽象与建模
(1)提炼核心要素并加以确定或假设(已知、未知)
(2)用数学符号描述解决问题的计算模型(可以是数学模型关系表达式、文字、表格或图形等)
2.设计算法
3.编写程序
4.调试运行程序
通过运行程序,计算机会自动执行程序中的命令。但是,在将算法进行程序实现时,可能会因为录入错误、语法错误、逻辑错误等原因,导致程序不能正常运行或输出错误的结果。此时,需要对程序进行调试,以便发现错误并进行修正。
(1)注意的空格的使用规范;
(2)程序编辑在英文状态下运行,注意区分大小写;
(3)编辑程序时观察代码的颜色变化。
2.2算法的程序实现
1.Python语言基础
(1)编程环境
编写Python程 序 比 较 方 便 的 方 式 是 使 用 集 成 开 发 环 境(Integrated Development Environment,简称IDE),IDLE是开发Python程序的基本IDE。打开IDLE,会出现交互式解释器Python Shell,可以通过它在IDLE内部执行Python命令,也可以在Python Shell的提示符“>>>”后输入任意的语句、表达式或者一小段代码进行测试。
(2)数据类型与表达式
①数据类型:整型、实型、字符串型、布尔型。
②基本运算:算术运算、关系运算和逻辑运算三大类。
③算术运算是运用算术运算符进行数的加、减、乘、除等数学运算。
运算符
表达式
描述
优先级
**
x**y
求x的y次幂
1
*
x*y
将x与y相乘
2
/
x/y
用x除以y,产生实数值
2
//
x//y
用x除以y,取整数部分
2
%
x%y
用x除以y,取余数
2
+
x+y
将x与y相加
3
-
x-y
将x减去y
3
Python中的算术运算存在着优先级顺序,优先程度最高级别为1,级别数字越大,优先级越低;在同一个表达式中,如果有一个及以上的运算符,那么先执行优先级高的运算,同优先级的基本运算按照自左向右的顺序执行,但幂运算按照自右向左的顺序执行。
④关系运算符
关系运算的结果是一个布尔值,若两个数据之间指定的关系成立,则计算的结果值为真(True),否则为假(False)。
运算符
表达式
描述
>
x>y
x大于y
<
x<y
x小于y
>=
x>=y
x大于等于y
<=
x<=y
x小于等于y
==
x==y
x等于y
!=
x!=y
x不等于y
in
x in y
x 是y的成员
⑤逻辑运算符
运算符
表达式
描述
示例
and
x and y
布尔“与”
True and False结果为False
or
x or y
布尔“或”
True or False结果为True
not
not x
布尔“非”
not False结果为True
(3)变量和赋值语句
Python是动态类型语言,因此在使用前不需要预先声明变量的数据类型。
①变量命名规则
Ⅰ.变量名可以包括字母、数字和下划线“_”,但不能以数字开头;
Ⅱ.变量名区分大小写;
Ⅲ.为了便于理解,变量名应具有一定含义,即“见名知意”;
Ⅳ.不能用系统关键字作为变量名;
Ⅴ.变量名中不能有“\/&%*$?<}^”等特殊字符与标点;
Ⅵ.变量名中不能有空格。
②赋值符号
运算符
描述
举例
=
简单的赋值运算符
c=a+b 将a+b的值赋值给c
+=
加法赋值运算符
c+=a 等效于c=c+a
-=
减法赋值运算符
c-=a 等效于c=c-a
*=
乘法赋值运算符
c*=a 等效于c=c*a
/=
除法赋值运算符
c/=a 等效于c=c/a
%=
取模赋值运算符
c%=a 等效于c=c%a
**=
幂赋值运算符
c**=a 等效于c=c**a
//=
取整数赋值运算符
c//=a 等效于c=c//a
(4)基本数据结构
①Numbers(数字)
整型(int):通常被称为整型或整数,是不带小数的数,如a = 10 b = -60 c = 6841。
浮点型(float):浮点型由整数部分与小数部分组成,如2.5。
复数(complex):复数由实数部分和虚数部分构成,可以用a+bj或者complex(a, b)表示,复数的实部a和虚部b都是浮点型,例如:a = 3.0+4.0j b=complex(0,1)。
②String(字符串)
字符串是由一些数据元素共同组成的一个序列整体,用单引号或双引号括起来的文本。
③List(列表)
List(列表) 是 Python 中使用最频繁的数据类型。列表可以完成大多数集合类的数据结构实现。它支持字符,数字,字符串甚至可以包含列表(即嵌套)。列表用 [ ] 标识,是 python 最通用的复合数据类型。若要访问的不是单个元素,而是一定范围内的多个元素,可以通过冒号“:”间隔的,两个索引参数(开始元素序号、结束元素序号的后一个序号)来实现。
④rm(元组)
元组是另一个数据类型,类似于 List(列表)。元组用 () 标识。内部元素用逗号隔开。但是元组不能二次赋值,相当于只读列表。
⑤Dictionary字典
字典(dictionary)是除列表以外python之中最灵活的内置数据结构类型。列表是有序的对象集合,字典是无序的对象集合。
两者之间的区别在于:字典当中的元素是通过键来存取的,而不是通过偏移存取。
字典当中的元素是通过键来存取的,而不是通过偏移存取。字典用{ }标识,它是一个无序的“键(key):值(value)”对集合。键必须使用不可变类型。在同一个字典中,键必须是唯一的。
二、顺序结构的程序实现
这种按照程序语句的先后顺序执行的结构,我们称之为“顺序结构”。顺序结构是最常用、最简单的程序结构,其语句执行顺序是自上而下,依次执行的。
1.Python常见内建函数
三、分支结构的程序实现
(一)if 语句
1.格式
if<条件> :
<语句块>
if(条件表达式)后面加冒号“:”,当语句A是由多个语句构成的复合语句时,所有语句严格遵循相同的缩进。
2.执行过程
如果条件表达式为真,则执行语句A,然后继续往下执行;
如果条件表达式为假,则不执行语句A,然后继续往下执行。
(二)双分支if语句
1.格式:
if<条件> :
<语句块1>
else :
<语句块2>
if(条件表达式)后面加冒号“:”,当语句A和语句B是由多个语句构成的复合语句时,所有语句严格遵循相同的缩进。
2.执行过程:
如果条件表达式为真,则执行语句A,
然后继续往下执行。如果条件表达式为假,则执行语句B,然后继续往下执行。
3.注意
if语句中的冒号表示下方紧接着一个语句块。在Python中,语句块是一行或放在一起多行的语句,一般通过行缩进来标识。同一个if语句中,if、else下方的语句块必须采用相同的缩进。
在Python中,行尾冒号的作用是告诉Python接下来要创建一个新的语句块。因此,只要某一行以冒号结尾,它接下来的内容就应该有缩进。Python中有一个惯例:总是将语句块缩进4个空格。
(三)if-elif 语句
1.作用:应用if条件语句可以快速地实现程序的分支选择,但当分支比较多时,用if...elif...else语句来实现比较简便。
2.格式
if<条件1> :
<语句块1>
elif<条件2> :
<语句块2>
……
elif<条件N> :
<语句块N>
else :
<语句块N+1>
3.执行过程
四、循环结构的程序实现
(一)for 语句
1.概念
for循环语句是通过遍历某一序列对象来构建循环,循环结束的条件是对象遍历完成。
2.格式
for <变量> in <序列> :
<循环体>
[else:
<语句块>]
<变量>:每经过一次循环,就会得到序列中的一个元素,并通过循环体处理它
<序列>:通常是字符串、列表、range对象实例等
当序列中的元素全部遍历完时,程序会自动退出循环,继续执行else子句中的语句块(该else子句可选)。若循环过程中执行了循环体中的break语句,则程序会中途退出for语句,转而去执行for语句后面的语句(即使有else子句,该子句也不会被执行)。
3.range函数
①格式
range( start, end , steps )
start:起始值(可以不写(不写时默认从0开始));
end:终值(取不到)
steps:步长(默认1,可省略)
②功能
创建一个整数列表
③总结
在for循环中,当序列遍历完后,序列的长度就是for循环语句执行的次数。
(二)while 语句
在许多情况下,当一个循环执行之前,可能并不知道它需要执行的次数。这时,就可以使用while循环。
1.用法
当型循环,只要条件满足,就不断循环;否则,退出循环。
2.格式
while <条件> :
<循环体>
①表达式一般是一个关系表达式或一个逻辑表达式,表达式的值应该是一个逻辑值真(True)或假(False)。
②当表达式的值为真时,执行循环体语句;当表达式的值为假时,退出循环,执行循环体外的下一条语句(即while后面没有缩进的第一条语句)。
③每次循环都是执行完循环体语句后回到表达式处重新开始判断,重新计算表达式的值。一旦表达式的值为假就退出循环,为真时就继续执行循环体语句。
④循环体中必须有改变条件表达式值的语句,否则将成为死循环。
(三)循环嵌套
1.概念
多重循环,即“循环嵌套”。如果某一种循环语句中包含着自身或其他循环语句,就称为循环的嵌套”。for 循环或while 循环之间可以相互嵌套。
2.作用
无论是for循环还是while循环,都需要一个控制循环的变量来控制循环的执行。但是,有些循环仅靠循环变量自身的变化难以达到想要的控制效果,因此需要用到控制循环的跳转语句。实现控制循环的跳转需要用到break和continue两个关键字。其中,break是中断循环,continue是跳出本次循环体的执行。
五、函数与模块
(一)函数的构造及应用
1.定义函数的语法
def 函数名(参数集合) :
<函数体>
[return 函数值]
(二)模块的导入及应用
1.模块的导入
方法一:import 模块名1 [as 别名1], 模块名2 [as 别名2] 注:方括号里的可以省去
使用这种语法格式的 import 语句,会导入指定模块中的所有成员(包括变量、函数、类等)。当需要使用模块中的成员时,需用该模块名(或别名)作为前缀加上成员名。
方法二:from 模块名 import 成员名1 [as 别名1],成员名2 [as 别名2]
注:方括号里的可以省去
使用这种语法格式的 import 语句,只会导入模块中指定的成员,而不是全部成员。同时,当程序中使用该成员时,无需附加任何前缀。
2.math模块
Python math 模块:提供了许多对浮点数的数学运算函数。
名称
含义
math.e
自然常数e
math.pi
圆周率π
math.ceil(x)
对x向上取整,如x=1.2,返回2
math. floor(x)
对x向下取整,如x=1.2,返回1
math.pow(x,y)
指数运算,返回x的y次方
math.log(x)
对数运算,默认基底为e
math.sin(x)/math.cos(x)
正弦函数/余弦函数
math.tan(x)
正切函数
math.degrees(x)
弧度转换成角度
math.radians(x)
角度转换成弧度
math.sqrt(x)
求x的开方
3.random模块
Python random模块:Python中的random模块用于生成随机数。
名称
含义
random.random()
随机生成一个【0,1)范围内的实数
random.uniform(a,b)
随机生成一个【a,b】范围内的实数
random.randint(a,b)
随机生成一个【a,b】范围内的整数
random.choice(seq)
从序列的元素中随机挑选一个元素
如:random.choice(range(10)),即从0到9中随机挑选一个整数
random.sample(seq,k)
从序列中随机挑选k个元素
random.shuffle(seq)
将序列的所有元素随机排序
4.Image模块
Image模块是PIL库(Python Imaging Library)中的重要模块,引用它可以完成对图像的一些常用操作,比如获取图像尺寸和像素颜色、旋转图像或改变图像格式等。
3.3 简单算法及其程序实现
1.解析算法及其程序实现
解析算法的基本思想是指根据问题的前提条件与所求结果之间的关系,找出求解问题的数学表达式并通过表达式的计算来实现问题的求解。
在解析算法的程序实现过程中,首先要确保数学表达式的正确性,然后在程序中正确描述该数学表达式。
在解析算法的程序实现过程中,首先要确保数学表达式的正确性,然后在程序中正确描述该数学表达式。
2.枚举算法及其程序实现
①基本思想
把问题所有可能的解一一列举,然后判断每一个列举出的可能解是否为正确的解。
②解题思路
逐一列举可能解的范围,这个过程用循环结构实现。
对每一个可能解进行验证,这个过程用分支结构实现。
③程序实现
把问题所有可能的解一一列举,然后判断每一个列举出的可能解是否为正确的解。
操作
模块
程序
一一列举
循环结构
For语句/While语句
逐个比较
判断分支结构
If语句
④枚举算法的一般程序结构特点
枚举算法通常会包含循环结构。因为它需要遍历所有可能的情况。
与循环结构紧密配合的是条件判断语句。在循环内部,需要通过条件判断来检查当前枚举的情况是否满足问题的要求。
枚举算法需要明确枚举的范围。这个范围是根据问题的要求来确定的。
枚举算法一般是按照一定的顺序逐个检查可能的情况。
3.算法程序实现的综合应用
1 / 6
学科网(北京)股份有限公司
$