总结
分支结构
3. 循环结构 - 让代码写一次却可以执行多次
-
for循环
"""" for 变量 in 序列: 循环体 说明: for、in - 关键字、固定写法 变量 - 变量名(可以是没有定义过的变量的变量名,也可以是已经定义过的变量名) 序列 - 容器型数据类型的数据,常见序列:字符串,迭代器,生成器,列表,元组,字典,集合,range 等 : - 固定写法 循环体 - 和for保持一个缩进的一条或者多条语句。(循环体就是需要重复执行的代码) 执行过程: 让变量去序列中取值,一个一个的取,取完为止,每取一个值就执行一次循环体。 (序列中元素的个数决定for循环的循环次数) """
- 常用于for循环序列函数: range - 产生指定范围的数字序列(M,N,step必须为整数)
- range(N) - 产生0~N-1 的数字序列,例如:range(3) - 产生一个数字序列,里面的元素是0、1、2
- range(M,N) - 产生M~N-1的数字序列(M<N),例如:range(2,4) - 产生一个数字序列,里面元素是:2、3、
- range(M,N,step) - 产生[M~N)的数字序列,步长是step(每次增加step)
# 练习1:打印100以内所有的偶数 print('100以内所有的偶数:') for i in range(0, 101, 2): print(i, end=' ') # 练习2:统计100以内奇数的个数 num = 0 for i in range(1, 101, 2): num += 1 print('100以内奇数的个数:', num) # 练习3:统计100以内能被3整除的偶数的个数 num = 0 for i in range(0, 101, 6): num += 1 print('100以内能被3整除的偶数的个数:', num) # 练习4:计算1+2+3+...+100的和 my_sum = 0 for i in range(1, 101): my_sum += i print('1+2+3+...+100的和:', my_sum) # 练习5:计算100~200之间所有能被3整除但是不能被5整除的数和 sum1 = 0 for i in range(102, 200, 3): if i % 5: sum1 += i print('100~200之间所有能被3整除但是不能被5整除的数和是:', sum1)
- 常用于for循环序列函数: range - 产生指定范围的数字序列(M,N,step必须为整数)
-
while循环
""" 语法: while 条件语句: 循环体 说明: while - 关键字,固定写法 条件语句 - 任何有结果的表达式(除了赋值语句) : - 固定写法 循环体 - 和while保持一个缩进的一条或者多条语句(需要重复执行的代码) 执行过程: 先判断条件语句是否是True,如果是就执行循环体;执行完循环体,在判断条件语句是否为True,在执行循环体;以此类推,如果条件语句的结果是False则跳出循环 使用while循环套路: while True: 每次循环要做的事 if 循环结束的条件: break """ num = 3 while num > 0: print('hello world!') num -= 1
# 练习:提示用户输入密码,直到输入正确为止
password = input('请输入密码:')
while password != '123456':
password = input('密码错误,请重新输入密码:')
print('密码正确,结束。')
# 67
# 请输入(0~100): 50
# 小了,再大点儿!
# 请输入(0~100): 80
# 大了,再小点儿! // 恭喜你!猜对了!
count = 0
num = random.randint(0, 100)
input_num = int(input('请输入(0~100):'))
# 方法一
while True:
count += 1
if input_num == num:
print('恭喜你!猜对了!次数:', count, end='')
if count <= 1:
print('您的智商已突破宇宙边际!')
elif count <= 3:
print('您真是一个天才!')
elif count <= 5:
print('您的智商在普通人之上!')
elif count > 10:
print('您的智商令人堪忧!')
else:
print()
break
elif input_num > num:
print('大了,再小点儿!')
else:
print('小了,再大点儿!')
input_num = int(input('请输入(0~100):'))
# 方法二
count += 1
while input_num != num:
if input_num > num:
print('大了,再小点儿!')
else:
print('小了,再大点儿!')
input_num = int(input('请输入(0~100):'))
count += 1
print('恭喜你!猜对了!', end='')
if count <= 1:
print('您的智商已突破宇宙边际!')
elif count <= 3:
print('您真是一个天才!')
elif count <= 5:
print('您的智商在普通人之上!')
elif count > 10:
print('您的智商令人堪忧!')
else:
print()
-
for和while的选择
- 当循环次数不确定的时候使用while循环,循环次数不确定的时候最好使用for循环
-
循环关键字continue、break、else
-
continue - 结束当次循环(只能在循环体中使用)
-
执行循环体的时候如果遇到continue则直接结束该次循环,进入到下一循环的条件判断
for x in range(10, 18): if x % 3: continue print('x:', x)
-
-
break - 直接跳出循环(只能在循环中使用)
-
执行循环体的时候如果遇到break则直接跳出循环
for x in range(3): print('======') break print('++++++')
-
-
else
-
else的存在不影响原来的执行
-
else后面的代码段在循环自然死亡的时候会执行,循环因为遇到break而结束的时候else后面的代码不执行
""" 结构: for 变量 in 序列: 循环体 else: 代码段 while 条件语句: 循环体 else: 代码段 """ for x in range(10, 18, 3): print('hello world!') else: print('交待遗言')
-
-
作业
基础题
-
使用for和while循环输出 0~100内所有3的倍数。
for x in range(0, 100, 3): print(x, end=' ') print() num = 0 while num < 100: if not num % 3: print(num, end=' ') num += 1 print() num = 0 while num < 100: print(num, end=' ') num += 3
-
使用for和while循环输出100~200内个位数或者十位数能被3整除的数。
for x in range(100, 200): ge = x % 10 shi = x // 10 % 10 if not ge % 3 or not shi % 3: print(x, end=' ') print() num = 100 while num < 200: ge = num % 10 shi = num // 10 % 10 if not ge % 3 or not shi % 3: print(num, end=' ') num += 1
进阶题
-
使用循环计算
1*2*3*4*...*10
的结果。result = 1 for x in range(1, 11): result *= x print(result)
-
统计100以内个位数是2并且能够被3整除的数的个数。
num = 0 for x in range(2, 100, 10): if not x % 3: num += 1 print(num)
-
输入任意一个正整数,求他是几位数?
注意: 这儿不能使用字符串,只能用循环
count = 0 num = int(input('请输入一个正整数:')) while True: num = num // 10 count += 1 if num == 0: break print('该数是', count, '位数', sep='')
-
打印出所有的水仙花数,所谓水仙花数是指一个三位数,其各位数字⽴方和等于该数本身。例如:153是
⼀个⽔仙花数,因为
1³ + 5³ + 3³
等于 153。for x in range(100, 1000): ge = x % 10 shi = x // 10 % 10 bai = x // 100 if (ge**3 + shi**3 + bai**3) == x: print(x, end=' ')
挑战题
-
判断指定的数是否是素数(素数就是质数,即除了1和它本身以外不能被其他的数整除的数)
num = int(input('请输入一个数:')) if num <= 1: print('该数既不是质数也不是合数') else: for x in range(2, int(num**0.5+1)): if not num % x: print('该数是合数') break else: print('该数是质数')
-
求斐波那契数列列中第n个数的值:1,1,2,3,5,8,13,21,34… (这儿的n可以是任意正整数,可以通过输入来确定)
position = int(input('请输入斐波那契数列列中要得到值的位置:')) sum1 = 1 sum2 = 1 temp_position = position if position == 1 or position == 2: print('斐波那契数列列中第', position, '个数的值是:1', sep='') else: while temp_position > 2: temp = sum1 + sum2 sum1 = sum2 sum2 = temp temp_position -= 1 print('斐波那契数列列中第', position, '个数的值是:', sum2, sep='') # 优化 position = int(input('请输入斐波那契数列列中要得到值的位置:')) sum1 = 1 sum2 = 1 for x in range(2, position): sum1, sum2 = sum2, sum1+sum2 print('斐波那契数列列中第', position, '个数的值是:', sum2, sep='')
-
输出9*9口诀。 程序分析:分行与列考虑,共9行9列,i控制行,j控制列。
for i in range(1, 10): for j in range(1, 10): if j <= i: print(j, 'X', i, '=', i*j, end='\t') print() # 优化 for i in range(1, 10): for j in range(1, i+1): print(j, 'X', i, '=', i*j, end='\t') print()
-
这是经典的"百马百担"问题,有一百匹马,驮一百担货,大马驮3担,中马驮2担,两只小马驮1担,问有大,中,小马各几匹?(可以直接使用穷举法)
# 优化 for middle_horse in range(0, (100 // 2) + 1): # 中马最多50匹,因此取range(0,51) for small_horse in range(0, 101, 2): # 小马最多100匹,又因为两个小马驮一旦,因此小马必然为双数,否则总马匹数会是单数(优化) if small_horse + middle_horse > 100: break big_horse = 100 - small_horse - middle_horse if (big_horse * 3 + middle_horse * 2 + small_horse // 2) == 100: print('小马:', small_horse, ',中马:', middle_horse, ',大马:', big_horse) break