咱们在写程序的时候,极有可能遇到需求重复履行某条指令或某些指令的场景,例如咱们需求每隔1秒钟在屏幕上输出一次“hello, world”并持续输出一个小时。如下所示的代码能够完结一次这样的操作,假如要持续输出一个小时,咱们就需求把这段代码写3600遍,你乐意这么做吗?

import time
print('hello, world')
time.sleep(1)

阐明Python 内置time模块的sleep函数能够完结程序的休眠,参数1表明休眠的秒数,能够运用intfloat类型,例如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)能够结构出一个从03599的规模,当咱们把这样一个规模放到for-in循环中,就能够经过前面的循环变量i顺次取出从03599的整数,这就让for-in代码块中的句子能够重复3600次。当然,range的用法十分灵敏,下面的清单给出了运用range函数的比如:

  • range(101):能够用来发生0100规模的整数,需求留意的是取不到101
  • range(1, 101):能够用来发生1100规模的整数,适当所以左闭右开的设定,即[1, 101)
  • range(1, 101, 2):能够用来发生1100的奇数,其间2是步长(跨度),即每次递加的值,101取不到。
  • range(100, 0, -2):能够用来发生1001的偶数,其间-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来停止程序。

从零开始学Python第06课:循环结构

下面,咱们用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的值就会顺次取到123、……,直到101。当i变成101时,while循环的条件不再建立,代码会脱离while循环,此刻咱们输出变量total的值,它便是从1100求和的成果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,咱们能够经过在2n-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是一个素数;接下来,咱们在2num ** 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循环的循环变量值是从大到小的,这样咱们找到的能够一起整除xy的因子i,便是xy的最大公约数,此刻咱们用break停止循环。假如xy互质,那么循环会履行到i变成1,由于1是所有正整数的因子,此刻xy的最大公约数便是1

用上面代码的找最大公约数在履行功率是有问题的。假如x的值是999999999998y的值是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:猜数字小游戏

要求:核算机出一个1100之间的随机数,玩家输入自己猜的数字,核算机给出对应的提示信息“大一点”、“小一点”或“猜对了”,假如玩家猜中了数字,核算机提示用户总共猜了多少次,游戏完毕,不然游戏持续。

"""
猜数字小游戏
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函数帮助咱们生成了1100规模的随机数。变量counter用来记载循环履行的次数,也便是用户总共做出了几次猜测,每循环一次counter的值都会加1

总结

学会了 Python 中的分支结构和循环结构,咱们就能够处理许多实践的问题了。经过这节课的学习,咱们应该现已知道了能够用forwhile关键字来结构循环结构。假如事前知道循环结构重复的次数,咱们一般运用for循环假如循环结构的重复次数不能确认,能够用while循环。此外,咱们能够在循环结构中运用break停止循环,也能够在循环结构中运用continue关键字让循环结构直接进入下一次序