(共49张PPT)
分析历史气温数据
--设计批量数据算法
用列表表示和计算平均气温
范欣丽
项目八
项目学习目标02.了解访问批量数据的常用程序模式01.了解批量数据在程序中的表示方法03.了解定义和使用函数的方法04.了解“自顶向下,逐步求精”的程序设计方法,以及嵌套、模块化思想1.用列表表示和计算平均气温2.用模块化设计批量计算平均气温1.用列表表示和计算平均气温批量数据列表调用函数如何计算平均气温?
用列表表示和计算平均气温
问题:已知气象台观测得到郑州4月12号4次气温值为17.21.24.25,求该日日平均气温
思考
1.分析问题(数学思路):日平均气温(17+21+24+25)/4
用列表表示和计算平均气温
2.分析问题(Python思路):知识点
批量数据:一组数据类型相同的数据对象。数据类型可以简单类型,也可以复杂的构造类型。
程序设计语言支持批量数据的存储,用统一的名称管理一批数据,在内存上的存储空间是连续的。
一批量数据只需定义一个名称,程序的通用性更强。而一个单变量只可以控制一个数据,使用单变量,程序可控制的数据的个数是固定的。
使用方便,可以组织循环控制结构,通过控制下标的值控制一批数据。
批量数据的优势
用列表表示和计算平均气温
python语言中使用列表表示批量数据
列表用[ ]表示。其中每一项可以使任意数据类型的数据项,各数据项之间用逗号分隔。
通过赋值运算可以创建列表:
L=[ ] #创建一个空的列表L
例如:表述爱好批量数据为hobby=["篮球","羽毛球","看书","旅游","音乐"]
各项数据按顺序排列,并允许按下标访问。下标是一个整数,通常从0开始,有效范围从0到列表长度减1。hobby[0]表示列表中第一个数据项篮球,hobby[4]表示列表中第i+1即第5个数据项音乐
用列表表示和计算平均气温
任务一:用Python计算日平均气温
数学思路:日平均气温(17+21+24+25)/4
(1)使用算术表达式计算代码实现
t_Day=[17,21,24,25]
avg = (t_Day[0]+t_Day[1]+t_Day[2]+t_Day[3])/4
print(avg)
用列表表示和计算平均气温
t_Day = [17,21,24,25]
avg = sum(t_Day)/len(t_Day)
print(avg)
(2)使用内置函数计算代码实现
内置函数sum的作用是求列表中数值数据的累加和,len的作用是求列表中数据个数,有统计功能的内置函数还有max、min等
内置函数
Python列表的基本操作
操作 描 述
x1+x2 连接列表x1和x2,生成新列表
x*n 将列表x复制n次,生成新列表
x[i] 引用列表x中下标为i的列表成员,i从0开始计数
x[i:j] 引用列表x中下标从i到j-1的子列表
x[i:j:k] 引用列表x中下标从i到j-1、间隔为k的子列表
len(x) 计算列表x中成员的个数
max(x) 列表x中最大数据项
min(x) 列表x中最小数据项
v in x 检测v是否在列表x中,返回布尔值
v not in x 检测v是否不在列表x中,返回布尔值
Python列表的方法
方法 描 述
list.append(x) 把一个数据项添加到列表的结尾,相当于a[len(a):]=[x]
list.extend(L) 将一个列表中的所有数据项都添加到另一个列表中,相当于a[len(a):]=L
list.insert(i,x) 在指定位置插入一个数据项,如a.insert(0,x)会插入到整个列表之前,而a.insert(len(a),x)相当于a.append(x)
list.remove(x) 删除列表中值为x的第一个数据项;如果没有这样的数据项,就返回Flse
用列表表示和计算平均气温
任务二:用Python计算月平均气温多解
计算月平均值可以使用内置函数吗?
思考
用列表表示和计算平均气温
s=0
n=0
for i in range(len(t_day)):
s=s+t_day[i]
n=n+1
avg=s/n
print(avg)
下标访问完整代码
对批量数据中数据项的访问方法:下标访问和迭代访问。
1.列表命令:下标访问法
(下标访问法是通过变量i表示下标值,该值从0到len(L)-1的变化,依次访问数据项L[i])
语句写法:
for i in range(0,len(L))
访问L[i]
用列表表示和计算平均气温
2.列表命令:序列迭代访问法
(迭代访问列表中的每一个数据项x)
语句写法:
for x in L
访问x
s=0
n=0
for x in t_day:
s=s+x
n=n+1
avg=s/n
avg
迭代访问完整代码
用列表表示和计算平均气温
3.使用用户自定义函数计算平均值
用户自定义函数:由用户自己编写的、能够实现独立功能的语句块。
完整写法:t_day=[34,32,33,33,35,36,36,35,34,33,32,32,32,31,32,32,30,30,31,32,29,31,32,30,26,26]
def getavg(L)
return sum(L)/len(L)
avg=getavg(t_day)
print(avg)
4.读取文件中的数据列表 :
若要长期存储并反复使用,可将其保存在文件夹中,在通过程序指令来读取文件中的数据
列表=list(open(文件名))
函数的定义中一般都包含return语句,return语句的作用是结束函数的执行,返回一个值作为函数的返回值。返回值可以是简单的整型数据、浮点型、文本数据等,也可以是复杂的列表等,还可以没有返回值,仅仅结束函数的执行。
新命令:函数调用指令
函数定义的一般格式如下:
def 函数名(<参数>):
函数体
用列表表示和计算平均气温
函数的定义
例如,要计算7!+11!-10!,可以定义一个函数,用于计算n!。要计算n!,必须有一个参数接受n的值,并有一个返回值作为计算结果。
用列表表示和计算平均气温
2.用模块化设计批量计算平均气温文本数据表示、字符串、枚举算法文本数据的表示和操作
打印字符
①英文大小写字母a-z和A-Z;
②数字字符0-9;
③标点符号和一些键盘上的常见符号。
控制字符
回车、制表符、退格等。
转义字符 描述 转义字符 描 述
\\ 反斜杠符号 \t 横向制表符
\’ 单引号 \r 回车
\” 双引号 \n 换行
\a 响铃 \(在行尾时) 续行符
\b 退格(Backspace) \f 换页
\e 转义 \oyy 八进制数yy代表的字符,如:\o12代表换行
\000 空 \xyy 十六进制数yy代表的字符,如:\x0a代表换行
字符串常量的使用
前后必须一致。其中单引号、双引号可以表示单行字符串两者作用一致。
使用单引号时,双引号可以是字符串的一部分;
使用双引号时,单引号可以是字符串的一部分;
使用三引号可以表示单行或多行字符串。
文本数据的表示和操作
>>> print("I'm a programmer.")
I'm a programmer.
>>> print('She said: "you are right".')
She said:"you are right".
>>> print('''三引号中可以有'单引号'
可以有"双引号"
还可以换行''')
三引号中可以有'单引号'
可以有"双引号"
还可以换行
1.Python字符串运算符
操作符 描 述
x+y 连接两个字符串x和y
x*y 复制n次字符串x
x in s 包含判断,判断字符串x是否为字符串s的子串,是则返回true,否则返回false
Python语言提供了对字符串类型的数据的通用操作,以实现对字符串的连接、复制、包含、索引
s1 = "hello"
s2 = "Python"
s3 = s1+s2 # x+y 连接两个字符串x和y
print(s3)
s4 = 3*s2 # x*y 复制n次字符串x
print(s4)
print(s2 in s4) # xin s 包含判断,判断字符串x是否为字符串s的子串,是则返回true, 否则返回false
2.Python字符串索引
Python语言提供了对字符串类型的数据的通用操作,以实现对字符串的连接、复制、包含、索引
操作符 描 述
str[i] 索引操作,返回下标位置的一个字符
str[N:M] 切片,返回从str[N]到str[M-1]的子串
len(x) 返回字符串x的长度
str(x) 返回任意类型x所对应的字符串
索引操作返回字符串的单个字符
格式:变量名[索引下标]
st = "hello Python"
print(st[0],st[4])#正索引(左到右)下标从0开始
H o
print(st[-1],st[-6])#负索引(右到左)下标从-1开始
n P
Python字符串索引
切片操作返回字符串中一段字符子串
格式:变量名[下标1:下标2:步长]
st="hello,python"#定义一个字符串
print(st[0:10:3])#下标从0到10(不包含10)位置,步长为3
【说明】
下标1表示切片的起始位置,默认值为0
下标2表示切片终止位置(但不包括这个位置)
步长表示访问字符的间隔,默认值为1
Python字符串切片
字符串对象的常用方法
常用方法 描述
s.capitalize() 返回首字符大写后的字符串,s对象不变
s.lower() 返回所有字符改小写后的字符串,s对象不变
s.upper() 返回所有字符改大写后的字符串,s对象不变
s.strip() 返回删去前后空格后的字符串,s对象不变
s.replace(old,new) 将s对象中所有的old子串用new子串代替
s.count(sub[,start[,end]]) 计算子串sub在s对象中出现的次数, start和end定义起始位置
s.find(sub[,start[,end]]) 计算子串sub在s对象中首次出现的位置
s.join(iterable) 将序列对象中所有字符串合并成一个字符串,s对象为连接分隔符
s.split(sep=None) 将s对象按分隔符sep拆分为字符串列表,默认为空格
字符串对象的常用方法示例
>>> s=' hello python '
>>> t=s.strip()
>>> s
' hello Python '
>>> t
'hello Python'
>>> t.find('he')
0
>>> s.count('h')
2
>>> L=t.split()
>>> L
['hello','Python']
>>> t1=",".join(L)
>>> t1
'hello,Python'
任务三判断车牌号
练一练:
#删除标号,并在标号的位置补充代码
s=input("请输入车牌号:")
n=len(s)
x=s[n-1]
while x<"0" or x>"9":
n=n-1
x=s[n-1]
if int(x)%2==0:
print("双号")
else:
print("单号")
#删除标号,并在标号的位置补充代码
s=input("请输入车牌号:")
n=~~(s)#返回字符串s的长度
x=~~~~~ #从字符串s的下标0开始,截取到下标为n-2
while x<"0" or x>"9":
~~~~~~~ #将n调整到下一个位置
x=s[n-1]
if ~~~~~~~~: #判断单双号
print("双号")
else:
print("单号")
模块化设计的思想
“自顶向下、逐步求精”
先进行顶层设计,再对各部分进行细化。这种程序设计方法使程序的结构变得更加清晰,程序的调试也更加简单。
大多数解决现实问题的程序都比本书中介绍的程序要大得多,对于一个复杂的问题通常需采取“分而治之”的策略,也就是模块化设计的思想。
常见算法---枚举算法
试密码的过程
列举
判断
把问题所有的可能解一一列举出来,并判断每一个列举出的可能解是否为正确的解。----枚举算法p122
数字拨到000 尝试按下解锁按钮
数字拨到001 尝试按下解锁按钮
2. 数字拨到002 尝试按下解锁按钮
3. 数字拨到003 尝试按下解锁按钮
4. 数字拨到004 尝试按下解锁按钮
.
.
.
100.数字拨到099 尝试按下解锁按钮
.
.
.
枚举算法写法
for <变量> in <序列>:
if <条件>:
print(变量)
range( )函数
格式:range([start,]stop[,step])
功能:创建一个整数列表。
参数:起始值,终值,步长。
注意:终值不包括。
例1 逢7跳过游戏:
第1位同学从1开始数起,依次每人尽快数下一个数,凡是遇到7的倍数(如7、21等)或是数字中带7的数字(如17、71等),就要喊“过”说错或卡住了即被淘汰,这样一直数到100为止。
用枚举算法寻找问题多解
算法分析
把问题所有的可能解一一列举出来, 并对每一个可能解进行判断,是真正解的时候输出“过”
例1 逢7跳过游戏:
第1位同学从1开始数起,依次每人尽快数下一个数,凡是遇到7的倍数(如7、21等)或是数字中带7的数字(如17、71等),就要喊“过”说错或卡住了即被淘汰,这样一直数到100为止。
用枚举算法寻找问题多解
逢7跳过游戏思路
一一列举:
1~100
逐个检验:
是7的倍数或包含7
7的倍数
个位为7
十位为7
for i in range(1,101):
i%7==0
i%10==7
i//10==7
用枚举算法寻找问题多解
用枚举算法寻找问题多解
逢7跳过游戏代码实现
枚举算法的思想和步骤
逐一列举
(循环结构)
逐一判断
(分支结构)
易于理解
容易证明
既不遗漏
也不重复
确定枚举对象、范围和判定条件。
逐一枚举可能的解,并验证每个解是否为正确的解。
1、确定枚举范围
1~100
2、确定判断条件
是7的倍数或包含7
3、编程求解
用枚举算法寻找问题多解
我国古代数学家张丘建在他的《算经》中提出了著名的“百钱买百鸡”问题:鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一;百钱买百鸡,问翁、母、雏几何?每种最少一只
数量条件:母鸡数量+公鸡数量+小鸡数量=100只
价格条件:3*母鸡数量+5*公鸡数量+1/3*小鸡数量=100元
例2、百钱买百鸡
5钱
3钱
1钱
确定枚举对象 确定枚举范围 确定判断条件
公鸡(5元) 1≤x<20 ① x+y+z=100
②5x+3y+ z=100
母鸡(3元) 1≤y<33 小鸡(1/3元) 1≤z<100 用枚举算法寻找问题多解
百钱买百鸡思路
百钱买百鸡代码试一试
百钱买百鸡代码实现
枚举算法小结
确定枚举对象、范围和判定条件
逐一枚举可能的解——循环结构
逐一验证是否为正确的解——分支结构
减少枚举对象和枚举范围,提高算法效率
1
2
3
4
单元总结
总结
请给自己评价 是/否,几颗星
能调用自定义函数吗
枚举算法理解了吗
只给题意要求能自己独立写程序吗
自我评价单
下课