day6. while双项循环及for循环
一、双向循环经典练习
1.打印十行十列小星星(2个循环)
# j 外循环用来控制行数 j = 0 while j<10: # 打印一行十个星星 i = 0 while i <10: # 写上循环的逻辑 print("*",end="") i+=1 # 打印换行 print() j+=1
2.打印十行十列小星星(隔列换色小星星,两个循环)
i = 0 while i<10: # 打印隔列换色星星 j = 0 while j < 10: if j % 2 == 0: print("★",end="") else: print("☆",end="") j+=1 # 打印换行 print() i+=1
3.打印十行十列小星星(隔行换色小星星,两个循环)
"""外层循环动一次,内层循环动10次,外层循环动的慢,内层循环动的快""" i = 0 while i<10: # 打印隔列换色星星 j = 0 while j < 10: if i % 2 == 0: print("★",end="") else: print("☆",end="") j+=1 # 打印换行 print() i+=1
4.99乘法表
方式一
# i控制行 i = 1 while i <= 9: # j 控制列 # 打印表达式 j = 1 while j<=i: # 打印表达式 谁*谁=谁 %2d 默认居右显示 print("%d*%d=%2d " % (i,j,i*j),end="") j+=1 # 打印换行 print() i+=1
方式二
print("<=====>") # i控制行 i = 9 while i >= 1: # j 控制列 # 打印表达式 j = 1 while j<=i: # 打印表达式 谁*谁=谁 %2d 默认居右显示 print("%d*%d=%2d " % (i,j,i*j),end="") j+=1 # 打印换行 print() i-=1
5. 99乘法表按方式一纵轴向右折叠
i = 1 while i<=9: # 1.打印空格 """ 第一行循环8组空格 8~1 是循环8组空格 第二行循环7组空格 7~1 是循环7组空格 ... 第八行循环1组空格 1 是循环1组空格 第九行 不需要空格 所以 k>0 """ k = 9 - i while k>0: print(" " , end="") k -= 1 # 2.打印表达式 """""" j = 1 while j<=i: # 打印表达式 谁*谁=谁 %2d 默认居右显示 print("%d*%d=%2d " % (i,j,i*j),end="") j+=1 # 3.打印换行 print() i+=1
6. 99乘法表按方式二纵轴向右折叠
i = 9 while i>=1: # 1.打印空格 """ 第一行循环8组空格 8~1 是循环8组空格 第二行循环7组空格 7~1 是循环7组空格 ... 第八行循环1组空格 1 是循环1组空格 第九行 不需要空格 所以 k>0 """ k = 9 - i while k>0: print(" " , end="") k -= 1 # 2.打印表达式 j = 1 while j<=i: # 打印表达式 谁*谁=谁 %2d 默认居右显示 print("%d*%d=%2d " % (i,j,i*j),end="") j+=1 # 3.打印换行 print() i-=1
7. 求吉利数字100 ~ 999 666 888 111 222 333 444 ... 123 789 567 765 432
方法一
""" 个位:987 % 10 = 7 十位:987 // 10 % 10 = 8 百位:987 // 100 = 9 """ i = 100 while i<1000: gewei = i % 10 shiwei = i // 10 % 10 baiwei = i // 100 if gewei == shiwei and shiwei == baiwei: print(i) #123 elif shiwei == gewei-1 and shiwei == baiwei+1: print(i) #765 elif shiwei == gewei+1 and shiwei == baiwei-1: print(i) i+=1
方法二
i = 100 while i<1000: strvar = str(i) # "123" baiwei = int(strvar[0]) shiwei = int(strvar[1]) gewei = int(strvar[-1]) if gewei == shiwei and shiwei == baiwei: print(i) #123 elif shiwei == gewei-1 and shiwei == baiwei+1: print(i) #765 elif shiwei == gewei+1 and shiwei == baiwei-1: print(i) i+=1
8.百钱买百鸡
""" 公鸡x 母鸡y 小鸡z 公鸡1块钱1只,母鸡3块钱一只,小鸡5毛钱一只 问: 用100块钱买100只鸡,有多少种买法? """
""" 穷举法:把数拿出来,一个一个试 x{1,2} y{3,4} z{5,6} x+y+z = 10 列出来 1+3+5 = 9 不要 1+3+6 = 10 要 1+4+5 = 10 要 1+4+6 = 11 不要 2 + 3 + 5 = 10 要 2 + 3 + 6 = 11 不要 2 + 4 + 5 = 11 不要 2 + 4 + 6 = 12 不要 """ """ # 两个条件同时满足 x+y+z = 100 x*1 + y*3 + z*0.5 = 100 """ # 公鸡 x = 0 count = 0 while x <= 100: # y母鸡 y = 0 while y <= 33: # z小鸡 z = 0 while z <= 100: if x+y+z == 100 and x*1 + y*3 + z*0.5 == 100: count += 1 print(x,y,z) z+=1 y+=1 x += 1 print(count)
二、pass
if 10 == 10: print(123) while True: pass
三、break 终止当前循环
1、打印1~10 遇到5就终止循环
i = 1 while i <=10 : if i == 5: break print(i) i+=1
例:
# break 终止的是当前循环 i = 1 while i <= 3: j = 1 while j<=3: if j == 2: break print(i,j) j+=1 i+=1
四、continue 跳过当前循环,从下一次循环开始
1、打印1~10 跳过5
i = 1 while i<=10: if i == 5: # 需手动自增加1. 当执行continue时,后面的代码不执行,跳到while循环的条件判断处,会造成死循环 i+=1 continue print(i) i+=1
2、打印1~ 100 所有不含有4的数字
方式一
""" //可以取到一个数的高位 % 可以取到一个数的低位 46 // 10 = 4 46 % 10 = 6 """
i = 1 while i<=100: if i // 10 == 4 or i % 10 == 4: i+=1 continue print(i) i+=1
方式二
i = 1 while i <= 100: strvar = str(i) if "4" in strvar: i+=1 continue print(i) i+=1
五、for 循环
# for主要用于遍历数据而提出,while在遍历数据时,有局限性 # for 变量 in 可迭代对象: # code1 # code2 # 可迭代对象(容器类型数据,range对象,迭代器)
# 遍历字符串 container = "today is a good day" # 遍历列表 container = ["jack","kxq","aaa","bbb"] # 遍历元组 container = (1,2,3,45) # 遍历集合 container = {"jack","kxq","xiaoming","aaa","bbb"} # 遍历字典 (遍历字典时,只遍历键) container = {"ww":"one","msr":"two","mh":"three"} for i in container: print(i) # 遍历不等长的二级容器 container = [["jack","kxq","aaa","bbb"],("ooo","ppp")] for i in container: # print(i) for j in i: print(j)
1、变量的解包
a,b = 1,2 a,b = [3,4] a,b = {"a":5,"b":6} print(a,b)
2、遍历等长的二级容器
container = [("a","b","c") , ("aa","bb","cc") , ("aaa","bbb","ccc") ] for a,b,c in container: print(a,b,c) # a,b,c = ("a","b","c") # a,b,c = ("aa","bb","cc") # a,b,c = ("aaa","bbb","ccc")
3、range对象
""" range(开始值,结束值,步长) 结束值本身取不到,取到结束值之前的那个数 """
# 只有一个值 0~9 for i in range(10): print(i) # 只有两个值 for i in range(3,11): print(i) # 只有三个值 for i in range(1,10,3): print(i) # 1,4,7 #1 (1+3)=>4 (4+3)=>7 (7+3)=>10取不到 # 倒序打印10 ~ 1 for i in range(10,0,-1): print(i) # 10 9 8 7 6 .... 1
总结
""" while : 较为复杂的逻辑 for : 数据的遍历 while 和 for 部分代码可以互相转换 """
六、练习
''' 1.利用if语句写出猜大小的游戏: 设定一个理想数字比如:66, 让用户三次机会猜数字,如果比66大,则显示猜测的结果大了; 如果比66小,则显示猜测的结果小了; 只有等于66,显示猜测结果正确,退出循环。 最多三次都没有猜测正确,退出循环,并显示‘都没猜对,继续努力’。 2.使用while循环分别打印字符串s="asdfer"中每个元素 3.使用for循环对s="abcdefg"进行循环,每次打印的内容是每个字符加上sb, 例如:asb, bsb,csb,...gsb。 4.完成要求: 用户可持续输入(while循环) 输入A,则显示走大路回家,然后在让用户进一步选择: 是选择公交车,还是步行? 选择公交车,显示10分钟到家,并退出整个程序。 选择步行,显示20分钟到家,并退出整个程序。 输入B, 则显示走小路回家,并退出整个程序。 输入C, 则显示绕道回家,然后在让用户进一步选择: 是选择游戏厅玩会,还是网吧? 选择游戏厅,则显示 ‘一个半小时到家,爸爸在家,拿棍等你。’并让其重新输入A,B,C选项。 选择网吧,则显示‘两个小时到家,妈妈已做好了战斗准备。’并让其重新输入A,B,C选项。 4.写代码:计算 1 - 2 + 3 - 4 + ... + 99 中除了88以外所有数的总和? 5.(升级题)打印菱形小星星 ''' * *** ***** ******* ********* *********** *********** ********* ******* ***** *** * ''' '''
""" num = 66 times = 1 while times <= 3: num = input("请输入猜测的数字") if num.isdecimal(): num = int(num) if num > 66: print("猜测的结果大了") elif num < 66: print("猜测的结果小了") else: print("猜对了") break else: print("输入有误") if times == 3: print("都没猜对,继续努力") times +=1 """ """ num = 66 times = 1 sign = True while sign: num = input("请输入猜测的数字") if num.isdecimal(): num = int(num) if num > 66: print("猜测的结果大了") elif num < 66: print("猜测的结果小了") else: print("猜对了") break else: print("输入有误") if times == 3: print("都没猜对,继续努力") sign = False times +=1 """
# 2.使用while循环分别打印字符串s="asdfer"中每个元素 s="asdfer" i = 0 while i < len(s): print(s[i]) i+=1
# 3.使用for循环对s="abcdefg"进行循环,每次打印的内容是每个字符加上sb, # 例如:asb, bsb,csb,...gsb。 s = "abcdefg" for i in s: print(i + "sb")
""" 4.完成要求: 用户可持续输入(while循环) 输入A,则显示走大路回家,然后在让用户进一步选择: 是选择公交车,还是步行? 选择公交车,显示10分钟到家,并退出整个程序。 选择步行,显示20分钟到家,并退出整个程序。 输入B, 则显示走小路回家,并退出整个程序。 输入C, 则显示绕道回家,然后在让用户进一步选择: 是选择游戏厅玩会,还是网吧? 选择游戏厅,则显示 ‘一个半小时到家,爸爸在家,拿棍等你。’并让其重新输入A,B,C选项。 选择网吧,则显示‘两个小时到家,妈妈已做好了战斗准备。’并让其重新输入A,B,C选项。 """ """ sign = True while sign: choice = input("请输入A,B,C选项") if choice.upper() == "A": choice2 = input("是选择公交车,还是步行?") if choice2 == "公交车": print("10分钟到家") break elif choice2 == "步行": print("20分钟到家") break elif choice.upper() == "B": print("走小路回家") break elif choice.upper() == "C": print("绕道回家") choice = input("是选择游戏厅玩会,还是网吧?") if choice == "游戏厅": print("一个半小时到家,爸爸在家,拿棍等你。") elif choice == "网吧": print("两个小时到家,妈妈已做好了战斗准备。") """
i = 1 total = 0 while i < 100: if i == 88: i+=1 continue if i % 2 == 0: total -= i else: total += i i+=1 print(total) total = 0 for i in range(1,100): if i == 88 : continue if i % 2 == 0: total -= i else: total += i print(total)
''' * *** ***** ******* ********* *********** *********** ********* ******* ***** *** * ''' """ n = 11 13 => 7 11 => 6 9 => 5 ... n => n // 2 + 1 星星 和 行数之间的关系 hang = n // 2 + 1 1 => 5 2 => 4 3 => 3 4 => 2 5 => 1 6 => 0 当前行i 和 空格之间的关系 kongge = hang - i 空格数 = 总行数 - 当前行 1 -> 1 2 -> 3 3 -> 5 4 -> 7 5 -> 9 当前行i 和 星星之间的关系 xingxing = 2*i - 1 """ n = 13 hang = n // 2 + 1 i = 1 while i <= hang: # 1 ~ 6 # 打印空格 print(" " *(hang - i),end="" ) # 打印星星 print("*" * (2*i - 1),end="") # 打印换行 print() i+=1 i = hang while i > 0: # 打印空格 print(" " *(hang - i),end="" ) # 打印星星 print("*" * (2*i - 1),end="") # 打印换行 print() i-=1 n = 11 hang = n // 2 + 1 i = 1 while i <= hang: # 1 ~ 6 # 打印空格 k = hang - i while k>0: print(" ",end="") k-=1 # 打印星星 xingxing = 2*i - 1 j = 1 while j <=xingxing: print("*",end="") j+=1 # 打印换行 print() i+=1 i = hang while i > 0: # 打印空格 k = hang - i while k>0: print(" ",end="") k-=1 # 打印星星 xingxing = 2*i - 1 j = 1 while j <=xingxing: print("*",end="") j+=1 # 打印换行 print() i-=1 print(abs(-1)) # 6 5 4 3 2 1 1 2 3 4 5 6 # 12 # abs(-6) = 6 """ # 行数和空格之间的关系 -6 -> 5 -5 -> 4 -4 -> 3 -3 -> 2 -2 -> 1 -1 -> 0 0 -> 跳过 # 行数 和 星星之间的关系 n = 11 -6 -> 1 -5 -> 3 -4 -> 5 13 - abs(i) * 2 13 - 12 = 1 13 - 10 = 3 13 - 8 = 5 """ # abs用来算绝对值 n = 29 hang = n // 2 + 1 for i in range(-hang,hang+1): if i == 0: continue # 打印空格 print(" " * (abs(i)-1) , end="") # 打印星星 print("*" * (n+2 - abs(i) * 2) )