文章目录
前言
上次讲解了条件控制语句,但是由于其在Python编程中极高的重要性,因此这篇博客再次针对条件控制语句的一些典型运用进行进一步讲解,有较多的代码例子,可以让我们加深对条件控制语句的理解,并加强对程序优化的重视。
一、求1000以内所有的水仙花数
水仙花数:指的是一个n位数(n>=3),每个位数上的数字的m次幂之和等于它本身。
如对于153:1^3 + 5^3 + 3^3=153。
#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()
四、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
练习:
猜数字游戏,随机1-10个数字,如果猜对则给出正确,如果没有猜对则给出错误,给用户9次机会,最终结果要求用户一次都猜不对,
即1、2、3、4、5、6、7、8、9、10共10个数字,9次都猜错,最后给出正确的数字。
思路:可以先拿到用户猜过的数字,我可以随机猜一个数字,去和用户猜过的数字做对比,如果这个循环的数字没有在用户猜过的数字,那么这个数字就是我们需要的数字。
方法一:
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')
八、质数第一次优化
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,灰烬少很多不必要的执行,从而减少时间,提升运行效率。
九、质数第二次优化
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和100000,并针对未优化、第一次优化、第二次优化进行运行并统计时间,结果如下图,
未优化 | |
---|---|