咱们在写程序的时候,极有可能遇到需求重复履行某条指令或某些指令的场景,例如咱们需求每隔1秒钟在屏幕上输出一次“hello, world”并持续输出一个小时。如下所示的代码能够完结一次这样的操作,假如要持续输出一个小时,咱们就需求把这段代码写3600遍,你乐意这么做吗?
import time
print('hello, world')
time.sleep(1)
阐明:Python 内置
time
模块的sleep
函数能够完结程序的休眠,参数1
表明休眠的秒数,能够运用int
或float
类型,例如0.05
表明50
毫秒。
为了应对上述场景,咱们能够在 Python 程序中运用循环结构。所谓循环结构,便是程序中操控某条或某些指令重复履行的结构。有了这样的结构,方才的代码就不需求写3600遍,而是写一遍然后放到循环结构中重复3600次。在 Python 语言中结构循环结构有两种做法,一种是for-in
循环,另一种是while
循环。
for-in循环
假如明确知道循环履行的次数,咱们引荐运用for-in
循环,例如上面说的那个重复3600次的场景,咱们能够用下面的代码来完结。 留意,被for-in
循环操控的代码块也是经过缩进的方法来结构,这一点跟分支结构中结构代码块的做法是相同的。咱们被for-in
循环操控的代码块称为循环体,一般循环体中的句子会依据循环的设定被重复履行。
"""
每隔1秒输出一次“hello, world”,持续1小时
Author: 骆昊
Version: 1.0
"""
import time
for i in range(3600):
print('hello, world')
time.sleep(1)
需求阐明的是,上面代码中的range(3600)
能够结构出一个从0
到3599
的规模,当咱们把这样一个规模放到for-in
循环中,就能够经过前面的循环变量i
顺次取出从0
到3599
的整数,这就让for-in
代码块中的句子能够重复3600次。当然,range
的用法十分灵敏,下面的清单给出了运用range
函数的比如:
-
range(101)
:能够用来发生0
到100
规模的整数,需求留意的是取不到101
。 -
range(1, 101)
:能够用来发生1
到100
规模的整数,适当所以左闭右开的设定,即[1, 101)
。 -
range(1, 101, 2)
:能够用来发生1
到100
的奇数,其间2
是步长(跨度),即每次递加的值,101
取不到。 -
range(100, 0, -2)
:能够用来发生100
到1
的偶数,其间-2
是步长(跨度),即每次递减的值,0
取不到。
咱们可能现已留意到了,上面的输出和休眠操作都没有用到循环变量i
,关于不需求用到循环变量的for-in
循环结构,按照 Python 的编程常规,咱们一般把循环变量命名为_
,修正后的代码如下所示。虽然成果没什么变化,可是这样写显得你更专业。
"""
每隔1秒输出一次“hello, world”,持续1小时
Author: 骆昊
Version: 1.1
"""
import time
for _ in range(3600):
print('hello, world')
time.sleep(1)
上面的代码要履行一个小时,假如想提前完毕程序,在 PyCharm 中能够点击运转窗口上的停止按钮,如下图所示。假如在命令提示符或终端中运转代码,能够运用组合键ctrl+c
来停止程序。
下面,咱们用for-in
循环完结从1到100的整数求和,即∑n=1100n\small{\sum_{n=1}^{100}n}。
"""
从1到100的整数求和
Version: 1.0
Author: 骆昊
"""
total = 0
for i in range(1, 101):
total += i
print(total)
上面的代码中,变量total
的作用是保存累加的成果。在循环的过程中,循环变量i
的值会从1
一向取到100
。关于变量i
的每个取值,咱们都履行了total += i
,它适当于total = total + i
,这条句子完结了累加操作。所以,当循环完毕,咱们输出变量total
的值,它的值便是从1
累加到100
的成果5050
。留意,print(total)
这条句子前是没有缩进的,它不受for-in
循环的操控,不会重复履行。
咱们再来写一个从1到100偶数求和的代码,如下所示。
"""
从1到100的偶数求和
Version: 1.0
Author: 骆昊
"""
total = 0
for i in range(1, 101):
if i % 2 == 0:
total += i
print(total)
阐明:上面的
for-in
循环中咱们运用了分支结构来判别循环变量i
是不是偶数。
咱们也能够修正range
函数的参数,将起始值和跨度修正为2
,用更为简略的代码完结从1到100的偶数求和。
"""
从1到100的偶数求和
Version: 1.1
Author: 骆昊
"""
total = 0
for i in range(2, 101, 2):
total += i
print(total)
当然, 更为简略的办法是运用 Python 内置的sum
函数求和,这样咱们连循环结构都省掉了。
"""
从1到100的偶数求和
Version: 1.2
Author: 骆昊
"""
print(sum(range(2, 101, 2)))
while循环
假如要结构循环结构可是又不能确认循环重复的次数,咱们引荐运用while
循环。while
循环经过布尔值或能发生布尔值的表达式来操控循环,当布尔值或表达式的值为True
时,循环体(while
句子下方保持相同缩进的代码块)中的句子就会被重复履行,当表达式的值为False
时,完毕循环。
下面咱们用while
循环来完结从1到100的整数求和,代码如下所示。
"""
从1到100的整数求和
Version: 1.1
Author: 骆昊
"""
total = 0
i = 1
while i <= 100:
total += i
i += 1
print(total)
相较于for-in
循环,上面的代码咱们在循环开端前增加了一个变量i
,咱们运用这个变量来操控循环,所以while
后边给出了i <= 100
的条件。在while
的循环体中,咱们除了做累加,还需求让变量i
的值递加,所以咱们添加了i += 1
这条句子,这样i
的值就会顺次取到1
、2
、3
、……,直到101
。当i
变成101
时,while
循环的条件不再建立,代码会脱离while
循环,此刻咱们输出变量total
的值,它便是从1
到100
求和的成果5050
。
假如要完结从1到100的偶数求和,咱们能够对上面的代码稍作修正。
"""
从1到100的偶数求和
Version: 1.3
Author: 骆昊
"""
total = 0
i = 2
while i <= 100:
total += i
i += 2
print(total)
break和continue
咱们再来看一个极端的场景,把while
循环的条件直接设置为布尔值True
,仍是从1到100的偶数求和。
"""
从1到100的偶数求和
Version: 1.4
Author: 骆昊
"""
total = 0
i = 2
while True:
total += i
i += 2
if i > 100:
break
print(total)
上面的代码中运用while True
结构了一个条件恒建立的循环,也就意味着假如不做特殊处理,循环是不会完毕的,这也便是常说的“死循环”。为了在i
的值超过100
后让循环停下来,咱们运用了break
关键字,它的作用是停止循环结构的履行。需求留意的是,break
只能停止它地点的那个循环,这一点在运用嵌套循环结构时需求引起留意,后边咱们会讲到什么是嵌套的循环结构。除了break
之外,还有另一个在循环结构中能够运用的关键字continue
,它能够用来抛弃本次循环后续的代码直接让循环进入下一轮,代码如下所示。
"""
从1到100的偶数求和
Version: 1.5
Author: 骆昊
"""
total = 0
for i in range(1, 101):
if i % 2 != 0:
continue
total += i
print(total)
阐明:上面的代码运用
continue
关键字跳过了i
是奇数的情况,只要在i
是偶数的前提下,才会履行到total += i
。
嵌套的循环结构
和分支结构相同,循环结构也是能够嵌套的,也便是说在循环结构中还能够结构循环结构。下面的比如演示了如何经过嵌套的循环来输出一个乘法口诀表(九九表)。
"""
打印乘法口诀表
Version: 1.0
Author: 骆昊
"""
for i in range(1, 10):
for j in range(1, i + 1):
print(f'{i}{j}={i * j}', end='\t')
print()
上面的代码中,for-in
循环的循环体中又用到了for-in
循环,外面的循环用来操控发生i
行的输出,而里边的循环则用来操控在一行中输出j
列。显然,里边的for-in
循环的输出便是乘法口诀表中的一整行。所以在里边的循环完结时,咱们用了一个print()
来完结换行的效果,最终的输出如下所示。
11=1
21=2 22=4
31=3 32=6 33=9
41=4 42=8 43=12 44=16
51=5 52=10 53=15 54=20 55=25
61=6 62=12 63=18 64=24 65=30 66=36
71=7 72=14 73=21 74=28 75=35 76=42 77=49
81=8 82=16 83=24 84=32 85=40 86=48 87=56 88=64
91=9 92=18 93=27 94=36 95=45 96=54 97=63 98=72 99=81
循环结构运用举例
比如1:判别素数
要求:输入一个大于1的正整数,判别它是不是素数。
提示:素数指的是只能被1和自身整除的大于1的整数。例如关于正整数
n
,咱们能够经过在2
到n-1
之间寻觅有没有n
的因子,来判别它究竟是不是一个素数。当然,循环不必从2
开端到n-1
完毕,由于关于大于1的正整数,因子应该都是成对呈现的,所以循环到n\small{\sqrt{n}}就能够完毕了。
"""
输入一个大于1的正整数判别它是不是素数
Version: 1.0
Author: 骆昊
"""
num = int(input('请输入一个正整数: '))
end = int(num ** 0.5)
is_prime = True
for i in range(2, end + 1):
if num % i == 0:
is_prime = False
break
if is_prime:
print(f'{num}是素数')
else:
print(f'{num}不是素数')
阐明:上面的代码中咱们用了布尔型的变量
is_prime
,咱们先将它赋值为True
,假定num
是一个素数;接下来,咱们在2
到num ** 0.5
的规模寻觅num
的因子,假如找到了num
的因子,那么它一定不是素数,此刻咱们将is_prime
赋值为False
,一起运用break
关键字停止循环结构;最终,咱们依据is_prime
的值是True
仍是False
来给出不同的输出。
比如2:最大公约数
要求:输入两个大于0
的正整数,求两个数的最大公约数。
提示:两个数的最大公约数是两个数的公共因子中最大的那个数。
"""
输入两个正整数核算它们的最大公约数
Version: 1.0
Author: 骆昊
"""
x = int(input('x = '))
y = int(input('y = '))
for i in range(x, 0, -1):
if x % i == 0 and y % i == 0:
print(f'最大公约数: {i}')
break
阐明:上面代码中
for-in
循环的循环变量值是从大到小的,这样咱们找到的能够一起整除x
和y
的因子i
,便是x
和y
的最大公约数,此刻咱们用break
停止循环。假如x
和y
互质,那么循环会履行到i
变成1
,由于1
是所有正整数的因子,此刻x
和y
的最大公约数便是1
。
用上面代码的找最大公约数在履行功率是有问题的。假如x
的值是999999999998
,y
的值是999999999999
,很显然两个数是互质的,最大公约数为1
。可是咱们运用上面的代码,循环会重复999999999998
次,这一般是难以接受的。咱们能够运用欧几里得算法(辗转相除法)来找最大公约数,它能帮咱们更快的得到想要的成果,代码如下所示。
"""
输入两个正整数核算它们的最大公约数
Version: 1.1
Author: 骆昊
"""
x = int(input('x = '))
y = int(input('y = '))
while y % x != 0:
x, y = y % x, x
print(f'最大公约数: {x}')
阐明:处理问题的方法和过程能够称之为算法,关于同一个问题,咱们能够规划出不同的算法,不同的算法在存储空间的占用和履行功率上都会存在差别,而这些差别就代表了算法的优劣。咱们能够对比上面的两段待会,体会一下为什么咱们说欧几里得算法是更好的挑选。上面的代码中
x, y = y % x, x
句子表明将y % x
的值赋给x
,将x
本来的值赋给y
。
比如3:猜数字小游戏
要求:核算机出一个1
到100
之间的随机数,玩家输入自己猜的数字,核算机给出对应的提示信息“大一点”、“小一点”或“猜对了”,假如玩家猜中了数字,核算机提示用户总共猜了多少次,游戏完毕,不然游戏持续。
"""
猜数字小游戏
Version: 1.0
Author: 骆昊
"""
import random
answer = random.randrange(1, 101)
counter = 0
while True:
counter += 1
num = int(input('请输入: '))
if num < answer:
print('大一点.')
elif num > answer:
print('小一点.')
else:
print('猜对了.')
break
print(f'你总共猜了{counter}次.')
阐明:上面的代码运用
import random
导入了 Python 标准库的random
模块,该模块的randrange
函数帮助咱们生成了1
到100
规模的随机数。变量counter
用来记载循环履行的次数,也便是用户总共做出了几次猜测,每循环一次counter
的值都会加1
。
总结
学会了 Python 中的分支结构和循环结构,咱们就能够处理许多实践的问题了。经过这节课的学习,咱们应该现已知道了能够用for
和while
关键字来结构循环结构。假如事前知道循环结构重复的次数,咱们一般运用for
循环;假如循环结构的重复次数不能确认,能够用while
循环。此外,咱们能够在循环结构中运用break
停止循环,也能够在循环结构中运用continue
关键字让循环结构直接进入下一次序。