循环语句
众所周知,Python并没有大多语言常见的switch循环;具体什么原因网上有很多回答,如果大家感兴趣可以去了解。本文主要浅谈for循环与while循环。
循环特征:让代码重复执行(代码写一次);降低代码冗余度。
for循环
语法
for 变量 in 序列:
循环体
说明
for、in — 保留字,固定写法
变量 — 变量名(已定义或未定义均可)
序列 — 容器型数据类型对应的数据,常见的有:字符串、列表、元组、字典、集合、迭代器、生成 器、range
: — 固定写法
循环体 — 与for保持缩进的一条或多条语句
执行过程
让变量去序列中取值,一个一个的取,取完为止,每取一个值执行一次循环体。
for循环次数与序列中的元素个数有关
range()函数:产生指定范围的数字序列;
-
range(N):产生[0,N)的数字序列。左闭右开,取头不取尾;步长为1。
-
range(M,N):产生[M,N)的数字序列。左闭右开,取头不取尾;步长为1。
-
range(M,N,step):产生[M,N)的数字序列。左闭右开,取头不取尾;步长为step。
- 用法一:产生0开始步长为1的数字序列
for i in range(9):
print(i,'Hello!')
- 用法二:直接控制循环次数
for i in range(9):
print('Hello!')
for i in range(-10,0):
print(i,end=" ")
以下是几个小练习以更好的说明:
1、100以内所有偶数
for i in range(0,101,2):
print(i,end=' ')
if(i == 50):
print('\n')
2、打印100-200中所有个位数是3的数
for i in range(100,200):
if(i % 10 == 3): #(i % 100 == 3) or (i % 100 % 10 == 3)
print(i,end=' ')
注释后面的是刚开始写的,当时头打铁了,不知道在想什么,虽然也可以完成任务。可能是当吃饭的点了,在吃饭的路上就反应过来了。
3、100-1000水仙花数
print('100-1000的水仙花数有:')
for i in range(100,1000):
item = i
if(((i % 10)**3)+(((i // 10)%10)**3)+((i // 100)**3) == item):
print(item,end=" ")
这个程序上篇文章就有,今天循环觉得还是有必要再写一次。
4、乘法口诀表
for i in range(1,10):
for j in range(1,10):
if(i >= j):
print(j,'*',i,'=',i*j,end=" ")
print('\n')
这是刚开始写的,运行效率不高。所以马上有了下面这个表:
for i in range(1,10):
for j in range(1,i+1):
print(j,'*',i,'=',i*j,end=" ")
这只是我个人的思路,有任何问题敬请斧正。
for循环主要运用于统计个数及求和。
while循环
语法
while(条件语句):
循环体
说明
while — 保留字,固定写法;
条件语句 — 任何有结果的表达式(赋值表达式除外);
: — 固定写法;
循环体 === 跟while保持一个缩进的一条或多条语句;需要重复执行的代码。
执行过程
首先判断条件语句是否为True,若为True则执行循环体,执行完循环体再判断条件是否为True
若为True则再执行循环体…直到条件为False退出循环。
while循环控制循环次数的原则:让条件经历过指定次数后由True变成False
使用while循环打印10次Hello
count = 10
while(count > 0):
print(count,'Hello!')
count -= 1
while练习 — 猜数字游戏
print('**********猜数字游戏**********')
user_number = int(input('请输入您的数字以开始游戏(1-100的整数)输入0以结束游戏:'))
number = random.randint(1,100)
while(1):
if(user_number < 0 or user_number > 100):
print('要输入0-100的整数哦!输入0以结束游戏!')
user_number = int(input('请输入您的数字以开始游戏(0-100的整数):'))
elif(user_number > number):
print('猜错啦!','提示:太大了哦!输入0以结束游戏!')
user_number = int(input('请再次输入您的数字(1-100的整数):'))
elif(user_number < number and user_number != 0):
print('猜错啦!', '提示:太小了哦!输入0以结束游戏!')
user_number = int(input('请再次输入您的数字(1-100的整数):'))
elif(user_number == 0):
print('游戏结束!')
break
else:
print('太棒啦,猜对啦!')
print('游戏结束!')
break
对于while与for循环的选择:
for循环 | while循环 |
---|---|
循环次数确定 | 循环次数不确定 |
continue、break
continue、break只能在循环体中出现。
continue
结束一次循环\结束当次循环
若在执行循环体的时候遇到了continue,那么结束本次循环直接进行下次循环
for i in range(9):
if(i == 5 or i == 7):
continue
print('----',i,'----')
'''
---- 0 ----
---- 1 ----
---- 2 ----
---- 3 ----
---- 4 ----
---- 6 ----
---- 8 ----
'''
以上代码使得continue作用显而易见。当执行到“i = =5”与“i= =7”时,直接跳过continue之后的所有语句(print(’----’,i,’----’))。这也就是问什么输出中没有5与7 的原因。
#### break
若在执行循环体过程中遇到了break,结束整个循环。
for i in range(9):
if(i == 5 or i == 7):
break
print('----',i,'----')
'''
---- 1 ----
---- 2 ----
---- 3 ----
---- 4 ----
'''
代码同上,但是此处用break替换了continue,从输出结果就可以发现,break直接跳出了整个循环所以只打印了5之前的数字。
按照之前的了解到的循环,for、while循环到这也就结束了。其实并不然:
完整的for循环:
for 变量 in 序列:
循环体
else
代码段
完整的while循环:
while 条件语句:
循环体
else
循环体
else结构的存在不影响原来循环的执行;
特别的:
当循环自然结束,else内的代码段才会执行;
当循环是遇到break而结束,那么else内代码不执行。
练习题
基础题
-
使用for和while循环输出 0~100内所有3的倍数。
# for 循环 print('0-100内所有3的倍数有:') for i in range(0,100): if(i % 3 == 0): print(i,end=' ') print('\n') # while 循环 i = 0 print('0-100内所有3的倍数有:') while(100 >= i): if(i % 3 == 0): print(i,end=' ') i += 1
-
使用for和while循环输出100~200内个位数或者十位数能被3整除的数。
# for循环 print('100~200内个位数或者十位数能被3整除的数:') for i in range(100,201): if((i % 10) % 3 == 0 or (i // 10) % 10 % 3 == 0): print(i,end=' ') print('\n') # while循环 i = 100 print('100~200内个位数或者十位数能被3整除的数:') while(201 >= i >= 100): if ((i % 10) % 3 == 0 or (i // 10) % 10 % 3 == 0): print(i, end=' ') i += 1
-
统计100~200中十位数是5的数的个数
count = 0 for i in range(100,201): if((i // 10 % 10) == 5): count += 1 # print(i,end=' ') print('100~200中十位数是5的数的个数:'+str(count))
-
打印50~150中所有能被3整除但是不能被5整除的数
print('50~150中所有能被3整除但是不能被5整除的数:') for i in range(50,150): if(i % 3 ==0 and i % 5 != 0): print(i,end=' ')
-
计算50~150中所有能被3整除但是不能被5整除的数的和
summary = 0 for i in range(50,150): if (i % 3 == 0 and i % 5 != 0): summary += i print('50~150中所有能被3整除但是不能被5整除的数的和:'+str(summary))
进阶题
-
使用循环计算
1*2*3*4*...*10
的结果。product = 1 for i in range(1,11): product *= i print('1*2*3*4*...*10','=',product)
-
统计100以内个位数是2并且能够被3整除的数的个数。
summary1 = 0 for i in range(1,101): if(i % 10 == 2 and i % 3 == 0): summary1 += 1 # print(i,end=' ') print('100以内个位数是2并且能够被3整除的数的个数:',summary1)
-
输入任意一个正整数,求他是几位数?
注意: 这儿不能使用字符串,只能用循环
number = int(input('请输入一个正整数:')) number_of_digits = 0 while(number > 0): number_of_digits += 1 number //= 10 print('您输入的整数位数是:',number_of_digits)
-
打印出所有的水仙花数,所谓水仙花数是指一个三位数,其各位数字⽴方和等于该数本身。例如:153是
⼀个⽔仙花数,因为
1³ + 5³ + 3³
等于 153。print('100-1000的水仙花数有:') for i in range(100,1000): item = i if(((i % 10)**3)+(((i // 10)%10)**3)+((i // 100)**3) == item): print(item,end=" ")
挑战题
- 判断指定的数是否是素数(素数就是质数,即除了1和它本身以外不能被其他的数整除的数)
# while 循环
is_prime_number = int(input('请输入一个整数:'))
item = 2
while(item <= is_prime_number):
if (is_prime_number % item == 0 and item != is_prime_number):
print(is_prime_number,'不是素数!')
break
item += 1
else:
print(is_prime_number,'是素数!')
# for 循环
is_prime_number = int(input('请输入一个整数:'))
for i in range(2,is_prime_number):
if((is_prime_number % i) == 0):
print(is_prime_number,'不是素数!')
break
else:
print(is_prime_number,'是素数!')
# for优化
is_prime_number = int(input('请输入一个整数:'))
for i in range(2,int((is_prime_number) ** 0.5) + 1):
if(is_prime_number % i == 0):
print(is_prime_number,'不是素数!')
break
else:
print(is_prime_number,'是素数!')
-
求斐波那契数列列中第n个数的值:1,1,2,3,5,8,13,21,34… (这儿的n可以是任意正整数,可以通过输入来确定)
number_fibonacci = int(input('请输入要求斐波那契数列指定的位数:')) fibonacci = 1 next = 1 if(number_fibonacci == 1 or number_fibonacci == 2): print('斐波那契数列的第',number_fibonacci,'项是:',1) else: for i in range(number_fibonacci - 2): item = fibonacci + next next = fibonacci fibonacci = item print('斐波那契数列的第',number_fibonacci,'项是:',fibonacci)
-
输出9*9口诀。 程序分析:分行与列考虑,共9行9列,i控制行,j控制列。
print('---------------------------------------------------------------------------------------------------------------------------') for i in range(1,10): for j in range(1,i+1): print('|',j,'*',i,'=',i*j,'|',end=" ") print('\n') print('--------------------------------------------------------------------------------------------------------------------------------------------------------')
-
这是经典的"百马百担"问题,有一百匹马,驮一百担货,大马驮3担,中马驮2担,两只小马驮1担,问有大,中,小马各几匹?(可以直接使用穷举法)
# 大马:big_horse 中马:middle_horse 小马:little_horse # big_horse + middle_horse + little_horse = 100 # goods = 100 print('|','大马数量','中马数量','小马数量',sep=' ') for big_horse in range(33): #若全为大马 for middle_horse in range(50): #若全为中马 for little_horse in range(200): #若全为小马 if(big_horse * 3 + middle_horse * 2 + little_horse * 0.5 == 100 and big_horse + middle_horse + little_horse == 100):#当大中小马和等于100且货物等于100时满足题设,输出此时的马儿数量 print('|',big_horse,'|',middle_horse,'|',little_horse,sep=' ')