(本科)第5章 循环控制结构ppt课件.pptx
课程主讲人:(本科)第5章 循环控制结构ppt课件Chap5 Program Control StructureDepartment of Computer Science and TechnologyDepartment of University Basic Computer TeachingNanjing UniversityNanjing University程序控制结构3顺序选择循环sequence structureselection structurerepetition structureNanjing University顺序结构4Nanjing University顺序结构5AB# Filename: seq.pymystring = Hello, World! print(mystring)File一个入口一个出口Nanjing University5.1.1 赋值语句6Nanjing University赋值语句7普通赋值r = 2增量赋值m /= 5链式赋值b = a = a + 1多重赋值p , r = 3 , 5Nanjing University多重赋值 多重赋值的基本形式8变量1, 变量2, , 变量n = 表达式1, 表达式2, , 表达式n name, age = Niuyun, 18 nameNiuyun age18SourceNanjing University多重赋值的本质9 name, age = Niuyun, 18 temp = Niuyun, 18 temp(Niuyun, 18) name, age = temp nameNiuyun age18Source元组打包Tuple packing序列解包Sequence unpackingNanjing University多重赋值10 x = 3 y = 5 x, y = y, x x5 y3Source语法糖syntactic sugarNanjing University5.1.2 基本输入和输出语句11Nanjing University输入/输出12输入输出input()print()Nanjing University输入函数input()13输入语句的一般形式:x = input(输入提示)返回值类型是strNanjing University输入input()函数14 x = input(Enter an integer between 0 and 10: )Enter an integer between 0 and 10: 3 x3 x = int(input(Enter an integer between 0 and 10: )Enter an integer between 0 and 10: 3 x3 y = float(input(Enter the price of the apples: )Enter the price of the apples: 4.5 y4.5Source返回值类型:strint()函数float()函数Nanjing University输入input()函数15 z = eval(input(Enter a number: )Enter a number: 3 z3 z = eval(input(Enter the price of every apple: )Enter the price of every apple: 3.5 z3.5 z = eval(input(Enter the price of the apples: )Enter the price of the apples: 6 + 3 * 4 z18Source返回值类型:streval()函数Nanjing University输入input()函数16 a, b, c = eval(input(Please enter the numbers(a,b,c): )Please enter the numbers(a,b,c): 12,34,567 a12 b34 c567Source返回值类型:streval()函数Nanjing University输入input()函数17 a, b, c = eval(input(Please enter the numbers(a,b,c): )Please enter the numbers(a,b,c): 12,34,567 nums(12, 34, 567) lst = eval(input(Please enter a list: )Please enter a list: 12, 34, 567 lst12, 34, 567Source返回值类型:streval()函数Nanjing University输出函数print()18输出语句的一般形式:print(对象1, 对象2, , 对象n, sep = , end = n )输出到标准输出设备 sep表示输出对象之间的分隔符,默认为空格 参数end的默认值为n,表示print()函数输出完成后自动换行Nanjing University输出函数print()19 print(1, 2, 3)1 2 3 print(1, 2, 3, sep = ,)1,2,3 a, b = 454, 213 print(a, *, b, =, sep = , end = ); print(a*b)454*213=96702Source改变sep的值Nanjing University输出函数print()20格式化输出形式: print(格式字符串 % (对象1, 对象2, , 对象n) print(格式化模板.format(对象1, 对象2, , 对象n))Nanjing University输出函数print()格式化模板21 0 is taller than 1.format(Xiaoma, Xiaowang) Xiaoma is taller than Xiaowang. age, height = 21, 1.758 print(Age:0: print(:,.format(2*100)1,267,650,600,228,229,401,496,703,205,376Source 参数参数的的位置位置: : 对齐说明符对齐说明符 符号说明符符号说明符 最小宽度说明符最小宽度说明符 . .精度说明符精度说明符 类型说明符类型说明符 Nanjing University符号符号描述描述b b二进制,以2为基数输出数字o o八进制,以8为基数输出数字x x十六进制,以16为基数输出数字,9以上的数字用小写字母(类型符为X时用大写字母)表示c c字符,将整数转换成对应的Unicode字符输出d d十进制整数,以10为基数输出数字f f定点数,以定点数输出数字e e指数记法,以科学计数法输出数字,用e(类型符是E时用大写E)表示幂+m.nf+m.nf 输出带符号(若格式说明符中显式使用了符号“+”,则输出大于或等于0的数时带“+”号)的数,保留n位小数,整个输出占m列(若实际宽度超过m则突破m的限制)05d05d右对齐,左边的0表示用0填充左边,右边的数字5表示输出项宽度为5左对齐,默认用空格填充右边,= y: t = xelse: t = yFile检查条件“x = y”是否满足,若满足则取x否则取y赋给变量tNanjing Universityelse 语句三元运算符33条件表达式(也称三元运算符)的常见形式如下所述:x if C else y# Filename: elsepro-2.pyx = eval(input(Please enter the first number: )y = eval(input(Please enter the second number: )if x = y: t = xelse: t = yFilet = x if x = y else yNanjing University5.2.3 elif子句34Nanjing Universityelif 语句35if 表达式表达式1: 语句序列语句序列1elif 表达式表达式2: 语句序列语句序列2elif 表达式表达式N-1: 语句序列语句序列N-1else: 语句序列语句序列N语 法 表达式2为True时执行的代码块语句序列2 表达式N为True时执行的代码块语句序列N-1 语句序列N是以上所有条件都不满足时执行的代码块语句序列NNanjing Universityelif 语句36多分支结构流程图语句序列2True表达式1语句序列1TrueFalse表达式2False表达式n-1TrueFalseFalse语句序列n-1语句序列nNanjing University例5.3 猜数字游戏程序随机产生一个0300之间的整数,玩家竞猜,若猜中则提示Bingo,若猜大了提示Too large,否则提示Too small# Filename: 5-3-1.pyfrom random import randintx = randint(0, 300)num = int(input(Please input a number between 0300: )if num = x : print(Bingo!)elif num x: print(Too large, please try again.)else: print(Too small, please try again.)File37Nanjing University5.2.4 嵌套的if语句38Nanjing University嵌套的if语句391 : if 表达式表达式1:2 : if 表达式表达式2:3 : 语句语句序列序列14 : else:5 : 语句语句序列序列26 : else:7 : if 表达式表达式3:8 : 语句序列语句序列39 : else:10: 语句语句序列序列4语 法Nanjing University例5.3 猜数字游戏改写代码# Filename: 5-3-1.pyfrom random import randintx = randint(0, 300)num = int(input(Please input a number between 0300: )if num = x : print(Bingo!)elif num x: print(Too large, please try again.)else: print(Too small, please try again.)File40# Filename: 5-3-2.pyfrom random import randintx = randint(0, 300)num = int(input(Please input a number between 0300: )if num = x : print(Bingo!)else: if num x: print(Too large, please try again.) else: print(Too small, please try again.)FileNanjing University例5.4 符号函数(sign function)41 请分别用if-elif-else结构和嵌套的if结构实现符号函数(sign function),符号函数的定义:Nanjing University例5.4 符号函数42# prog5-4-1.pyx = eval(input(Enter a number: )if x 0: sgn = -1elif x = 0: sgn = 0else: sgn = 1print (sgn = :.0f.format(sgn)File# prog5-4-2.pyx = eval(input(Enter a number: )if x != 0: if x 0: sgn = -1 else: sgn = 1else: sgn = 0print (sgn = :.0f.format(sgn)FileNanjing University循环结构43Nanjing University循环 循环结构是满足一个指定的条件,每次使用不同的数据对算法中的计算或处理步骤完全相同的部分重复计算若干次的算法结构,也称为重复结构44010302Nanjing University5.3.1 while语句45Nanjing Universitywhile 循环46While 表达式表达式: 语句语句序列(循环体)序列(循环体)语法 当表达式值为True时执行语句序列代码块 继续判断表达式的值是否为True, 若是则继续执行循环体, 如此周而复始,直到表达式的值为False或发生异常时停止循环的执行 若循环体什么都不执行,用pass语句表示表达式Nanjing Universitywhile 语句47表达式True语句序列Falsewhile语句流程图有几点要注意:while语句是先判断再执行,所以循环体有可能一次也不执行;循环体中需要包含能改变循环变量值的语句,否则表达式的结果始终是True的话会造成死循环;要注意语句序列的对齐,while语句只执行其后的一条或一组同一层次的语句。Nanjing University例5.5 计算1+2+100的值# prog5-5.pys = 0i = 1while i = 100: s += i i += 1print(1+2+100 = :d.format(s)Source481+2+100 = 5050Input and Output经典累加问题Nanjing University例5.6 求两个正整数的最大公约数和最小公倍数。49# prog5-6.py# -*- coding: gb2312 -*-x = eval(input(Enter the first number: )y = eval(input(Enter the second number: )z = x * yif x 1e-8: s += x k += 2 sign *= -1 x = sign / ks *= 4print(pi = :.15f.format(s)Sourcepi = 3.141592633590251Input and Outputmath模块中pi值等于Nanjing University5.3.2 for语句51Nanjing Universityfor 循环52for 变量变量 in 可迭代对象可迭代对象:语句语句序列序列语 法 遍历一个数据集内的成员 在列表解析中使用 生成器表达式中使用可以明确循环的次数 序列 迭代器 其他可迭代对象(字典的键、文件的行)可迭代对象Nanjing Universityfor 循环53取可迭代对象中的元素可以取到元素语句序列无元素可取for语句流程图可迭代对象指可以按次序迭代(循环)的对象,包括序列、迭代器(iterator)以及其他可以迭代的对象如字典的键和文件的行等。执行时变量取可迭代对象中的一个值,执行语句序列,再取下一个值,执行语句序列Nanjing Universityfor 循环54 aList = 1, 2, 3 for item in aList: print(item)123 for item in enumerate(a, b, c): print(item)(0, a)(1, b)(2, c)SourceNanjing University猜数字游戏55程序随机产生一个0300间的整数, 玩家竞猜,允许猜多次,系统给出 “猜中”、“太大了”或太 小了”的提示。# Filename: guessnum2.pyfrom random import randintx = randint(0, 300)for count in range(5): digit = int(input(Please input a number between 0300: ) if digit = x : print(Bingo!) elif digit x: print(Too large, please try again.) else: print(Too small, please try again.)FileNanjing University可迭代对象 和 迭代器可迭代对象 能用for循环遍历的对象都可被称为可迭代对象 字符串、列表等迭代器 属于可迭代对象,for语句会通过_iter_()方法获得对象的迭代器,并通过_next_()获取下一个元素56Nanjing University可迭代对象 和 迭代器57 aList = 1, 2, 3 for item in aList: print(item)123Source i = iter(1, 2, 3) next(i)1 next(i) 2 next(i)3 next(i) Traceback (most recent call last): File , line 1, in i._next_()StopIterationSourceNanjing University可迭代对象 和 迭代器58 from collections import Iterable, Iterator # 导入Iterable和Iterator类 isinstance(aList, Iterable)True isinstance(aList, Iterator)False isinstance(iter(aList), Iterator)True isinstance(enumerate(abc), Iterator)TrueSourceNanjing University可迭代对象 和 迭代器 迭代器转换成可迭代对象59 enumerate(abc) list(enumerate(abc)(0, a), (1, b), (2, c)SourceNanjing Universityfor语句的迭代60序列项01序列索引02序列项和索引03字典的键04文件的行05Nanjing Universityfor 语句迭代序列项迭代61 s = I, love, Python for word in s: print(word, end = )I love Python for i in range(1, 5): print(i * i)14916SourceNanjing Universityfor 语句迭代序列索引迭代62 s = I, love, Python for i in range(len(s): print(si, end = )I love PythonSourceNanjing Universityfor 语句迭代序列项和索引迭代63 courses = Maths, English, Python scores = 88, 92, 95 for c, s in zip(courses, scores): print(0 1:d.format(c, s)Maths - 88English - 92Python - 95SourceNanjing Universityfor 语句迭代其他迭代64 d_stock = AXP: 78.51, BA: 184.76, CAT: 96.39 for k, v in d_stock.items(): print(0:3: 1.format(k, v)AXP: 78.51 BA: 184.76CAT: 96.39 for k in d_stock.keys():print(k, d_stockk)AXP 78.51BA 184.76CAT 96.39SourceNanjing University迭代中修改迭代对象65lst = 1, 2, 4, 3, 5for item in lst: if item % 2 = 0: lst.remove(item)print(lst)File在遍历可变对象的在遍历可变对象的同时删除了列表元素,影响同时删除了列表元素,影响了迭代器的了迭代器的迭代机制,迭代机制,要避免使用,类似的还有要避免使用,类似的还有poppop、insertinsert和和appendappend等等操作操作Nanjing University例5.8 求斐波纳契(Fibonacci)数列前20项斐波纳契数列:0,1,1,2,3,5,8,13,21,34,55,89,144,66# prog5-8.pyf = 0 * 20f0, f1 = 0, 1for i in range(2, 20): fi = fi-1 + fi-2print(f)File0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181Input and OutputNanjing University例5.9 统计英语句子中单词词频从键盘输入一个英文句子,除单词和空格外句子中只包含“,”、“.”、“”、“”和“!”这几个标点符号,统计句子中包括的每个单词(将句中大写全部转换成小写)的词频并将结果存入字典中并输出。67Nanjing University例5.9 统计英语句子中单词词频68# prog5-9.pys = input(Enter an English sentence: )s = s.lower()sList = s.split()sDict = for item in sList: if item-1 in ,.!: item = item:-1 if item not in sDict: sDictitem = 1 else: sDictitem += 1print(sDict)FileEnter an English sentence: A friend in need is a friend indeed.a: 2, friend: 2, in: 1, need: 1, is: 1, indeed: 1Input and OutputNanjing University用字典统计词频 利用字典作词频统计的程序写法在Python中很常用69for item in sList: 处理标点 sDictitem = sDict.get(item, 0) + 1Nanjing University例5.10 输出公司代码和股票价格假设已有若干道琼斯工业指数成分股公司某个时期的财经数据,包括公司代码、公司名称和股票价格: stockList =(AXP, American Express Company, 78.51), (BA, The Boeing Company, 184.76), (CAT, Caterpillar Inc., 96.39)从数据中获取公司代码和股票价格对并输出。70Nanjing University例5.10 输出公司代码和股票价格71# prog5-10-1.pystockList =(AXP, American Express Company, 78.51), (BA, The Boeing Company, 184.76), (CAT, Caterpillar Inc., 96.39)aList = bList = for i in len(sotckList): aStr = stockListi0 bStr = stockListi2 aList.append(aStr) bList.append(bStr)stockDict = dict(zip(aList,bList)print(stockDict)FileCAT: 96.39, BA: 184.76, AXP: 78.51Input and Output用序列索引迭代Nanjing University例5.10 输出公司代码和股票价格72# prog5-10-2.pystockList =(AXP, American Express Company, 78.51), (BA, The Boeing Company, 184.76), (CAT, Caterpillar Inc., 96.39)stockDict = for data in stockList: stockDictdata0 = data2print(stockDict)FileCAT: 96.39, BA: 184.76, AXP: 78.51Input and Output用序列迭代Nanjing University5.3.3 嵌套循环73Nanjing University循环嵌套 while语句和for语句可以嵌套自身语句结构,也可以相互嵌套,可以呈现各种复杂的形式。74Nanjing University75# prog5-11.pyi, j, k = 0, 0, 0 # i,j,k分别代表五分、两分和一分的数量count = 0for i in range(21): for j in range(51): k = 100 - 5 * i - 2 * j if k = 0: #k是一分,可以是任意个 count += 1print(count = :d.format(count)Filecount = 541Input and Output可以用while替换forNanjing University例5.12 两个列表的新组合从两个列表中分别选出一个元素,组成一个元组放到一个新列表中,要求新列表中包含所有的组合76# prog5-12.pyresult = pdlList = C+, Java, PythoncreditList = 2, 3, 4for pdl in pdlList: for credit in creditList: result.append(pdl, credit)print(result)File(C+, 2), (C+, 3), (C+, 4), (Java, 2), (Java, 3), (Java, 4), (Python, 2), (Python, 3), (Python, 4)Input and OutputNanjing University例5.13 杨辉三角的输出根据输入的行数n,输出n行杨辉三角形,杨辉三角形的排列规律是每一行两端都是1,其余各数都是上一行中与此数最相邻的两数之和,它最早由北宋数学家贾宪发现,收录在南宋数学家杨辉的著作中。5行杨辉三角形如下所示:11 11 2 11 3 3 11 4 6 4 177Nanjing University例5.13 杨辉三角的输出78# prog5-13.pyn = int(input(enter the number of layers: )lstPre = 1print(lstPre)for i in range(n-1): lstTemp = lstPre: lstTemp.insert(0, 0) lstTemp.append(0) lstNext = for i in range(len(lstTemp) - 1): lstNext.append(lstTempi + lstTempi+1) lstPre = lstNext: print(lstNext)Fileenter the number of layers: 711, 11, 2, 11, 3, 3, 11, 4, 6, 4, 11, 5, 10, 10, 5, 11, 6, 15, 20, 15, 6, 1Input and OutputNanjing University例5.14 编程计算1+2!+3!+50!的和79# prog5-14-1.pys = 0for i in range(1, 51): product = 1 for j in range(2, i+1): product *= j s += productprint(s)File# prog5-14-2.pyitem, s = 1, 0for i in range(1, 51): item *= i s += itemprint(s)File31035053229546199656252032972759319953190362094566672920420940313Input and OutputNanjing University运行时间结果对比用time模块中的clock()函数测试这两个程序的执行时间,将以下两条语句分别加到prog5_14_1和prog5_14_2的前后:某次测试的运行时间结果对比为:可以看出,用一重循环的递推法效率要高于二重循环的非递推法80t0 = time.clock()print(time.clock() - t0, seconds process time)Nanjing University5.3.4 break, continue语句81Nanjing Universitybreak 语句break语句终止当前循环,转而执行循环之后的语句# Filename: breakpro.pys = 0i = 1while i 10: break i += 1print(i = 0:d, sum = 1:d.format(i, s)File82s是1+2+3+不断累加的和,当i等于5时s第一次大于10,执行break语句跳出while循环语句,继而去执行print语句i=5, s=15Input and Output循环非正常结束Nanjing Universitybreak 语句“while i 10: break i += 1print(i = 0:d, sum = 1:d.format(i, s)File83while i = 36: breakprint(i, j)File84两重循环Nanjing University例5.15 输出2100之间的素数,每行显示5个素数(prime): 只能被1和n自身整除的正整数n(13是素数,6不是素数)。素数判断算法:若n不能被2n-1范围内的任一个整数整除n就是素数,否则n不是素数如果发现n能被某个整数整除可立即停止继续判断n是否能被范围内其他整数整除。852 3 5 7 1113 17 19 23 2931 37 41 43 4753 59 61 67 7173 79 83 89 97Input and Output2n/2orNanjing University例5.15 输出2100之间的素数,每行显示5个# Filename: 5-15.pyfrom math import sqrtj = 2 ; count = 0while j =100: i = 2 k= sqrt(j) while i k: count += 1 if count % 5 = 0: print(j, end = n) else: print(j, end = ) j += 1File862 3 5 7 1113 17 19 23 2931 37 41 43 4753 59 61 67 7173 79 83 89 97Input and Outputfor 循环和breakNanjing Universityfor 循环和breakfrom math import sqrtfor i in range(2,101): k = int(sqrt(i); flag = 1 for j in range(2,k+1): if i%j = 0: flag = 0 break if ( flag ): count += 1 if count % 5 = 0: print(i, end = n) else: print(i, end = )File872 3 5 7 1113 17 19 23 2931 37 41 43 4753 59 61 67 7173 79 83 89 97Input and OutputNanjing Universitycontinue 语句在while和for循环中,continue语句的作用: 跳过循环体内continue后面的语句,并开始新的一轮循环 while循环则判断循环条件是否满足 for循环则判断迭代是否已经结束88Nanjing Universitycontinue语句89程序的功能是对于在120之间的数,当它是3的倍数时执行print(i, end = )函数调用语句,当它不是3的倍数时执行continue语句,跳过其后的print()函数调用语句继续执行下一轮循环for i in range(1,21): if i % 3 != 0: continue print(i, end = )File3 6 9 12 15 18Input and OutputNanjing Universitycontinue语句循环中的break:90循环中的continue:for i in range(1,21): if i % 3 != 0: continue print(i, end = )Filefor i in range(1,21): if i % 3 != 0: break print(i, end = )Filebreakcontinuebreak语句跳出所有轮循环continue语句则是跳出本轮循环没有任何输出输出1-20之间所有3的倍数“3 6 9 12 15 18”Nanjing Universitycontinue语句循环中的替代continue:91循环中的continue:for i in range(1,21): if i % 3 != 0: continue print(i, end = )Filefor i in range(1,21): if i % 3 = 0: print(i, end = )FileNanjing University5.3.5 循环结构中的else子句92Nanjing University循环中的else子句循环中的else子句: 如果循环代码从break处终止,跳出循环 正常结束循环,则执行else中代码93Nanjing University例5.16 输入一个整数,并判断其是否为素数94# Filename: 5-16.pyfrom math import sqrtnum = int(input(Please enter a number: )j = 2while j x: print(Too large, please try again.) else: print(Too small, please try again.) print(Enter y if you want to continue.) go = input() print(go)else: print(I quit and byebye!)FilePlease enter a number between 0300: 123Too small, please try again.Enter y if you want to continue: yPlease enter a number between 0300: 200Too large, please try again.Enter y if you want to continue: yPlease enter a number between 0300: 150Too small, please try again.Enter y if you want to continue: nI