循环
- 让代码重复执行(代码写一遍,运行的时候可以执行多次)
while与for循环的选择
-
for 循环:循环次数确定的时候使用
-
while循环:循环次数不确定的时候使用(程序员在写代码的时候没有办法通过任何方式来确定循环次数)
for循环
语法
for 变量 in 序列:
循环体
说明
- for | in | : - 关键字,固定写法
- 变量 - 写一个变量名(可以是已经定义过的,也可以没有定义过的);
- 序列 - 容器型数据类型对应的数据,常见序列:字符串、列表、元组、字典、集合、迭代器、生成器、range等;
- 循环体 - 和for保持一个缩进的语句或语句块,是需要重复执行的代码;
- for循环的循环次数和序列中的元素个数有关;
执行过程
-
让变量依次取序列中的值,取完为止,每取一个值执行依次循环体;
for x in 'abc123': print(x, 'hello') """ x = 'a':print(x,'hello') -> print('a','hello') x = 'b':print(x,'hello') -> print('b','hello') x = 'c':print(x,'hello') -> print('c','hello') ... x = '3':print(x,'hello') -> print('3','hello') """
range函数
- 产生指定范围的数字序列
range(N)
-
产生[0,N)的数字序列,步长为1;
# 用法1:产生0开始步长为1的数字序列 for i in range(5): print(i) # 用法2:直接的控制循环次数 for i in range(4): print('hello')
range(M,N)
-
产生[0,N)的数字序列,步长为1;
print('=====for i in range(-5, 5)=====') for i in range(-5, 5): print(i, end=' ')
range(M,N,step)
-
产生[M,N)的数字序列,步长为step;
print('=====for i in range(5, -5,-1)=====') for i in range(5, -5, -1): print(i, end=' ') print() print('=====for i in range(20, 0, -3)=====') for i in range(20, 0, -3): print(i, end=' ')
练习
-
打印100以内所有的偶数
for i in range(2, 101, 2): print(i, end=' ')
-
打印100-200中所有个位数是3的数
# 方法1: for i in range(103, 200): if i % 10 == 3: print(i, end=' ') # 方法2: for j in range(103, 200, 10): print(j, end=' ')
-
打印所有的水仙花数
for i in range(100, 1000): a = i % 10 b = i % 100 // 10 c = i // 100 if a ** 3 + b ** 3 + c ** 3 == i: print(i, end=' ')
-
统计100以内偶数的个数
num = 0 for i in range(0, 100, 2): num += 1 print(num)
-
统计100以内能被3整除的偶数的个数
# 方法1: num = 0 for i in range(0, 100, 3): if i % 2 == 0: num += 1 print(num) # 方法2: num = 0 for i in range(0, 100, (2*3)): num += 1 print(num)
-
统计1+2+3+…+100的和
num = 0 for i in range(1, 101): num += i print(num)
-
计算所有水仙花数的和
num = 0 for i in range(100, 1000): a = i % 10 b = i % 100 // 10 c = i // 100 if a ** 3 + b ** 3 + c ** 3 == i: num += i print(num)
while循环
语法
while 条件语句:
循环体
说明
- while | : - 关键字固定写法;
- 条件语句 - 任何有结果的表达式;(只有赋值语句不行);
- 循环体 - 和while保持一个缩进的一条或者多条语句是需要重复执行的代码;
执行过程
-
先判断条件语句是否为True,如果为True就执行循环体;
-
执行完循环体再判断条件是否为True,如果依旧为True就再次执行循环体,直到条件语句为False;
while循环控制循环次数的原则:让条件经历过指定次数后由True变成False;
练习
-
让用户不断输入数字,直到输入的数字为0
# 方法1: num = 1 while num: num = int(input('请输入数字:')) if num == 0: print('输入正确') # 方法2: value = '' while value != '0': value = input('请输入:') # 方法3: while True: num = int(input('请输入数字:')) if num == 0: print('输入正确!') break
循环关键字 - continue 、break、else
- continue 和 break 只能出现在循环体中;
continue
-
结束一次循环/结束当次循环;
-
如果在执行循环体的时候遇到了continue,那么当次循环结束,直接进入下一次循环;
for i in range(10): # 当i为偶数的时候直接跳过打印i的值 if i % 2 == 0: continue print(i)
break
-
结束整个循环;
-
如果在执行循环体的时候遇到了break,整个循环直接结束;
for i in range(1, 10): # 当i为偶数的时候直接结束循环 if i % 2 == 0: break print(i)
-
有了break的while循环
""" while True: 需要重复执行的操作 if 循环结束的条件: break """ while True: value = input('请输入:') if value == '0': print('输入正确') break
else
-
else结构的存在不影响原来循环的执行;
-
当循环正常执行完成,执行else代码段;
-
当循环被break终止,else代码段不会被执行;
# 完整的for循环 for 变量 in 序列: 循环体 else: 代码段 # 完整的while循环 while 条件语句: 循环体 else: 代码段
-
例子:
for x in range(4): print(x, '====') if x == 2: break else: print('else正常执行')
课后习题
基础题
-
使用for和while循环输出 0~100内所有3的倍数。
# for for i in range(0, 100, 3): print(i) # while num = 0 while True: print(num) num += 3 if num >= 100: break
-
使用for和while循环输出100~200内个位数或者十位数能被3整除的数。
# for for i in range(100, 201): if i % 10 % 3 == 0 or i // 10 % 10 % 3 == 0: print(i) # while num = 100 while True: if num % 10 % 3 == 0 or num // 10 % 10 % 3 == 0: print(num) num += 1 if num == 200: break
-
统计100~200中十位数是5的数的个数
num = 0 for i in range(100, 200): if i // 10 % 10 == 5: num += 1 print(num)
-
打印50~150中所有能被3整除但是不能被5整除的数
for i in range(50,151): if i % 3 == 0 and i % 5 != 0: print(i)
-
计算50~150中所有能被3整除但是不能被5整除的数的和
sum1 = 0 for i in range(50,151): if i % 3 == 0 and i % 5 != 0: sum1 += i print(sum1)
进阶题
-
使用循环计算
1*2*3*4*...*10
的结果。sum1 = 1 for i in range(1, 11): sum1 *= i print(sum1)
-
统计100以内个位数是2并且能够被3整除的数的个数。
for i in range(100): if i % 10 == 2 and i % 3 ==0: print(i)
-
输入任意一个正整数,求他是几位数?
注意: 这儿不能使用字符串,只能用循环
num = int(input('请输入一个正整数:')) num1 = 0 while num: num //= 10 num1 += 1 if num == 0: break print('输入的数为:', num1, ' 位数')
-
打印出所有的水仙花数,所谓水仙花数是指一个三位数,其各位数字⽴方和等于该数本身。例如:153是
⼀个⽔仙花数,因为
1³ + 5³ + 3³
等于 153。for i in range(100, 1000): a = i % 10 b = i % 100 // 10 c = i // 100 if a ** 3 + b ** 3 + c ** 3 == i: print(i, end=' ')
挑战题
-
判断指定的数是否是素数(素数就是质数,即除了1和它本身以外不能被其他的数整除的数)
num = int(input('请输入一个整数:')) for i in range(2, num): if num % i == 0: print('这个数 ', num, ' 不是素数') break else: print('这个数 ', num, ' 是素数')
-
求斐波那契数列列中第n个数的值:1,1,2,3,5,8,13,21,34… (这儿的n可以是任意正整数,可以通过输入来确定)
# 列表 n = int(input('请输入裴波纳契数列要求的第几项:')) nl = [1] * n for i in range(2, n): nl[i] = nl[i - 1] + nl[i - 2] print(nl[n-1]) # 通项公式 n = int(input('请输入裴波纳契数列要求的第几项:')) print(int((1/5**0.5)*(((1+5**0.5)/2)**n-((1-5**0.5)/2)**n))) # 循环 num = int(input('请输入裴波纳契数列要求的第几项:')) n1 = 1 n2 = 1 if num <= 2: print(n1) else: for i in range(num-2): n = n1 + n2 n1 = n2 n2 = n print(n)
-
输出9*9口诀。 程序分析:分行与列考虑,共9行9列,i控制行,j控制列。
for i in range(1, 10): for j in range(1, i + 1): # print(i, '*', j, '=', i * j, end=' ') print('{}*{}={:<3}'.format(i, j, i * j), end=' ') if i == j: print()
# 结果 1*1=1 2*1=2 2*2=4 3*1=3 3*2=6 3*3=9 4*1=4 4*2=8 4*3=12 4*4=16 5*1=5 5*2=10 5*3=15 5*4=20 5*5=25 6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36 7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49 8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64 9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81
-
这是经典的"百马百担"问题,有一百匹马,驮一百担货,大马驮3担,中马驮2担,两只小马驮1担,问有大,中,小马各几匹?(可以直接使用穷举法)
for big in range(101):
for middle in range(101):
for small in range(101):
if big + middle + small == 100 and 3 * big + 2 * middle + small / 2 == 100:
print('大马:', big, '中马:', middle, '小马:', small)
# 结果
大马: 2 中马: 30 小马: 68
大马: 5 中马: 25 小马: 70
大马: 8 中马: 20 小马: 72
大马: 11 中马: 15 小马: 74
大马: 14 中马: 10 小马: 76
大马: 17 中马: 5 小马: 78
大马: 20 中马: 0 小马: 80