前言
上次讲解了条件控制语句,但是由于其在Python编程中极高的重要性,因此这篇文章再次针对条件控制语句的一些典型运用进行进一步讲解,有较多的代码例子,可以让我们加深对条件控制语句的理解,并加强对程序优化的重视。
一、求1000以内所有的水仙花数
水仙花数:指的是一个n位数(n>=3),每个位数上的数字的m次幂之和等于它本身。
#1.获取1000以内所有三位数
i = 100
while i < 1000:
#假设i的百位数是a,十位数是b,个位数是c。
a = i // 100
b = (i // 10) % 10
#求b第二种方法
#b = (i - a *100) // 10
c = i % 10
#2.判断是否为水仙花数
if a ** 3 + b ** 3 + c ** 3 == i:
print(i)
i += 1
二、获取用户输入的任意数,判断其是否为质数
质数:只能被1和它本身整除的数就是质数,如2、3、5、7、11、13等。
num = int(input('Please input a number which is bigger than 1:'))
# 2.定义变量
i = 2
#创建一个标记用来记录num是否是质数,默认为质数
flag = 1
while i < num:
#满足下面条件,则num移动不是质数(逆向思维)
if num % i == 0:
#一旦符合此判断条件,则证明num不是质数
flag = 0
i += 1
if flag:
print(num,'is a prime')
else:
print(num,'is not a prime')
三、循环嵌套
1.要求:在控制台输出五行“*”,每行五个。
方法一:
print('*****\n' * 5)
方法二:
i = 0
while i < 5:
print('*****')
i += 1
方法三:
#外层循环控制高度(列),内层循环控制宽度(行)
i = 0
while i < 5:
j = 0
while j < 5:
print('*',end='')
j += 1
print()
i += 1
2.
要求:打印出以下图形* ***
i = 0
while i < 5:
j = 0
while j < i + 1:
print('*',end='')
j += 1
print()
i += 1
方法二:
i = 0
while i < 5:
i += 1
print('*' * i)
3.
要求:打印出以下图形* *
i = 0
while i < 5:
j = 0
while j < 5 - i:
print('*',end='')
j += 1
print()
i += 1
方法二:
i = 0
while i < 5:
i += 1
print('*' * (5 - i))
※循环嵌套※:在一个循环中出现另一个循环的情况叫循环嵌套,前者为外层循环,后者为内层循环,内层循环嵌套在外层循环中。
三、在控制台输出九九乘法表
#创建外层循环控制高度
i = 0
while i < 9:
i += 1
#创建内层循环控制图形宽度
j = 0
while j < i:
j += 1
print(f'{j}×{i}={i*j}',end='\t')
print()
![程序运行产生的九九乘法表 640?wx_fmt=jpeg](https://i-blog.csdnimg.cn/blog_migrate/ebf30f5d23e21fc2d0c9b2391804d7fe.jpeg)
四、continue和break
知识点:continue:可以用来跳过当次循环,如
i = 0
while i < 6:
i += 1
if i == 2:
continue
print(i)
else:
print('hello')
输出
1
3
4
5
6
hello
break:用来立即退出循环语句,包括else语句,如
i = 0
while i < 6:
i += 1
if i == 2:
break
print(i)
else:
print('hello')
输出
1
练习:
import random
#定义一个列表,用来存储用户猜过的数字
lst = []
i = 0
while i < 9:
number = int(input('Please input a number between 1 and 10:'))
#把用户猜过的数字添加到列表中
lst.append(number)
print('Sorry,you are wrong!!!')
i += 1
while True:
#number_x between 1 and 10
number_x = random.randint(1,10)
if number_x in lst:
continue
else:
break
print('The right number is',number_x)
方法二:
import random
#定义一个列表,用来存储用户猜过的数字
lst = []
i = 0
while i < 9:
number = int(input('Please input a number between 1 and 10:'))
#把用户猜过的数字添加到列表中
lst.append(number)
print('Sorry,you are wrong!!!')
i += 1
j = 1
while j < 11:
if j in lst:
j+=1
continue
else:
break
print('The right number is',j)
六、求100以内所有质数
i = 2
while i <= 100:
#创建一个标记
flag = 1
#判断i是否为质数:先获取所有可能成为i的因数的数
j = 2
while j < i:
#判断i是否能被j整除,如果可以,则i不是质数
if i % j == 0:
flag = 0
j += 1
if flag:
print(i,end='\t')
i += 1
七、在程序中加入时间
对程序运行进行计时:
from time import *
#获取程序开始时间
start = time()
i = 2
while i <= 10000:
#创建一个标记
flag = 1
#判断i是否为质数:先获取所有可能成为i的因数的数
j = 2
while j < i:
#判断i是否能被j整除,如果可以,则i不是质数
if i % j == 0:
flag = 0
j += 1
if flag:
print(i,end='\t')
i += 1
#获取程序结束时间
end = time()
print()
print('The program runs for',end-start,'second')
程序运行时间如下图:
![i上限为10000时未优化的运行时间 640?wx_fmt=jpeg](https://i-blog.csdnimg.cn/blog_migrate/886672bb6c1c7b9451f13140d8e9df62.jpeg)
如将上限改为100000时,运行时间如下图:
![i上限为100000时未优化的运行时间 640?wx_fmt=jpeg](https://i-blog.csdnimg.cn/blog_migrate/0f647e30525fafc1c9a7960cd89c6410.jpeg)
很显然,运行时间扩大了不止10倍,达到了100倍之多。
八、质数第一次优化
from time import *
#获取程序开始时间
start = time()
i = 2
while i <= 10000:
#创建一个标记
flag = 1
#判断i是否为质数:先获取所有有可能成为i的因数的数
j = 2
while j < i:
#判断i是否能被j整除,如果可以,则i不是质数
if i % j == 0:
flag = 0
#一旦进入判断证明i不是质数,内层循环根本没有必要再继续执行
break
j += 1
if flag:
print(i,end='\t')
i += 1
#获取程序结束时间
end = time()
print()
print('The program runs for',end-start,'second')
※在代码行flag = 0
后加入break,会减少很多不必要的执行,从而减少时间,提升运行效率。
![i上限为10000时进行第一次优化后的运行时间 640?wx_fmt=jpeg](https://i-blog.csdnimg.cn/blog_migrate/86409a3a5fae600bfcf2a9f6c1d62809.jpeg)
如将上限改为100000时,运行时间如下图:
![i上限为100000时进行第一次优化后的运行时间 640?wx_fmt=jpeg](https://i-blog.csdnimg.cn/blog_migrate/85919c40c610d500953a7cd570513a5f.jpeg)
运行时间也扩大了近100倍。
九、质数第二次优化
from time import *
#获取程序开始时间
start = time()
i = 2
while i <= 10000:
#创建一个标记
flag = 1
#判断i是否为质数:先获取所有有可能成为i的因数的数
j = 2
#没有必要对从2到i的书都进行判断
while j <= i ** 0.5:
#判断i是否能被j整除,如果可以,则i不是质数
if i % j == 0:
flag = 0
#一旦进入判断证明i不是质数,内层循环根本没有必要再继续执行
break
j += 1
if flag:
print(i,end='\t')
i += 1
#获取程序结束时间
end = time()
print()
print('The program runs for',end-start,'second')
※对于一个素数,也没有必要从2到它本身进行判断,因为假如它是和数,对于一个逐渐增大的因数,也必然会有一个从这个数本身逐渐减小的数与之对应,它们相乘即为这个数本身,所以只需要判断到这个数的平方根即可,又可很大程度上节省时间、提高效率。
![i上限为10000时进行第二次优化后的运行时间 640?wx_fmt=jpeg](https://i-blog.csdnimg.cn/blog_migrate/5749d71c9b21d78f88723ecfa2ef0f7a.jpeg)
如将上限改为100000时,运行时间如下图:
![i上限为100000时进行第二次优化后的运行时间 640?wx_fmt=jpeg](https://i-blog.csdnimg.cn/blog_migrate/c86ff01ccceb7cb5a494bf087cdd1386.jpeg)
运行时间也扩大了不止10倍。
为了更直观地体现优化与否的差异,我将i的上限分别设为10000和100000,并针对未优化、第一次优化、第二次优化进行运行并统计时间,结果如下图,