Ⅰ.循环结构
0x00 引子
我们在上一篇讲到了结构化编程,我们也学习了结构化编程里的分支结构。(忘记的同学可以回去复习一下,再来学。传送门)
我们将在这节课学习结构化编程里的循环结构。
莫同学:循环结构有什么用,分支在手我啥也不要
来!这位同学你过来。
来,我问你,你把1~10打印出来,一个数字一行!
print(1)
print(2)
print(3)
print(4)
print(5)
print(6)
print(7)
print(8)
print(9)
print(10)
来,1~1000!
print(1)
print(2)
# ...
print(1000)
来,我们继续上课。
接下来,让我们写一个打印1~10000以内偶数的程序。
好了,不玩了。
计算机最擅长的事情就是做重复的事情。
循环结构就是用来执行重复相似的代码。
循环结构的定义(百度百科):
循环结构是指在程序中需要反复执行某个功能而设置的一种程序结构。它由循环体中的条件,判断继续执行某个功能还是退出循环。根据判断条件,循环结构又可细分为以下两种形式:先判断后执行的循环结构和先执行后判断的循环结构。
就问你帅不帅,好了,接下来我们就正式开始学习循环结构了。
0x01 while 循环
while循环一般用于循环次数不确定的地方(包括死循环等)
while循环要使用python中的关键字while。
基本格式如下:
while 判断条件: #条件为真才执行
代码块 #注意:每次循环前都会检查判断条件是否为真,为假就退出循环体
我们来体验一下循环的妙处
还记得刚才讲的问题吗?
回忆:接下来,让我们写一个打印1~10000以内偶数的程序
我们如果用while循环来做就不用一直
我们先写一个框架
i = 0 # 我们定义一个变量,用于记录当前是第几次循环
while i <= 10000: # 因为是1~10000,如果i大于10000就结束循环
print(i)
i += 1 # 每次都要把变量i+1
"""
输出:
0
1
2
3
4
5
....
10000
"""
因为我们只输出偶数,就要用的上节课的分支结构了
忘记的同学可以回去复习一下传送门
代码添加if判断后变成
i = 0 # 我们定义一个变量,用于记录当前是第几次循环
while i <= 10000: # 因为是1~10000,如果i大于10000就结束循环
if i % 2 == 0: # 只有i除2的余数为0才打印
print(i)
i += 1 # 每次都要把变量i+1
"""
输出:
0
2
4
....
10000
"""
我们也可以修改计数器增加的量
i = 0 # 我们定义一个变量,用于记录当前是第几次循环
while i <= 10000: # 因为是1~10000,如果i大于10000就结束循环
print(i)
i += 2 # 修改为2,这样打印的都是二的倍数
"""
输出:
0
2
....
10000
"""
值得一说,循环真的太妙了!!!
如果我们要一直打印二的倍数呢(直到电脑死机)
这时候就需要用的死循环了。
想必有些同学已经想到了,只需要把他的判断条件设为True即可。
这样就能一直运行
i = 0 # 我们定义一个变量,用于记录当前是第几次循环
while True: # 设为死循环
print(i)
i += 2
"""
输出:
0
2
4
6
8
....
"""
额
想要终止死循环,就需要break关键字了。待会我们会讲,感兴趣的可以自己试一试。
0x02 for循环
for语句实际上解决的是循环问题。在很多的高级语言中都有for循环(for loop)。
for语句是编程语言中针对可迭代对象的语句,它的主要作用是允许代码被重复执行。
- 是什么:在计算科学中,是针对特殊迭代对象的控制流语句,能够重复执行
- 怎么构成:一个头部(是可迭代对象)+ 每个对象的执行体
基本语法如下:
for 变量名 in 可迭代对象:
代码块
我们发现这里面出现了一个新的名词:“可迭代对象”
什么是可迭代对象
可迭代对象(Iteratable Object)
是能够一次返回其中一个成员的对象,比如我们常用的字符串、列表、元组、集合、字典等等之类的对象都属于可迭代对象,获取到这些对象我们就可以用for循环来进行操作。
在这里面,我们只简单学过字符串,其他会在后面讲。
我们先来体验一下for循环的奥妙吧
还记得我们刚才的例子吧。
我们如果用for循环来写就会减少不少代码。
毕竟for循环比while更适合循环已知的代码。
for i in range(1, 10001):
if i % 2 == 0: # 在for循环内可以直接使用变量名访问当前的迭代到的对象
print(i)
这里面出现了一个陌生的内置函数
range(1, 10001)
我们用help函数获取对这个的帮助
参考翻译
range(stop)->范围对象
|range(start,stop[,step])->range对象
|
|返回一个对象,该对象从开始(包括开始)生成一系列整数
|逐步停止(排他)。范围(i,j)产生i,i+1,i+2。。。,j-1。
|start默认为0,省略stop!范围(4)产生0、1、2、3。
|这些正是4个元素列表的有效索引。
|当给出步长时,它指定增量(或减量)。
想必大家看帮助说明就明白了
如果我们用上步长这一参数。。。
for i in range(0, 10001, 2): print(i)
我是压行大师
我在前面说过,for循环还可以遍历字符串。
我们这次试着把输入的字符串遍历打印出来,中间以空格分隔。
s = input() # 获取用户输入
for c in s: # 遍历字符串s
print(c, end=' ') # 打印当前遍历到的变量,以空格结尾
我们尝试一下。
没有问题。
突发奇想一下,能不能遍历数字呢?
嘿嘿
最后,我认为for循环和while循环是相辅相成的,缺一不可。
Ⅱ.continue和break
0x00 continue
当continue语句在循环结构中执行时,并不会退出循环结构,而是立即结束本次循环,重新开始下一轮循环,也就是说,跳过循环体中在continue语句之后的所有语句,继续下一轮循环。
因此如果我们使用continue,刚才的程序就可以变成
for i in range(1, 10001):
if i % 2 != 0: continue
print(i)
"""输出:
0
2
4
6
...
"""
continue还是十分容易理解的,很快就讲完了
0x01 break
如果我们自制一个游戏,但玩家的hp(血量)小于等于0的时候要怎么退出游戏的死循环呢?
这时候就要用的break关键字了。
break关键字可以退出离他最近的一层循环,也就是终止当前所在的循环了。
听起来是不是十分好奇呀?
让我们使用while循环完成最初的示例,打印0~10000内的使用偶数。
i = 0 # 初始化计数器的值为0
while True:
print(i)
i += 2 # 增加计数器
if i > 10001: break # 如果计数器的值大于10001就退出当前循环
针不戳!
Ⅲ.编程小练习
输入:用户会输入两行,第一行是矩阵的宽,第二行是矩阵的高
输出:输出一个方型矩阵,打印出来的图案是有“*”和“~”交替输出。
例1:
输入:
5
5
输出:
~ * ~ * ~
* ~ * ~ *
~ * ~ * ~
* ~ * ~ *
~ * ~ * ~
我们可以先自己想一下。
我们这里需要用的嵌套循环。
我们先把输入给打好吧
x = int(input()) # 把输入的第一行赋值给x变量,因为输入的默认类型是字符串,所以要类型转换
y = int(input())
好了,我们思考一下怎么打印出矩阵
我们可以嵌套循环
for i in range(y): # 遍历打印每一行
for j in range(x): # 遍历打印每一行的元素
print('x', end=' ') # 因为是由空格分开的
没有换行,所以我们要做第一层循环最后添加一个换行,也就是什么也不打印,但要换行
for i in range(y): # 遍历打印每一行
for j in range(x): # 遍历打印每一行的元素
print('x', end=' ') # 因为是由空格分开的
print()
再试试
我们还剩最后一般交错打印图案
逻辑应该是这样的
if j % 2 - i %2: print('*', end=' ')
else : print('~')
这样我们的代码最后就变成了这样
x = int(input())
y = int(input())
for i in range(y):
for j in range(x):
if i % 2 - j % 2: print('*', end=' ')
else: print('~', end=' ')
print()
这样我们的编程练习就大功告成了
在这个示例中,我们复习了之前的分支结构和循环结构。