循环结构
循环: 让代码重复执行。(代码写一遍,程序可执行多次)
1. for
for 循环可以遍历任何可迭代对象,如一个列表或者一个字符串、range()函数等。
1.1 语法结构
语法:
for 变量 in 序列:
循环体
else:
代码段参数说明:
for、 in – 关键字、固定写法;
变量 – 写一个变量名。(可以是定义过的,也可是没定义的);
序列 – 容器型数据类型对应的数据,常见序列:字符串、列表、元组、字典、集合、迭代器、生成器、range;
:(冒号) – 固定写法;
循环体 – 和for保持一个缩进的一条或者多条语句; 就是需要重复执行的代码;
else – 可选项,循环完成后执行,存在不影响循环执行;
代码段 – 循环完后所执行的代码,不写else则不存在;执行过程:
让变量去序列中取值,一个一个的取,取完为止,每取一个值执行一次循环体。取完后如果存在else则执行下面的代码段。
for循环的循环次数和序列中元素的个数有关。
实例1 - 语法使用
以下 for 实例中使用了 break 语句(用法在下面章节),break 语句用于跳出当前循环体:
sites = ["Baidu", "Google","Runoob","Taobao"]
for site in sites:
if site == "Runoob":
print("条件达到,跳出循环则不会执行else!")
break
print("循环数据 " + site)
else:
print("没有循环数据!")
print("完成循环!")
'''
---输出结果---
循环数据 Baidu
循环数据 Google
条件达到,跳出循环则不会执行else!
完成循环!
'''
实例2 - 练习
以下使用range()函数来生成序列(用法在后面章节);以下将使用到的变量:count = count1 = num = sum = 0
# 练习1. 20以内的偶数
print('---打印100以内的偶数:---')
for i in range(0, 20, 2):
print(i, end='\t')
"""
输出结果:
---打印100以内的偶数:---
0 2 4 6 8 10 12 14 16 18
"""
# 练习2. 统计100内偶数的个数
count = count1 = num = sum = 0
for i in range(0, 100, 2):
count += 1
print('100以内偶数的个数有:',count)
"""
输出结果:
100以内偶数的个数有: 50
"""
# 练习3. 计算1+2+3+...+100的和
for i in range(1,101):
num += i
print('1~100所有数的和:',num)
"""
输出结果:
1~100所有数的和:5050
"""
# 练习4. 计算所有水仙花数的和
for num in range(100, 1000):
a = num // 100
b = num // 10 % 10
c = num % 10
shu = a**3 + b**3 + c**3
if shu == num:
sum += num
print(shu, end=' ')
print('所有水仙花的和:', sum)
"""
输出结果:
153 370 371 407 所有水仙花的和: 1301
"""
2. range()函数
range() 函数返回的是一个可迭代对象(类型是对象),而不是列表类型, 所以打印的时候不会打印列表。
range()函数 - 产生指定范围的数字序列
2.1 语法结构
语法:
range(stop)
range(start, stop[, step])参数说明:
start: 计数从 start 开始。默认是从 0 开始。例如range(5)等价于range(0, 5);
stop: 计数到 stop 结束,但不包括 stop。例如:range(0, 5) 是[0, 1, 2, 3, 4]没有5
step:步长,默认为1。例如:range(0, 5) 等价于 range(0, 5, 1)
实例
# 练习2:打印100-200间个位是3的数
print('\n---打印个位数是3的数:---')
for i in range(103, 200, 10):
print(i, end=' ')
"""
执行结果:
---打印个位数是3的数:---
103 113 123 133 143 153 163 173 183 193
"""
3. while
3.1 语法结构
语法:
while 条件语句:
循环体
else:
代码段参数说明:
while - 关键字,固定写法;
条件语句 - 任何有结果的表达式(赋值除外);
: - 固定写法;
循环体 - 和while保持一个缩进的一条或多条语句,需重复执行的代码;
else - 可选项,while条件不成立时执行,存在不影响循环执行;
代码段 - 条件不成立执行,跟随else执行共生;执行过程:
先判断条件,条件成立执行循环体,执行完循环体再次判断条件,成立则再次执行循环体,依次类推,直到条件不成立结束,如果结束存在else语句,执行依次else下的代码段
while循环控制次数的原则:让条件经历过指定次数后由True变成False
实例
user = input('请输入接头暗号: ')
while user != '有内鬼终止交易':
print(user)
user = input('请输入接头暗号: ')
else:
print('交易终止')
"""
执行结果:
请输入接头暗号: 土豆哪里挖
土豆哪里挖
请输入接头暗号: 一挖一麻袋
一挖一麻袋
请输入接头暗号: 有内鬼终止交易
交易终止
"""
4.循环关键字
作用:用于退出循环,只能用于循环体
continue - 结束本次后续循环体开始执行下次循环,会继续执行else语句
break - 结束运行整个循环,并且也不会执行else语句
4.1 continue
continue - 结束一次循环/结束当次循环
如果在执行循环体的时候遇到了continue,那么当次循环结束,直接进入下一次循环
4.2 break
break - 结束整个循环
如果在执行循环体的时候遇到了break,整个循环直接结束
实例
# 练习1:输出0-10数字,5和8不输出 (continue应用)
for x in range(10):
if x == 5 or x == 8:
continue
print(x, end='\t')
"""
执行结果:
0 1 2 3 4 6 7 9
"""
# 练习2:输出0-10数字,到3时停止输出 (break应用)
for x in range(10):
print(x, end='\t')
if x == 3:
break
"""
执行结果:
0 1 2 3
"""
# 练习3:随意输入,直到输入0结束程序 (break应用)
while True:
value = input('请输入:')
if value == '0':
break
"""
执行结果:
请输入:学习
请输入:随便
请输入:0
进程已结束,退出代码为 0
"""
5. while和for的选择
for循环:循环次数确定的时候使用
while循环:循环次数不确定的时候使用
练习题
基础题
-
使用for和while循环输出 0~100内所有3的倍数。
# 1)for print("100内所有3的倍数有:") for i in range(0, 100, 3): print(i, end='\t') # 2) while count = 0 print("\n100内所有3的倍数有:") while count <= 100: print(count, end='\t') count += 3
-
使用for和while循环输出100~200内个位数或者十位数能被3整除的数。
# 1)for print("100~200内个位或十位能被3整除的数有:") for i in range(100, 200): if i%10 % 3 == 0 or i//10%10 % 3 == 0: print(i, end='\t') # 2) while count = 100 print("\n100~200内个位或十位能被3整除的数有:") while count < 200: if count % 10 % 3 == 0 or count // 10 % 10 % 3 == 0: print(count, end='\t') count += 1
-
统计100~200中十位数是5的数的个数
count = 0 for i in range(150, 160): if i // 10 % 10 == 5: count += 1 print('100~200中十位数是5的数的个数有:', count)
-
打印50~150中所有能被3整除但是不能被5整除的数
print('50-150中被3整除不被5整除的数:') for i in range(51, 150, 3): if i % 5 != 0: print(i, end='\t')
-
计算50~150中所有能被3整除但是不能被5整除的数的和
sum1 = 0 print('50-150中被3整除不被5整除的数的和:') for i in range(51, 150, 3): if i % 5 != 0: sum1 += i print(sum1)
进阶题
-
使用循环计算
1*2*3*4*...*10
的结果。product = 1 for i in range(2, 11): product *= i print('1*2*3*4*...*10的结果为: ',product)
-
统计100以内个位数是2并且能够被3整除的数的个数。
count = 0 for i in range(2, 100, 10): if i % 3 == 0: count += 1 print('100内个位是2并能被3整除的数的个数: ', count)
-
输入任意一个正整数,求他是几位数?
注意: 这儿不能使用字符串,只能用循环
number = int(input('输入一个正整数:')) con = 0 while number: con += 1 number //= 10 print('输入的正整数的位数是:', con)
-
打印出所有的水仙花数,所谓水仙花数是指一个三位数,其各位数字⽴方和等于该数本身。例如:153是
⼀个⽔仙花数,因为
1³ + 5³ + 3³
等于 153。print('\n---水仙花数:---') for num in range(100, 1000): a = num // 100 b = num // 10 % 10 c = num % 10 shu = a**3 + b**3 + c**3 if shu == num: print(shu, end=' ')
挑战题
-
判断指定的数是否是素数(素数就是质数,即除了1和它本身以外不能被其他的数整除的数)
prime = int(input('请输入判断是否为素数的数:')) for i in range(2,int(prime ** 0.5)+1): if not prime % i: print('这个数不是质数!') break else: print('输入的这个数是质数!') # 在一个数平方根之前没找到能整除的数,则这个数是质数
-
求斐波那契数列列中第n个数的值:1,1,2,3,5,8,13,21,34… (这儿的n可以是任意正整数,可以通过输入来确定)
n = int(input('请输入想求第多少位斐波那契数列:')) f1 = f2 = fn = 1 if n == 1 or n == 2: print('第',n , '位的斐波那契数列值为:1') else: for i in range(3,n+1): fn = f1 + f2 f1 = f2 f2 = fn print('第',n , '位的斐波那契数列值为:',fn)
-
输出9*9口诀。 程序分析:分行与列考虑,共9行9列,i控制行,j控制列。
print('9*9乘法表:') for i in range(1, 10): for j in range(1, i+1): print(j,'*',i,'=',i*j,end='\t') print('')
-
这是经典的"百马百担"问题,有一百匹马,驮一百担货,大马驮3担,中马驮2担,两只小马驮1担,问有大,中,小马各几匹?(可以直接使用穷举法)
for i in range(0,34): for j in range(0, 50): for z in range(0,200): if i+j+z == 100 and i*3 + j*2 + z*(1/2) == 100: print(i,j,z)