控制结构 循环语句
控制结构 循环语句
for循环:回顾 。语法 for in : ·语义:循环标志变量var取遍序列sequence中的每 个值;对var所取的每个值执行一遍循环体body. Lu Chaojun,SJTU 2
Lu Chaojun, SJTU 2 for循环:回顾 • 语法 for in : • 语义:循环标志变量var取遍序列sequence中的每 个值;对var所取的每个值执行一遍循环体body
编程实例:求平均值 ·需求:输入若干个数,求平均值 ·显然可用熟悉的累积器算法模式 ·算法: 输入数值个数n 初始化累积变量sum=0 循环n次 输入数值x 累加到sum 输出平均值sum/n o 翻译到Python:avgl.py Lu Chaojun,SJTU 3
编程实例:求平均值 • 需求:输入若干个数,求平均值. • 显然可用熟悉的累积器算法模式 • 算法: 输入数值个数n 初始化累积变量sum=0 循环n次 输入数值x 累加到sum 输出平均值sum/n • 翻译到Python: avg1.py Lu Chaojun, SJTU 3
while循坏 ·avgl.py的缺点:需要用户输入n -不适合事先不知道n的场合 ·不知道n则不能用确定的计数循环for 。不确定的条件循环:while 一语法 while : 一语义:只要条件成立就反复执行循环体,当条 件不成立则执行下一条语句. Lu Chaojun,SJTU 4
Lu Chaojun, SJTU 4 while循环 • avg1.py的缺点:需要用户输入n – 不适合事先不知道n的场合 • 不知道n则不能用确定的计数循环for • 不确定的条件循环:while – 语法 while : – 语义:只要条件成立就反复执行循环体;当条 件不成立则执行下一条语句. Lu Chaojun, SJTU
while循环的特点 ·循环前测试条件 一若不满足,则循环体一次都不执行 ·循环体影响下一次条件测试 no 条件 一否则导致无穷循环 -例如:for循环改写成while循环 yes i=0 while i<10: 循环体 print i i=1+1 人若忘了最后一条语句会怎样? Lu Chaojun,SJTU 5
Lu Chaojun, SJTU 5 while循环的特点 • 循环前测试条件 – 若不满足,则循环体一次都不执行 • 循环体影响下一次条件测试 – 否则导致无穷循环 – 例如:for循环改写成while循环 i = 0 while i < 10: print i i = i + 1 ©若忘了最后一条语句会怎样? 条件 循环体 yes no
常见循环模式:交互循环 ·用户根据需要来循环执行程序某一部分 例如:avg2.py -不输入n,由程序自己数输入的值的个数 一设置一个是否继续循环的标志 初始化sum=0 初始化count=0 初始化moredata=yes while moredata =yes: 输入数据x 累积sum=sum+x 累积count=count+1 询问用户moredata? 输出平均值sum/count Lu Chaojun,SJTU 6
常见循环模式:交互循环 • 用户根据需要来循环执行程序某一部分 • 例如:avg2.py – 不输入n,由程序自己数输入的值的个数 – 设置一个是否继续循环的标志 初始化sum = 0 初始化count = 0 初始化moredata = yes while moredata = yes: 输入数据x 累积sum = sum + x 累积count = count + 1 询问用户moredata? 输出平均值sum/count Lu Chaojun, SJTU 6
常见循环模式:哨兵循环 ·avg2.py不断要用户输入moredata,很烦人. ·改进:设置一个特殊数据值(称为哨兵)作为终止 循环的信号 一对哨兵唯一的要求就是能与普通数据区分 。模式: 输入第一个数据 while该数据不是哨兵: 处理该数据 输入下一个数据 09 编程实例:avg3.py(负数哨兵),avg4.py(空串哨兵) Lu Chaojun,SJTU 7
常见循环模式:哨兵循环 • avg2.py不断要用户输入moredata,很烦人. • 改进:设置一个特殊数据值(称为哨兵)作为终止 循环的信号. – 对哨兵唯一的要求就是能与普通数据区分 • 模式: 输入第一个数据 while 该数据不是哨兵: 处理该数据 输入下一个数据 • 编程实例:avg3.py(负数哨兵),avg4.py(空串哨兵) Lu Chaojun, SJTU 7
常见循环模式:文件循环 ·avgl~avg4都是交互式输入数据的 一不便处理大数据量 一一个输入错误即导致需要重新运行程序 ·改进:建立一个数据文件 一数据处理应用中广泛使用 ·模式: 打开数据文件f for line in freadlines() 处理每个数据 0 编程实例:avg5.py Lu Chaojun,SJTU 8
常见循环模式:文件循环 • avg1~avg4都是交互式输入数据的 – 不便处理大数据量. – 一个输入错误即导致需要重新运行程序. • 改进:建立一个数据文件. – 数据处理应用中广泛使用 • 模式: 打开数据文件f for line in f.readlines(): 处理每个数据 • 编程实例:avg5.py Lu Chaojun, SJTU 8
常见循环模式:EOF哨兵循环 ·一次性读入 -readlines()一次性把文件的所有行都读入内存 一但内存是很有限的!可能无法运行 ·分批读入 - readline()每次读入一行 需要哨兵(如:空行),标志文件结束(EOF) line f.readline() while1ine!=ww: 处理该行 line f.readline() - 编程实例:avg6.py Lu Chaojun,SJTU 9
常见循环模式:EOF哨兵循环 • 一次性读入 – readlines()一次性把文件的所有行都读入内存 – 但内存是很有限的!可能无法运行. • 分批读入 – readline()每次读入一行 – 需要哨兵(如:空行),标志文件结束(EOF) line = f.readline() while line != “”: 处理该行 line = f.readline() – 编程实例:avg6.py Lu Chaojun, SJTU 9
常见循环模式:嵌套循环 ·嵌套循环:一个循环语句的循环体内有另一个循 环语句 ·用途:遍历一维空间的元素只需一个循环变量, 遍历二维空间的元素需要两个循环变量, 遍历n维空间的元素需要n个循环变量. ·例如:假设数据文件的每一行有多个数据 编程实例:avg7.py 顶层循环仍如avg6.py 一但每次顶层循环内,需要另一个循环来处理该行上的 多个数据 Lu Chaojun,SJTU 10
常见循环模式:嵌套循环 • 嵌套循环:一个循环语句的循环体内有另一个循 环语句. • 用途:遍历一维空间的元素只需一个循环变量, 遍历二维空间的元素需要两个循环变量,……, 遍历n维空间的元素需要n个循环变量. • 例如:假设数据文件的每一行有多个数据. • 编程实例:avg7.py – 顶层循环仍如avg6.py – 但每次顶层循环内,需要另一个循环来处理该行上的 多个数据 Lu Chaojun, SJTU 10