Day 12:Python基本介绍05 | 流程控制、回圈

各位安安,今天讲的是对任何程序语言都很重要也很基础的流程控制回圈的概念,如果你先前已经学过其他程序语言了,那你一定很快就能学起来,如果你之前没学过也没关系,今天学完後以後在学其他程序语言时也可以受惠。

流程控制

想像你每天出门时,会依照条件决定要不要带伞,你的条件是:

如果今天下雨机率大於80%,我出门就带伞。

则转换成程序码後就会是...

rain_prob = 90    # 表示下雨机率

if rain_prob > 80:
    print("出门要带伞!")

这里因为下雨机率的确大於80,所以程序会提醒你要带伞! (这里我用print()来表示行动)。

但如果下雨机率小於80呢,假如你将下雨机率改为70,你会发现程序什麽东西都没有印,那原因就是因为我们没告诉程序条件不成立时该怎麽做。

所以要将上面程序码稍作修改...

rain_prob = 70

if rain_prob > 80:
    print("出门要带伞!")
else:
    print("不用带伞了~")

这是人类和程序的逻辑很不一样的地方,我们会很下意识地认为说,如果下雨机率没有大於80,那我们就应该不会带伞出门。但程序不是这样,你一定要很清楚地告诉他如果条件不符合时该怎麽做,他才会照着你的意思走。

再来,我们可以加上稍微复杂一点的条件,比方说:

如果今天下雨机率大於80%,而且我不开车上班,我出门就带伞。

转换成程序码後...

rain_prob = 90
drive = True

if rain_prob > 80 and not drive:
    print("出门要带伞!")
else:
    print("不用带伞了~")

修但几累...突然间出现两个没看过的关键字耶? 别紧张,我们一个个来看。

  • and,连接两个布林值,如果两个布林值都是True,and後的结果才是True,否则就是False。
  • not,将布林值反转,简单讲就是True变成False,False变成True。

顺便补充一下or

  • or,连接两个布林值,如果两个布林值其中一个为True,or後的结果就是True,否则为False。

整理成真值表後就是底下这样:

Python的andornot已经算非常直白易懂了,作为比较,在C语言中会对应成&&||!

回到上面例子,虽然说下雨机率大於80没错,但因为我要开车的关系,所以最後 True and False 的结果还是False,就不用带伞了~

然後,我们还可以加上更多的条件:

如果下雨机率大於80,出门要带伞,但如果下雨机率在60~80间,带个帽子出门就好了。

等同於下面的程序码...

rain_prob = 70

if rain_prob > 80:
    print("出门要带伞!")
else:
    if rain_prob > 60:
        print("带个帽子就好")
    else:
        print("都不用带~")

这是巢状if的结构,如果第一个条件不成立(下雨机率小於等於80),则验证下一个条件,如果成立(下雨机率大於60),下雨机率就真的在60~80间,则戴顶帽子就好了!

上方的程序码还可以再简化,就写成...

rain_prob = 70

if rain_prob > 80:
    print("出门要带伞!")
elif rain_prob > 60:
    print("带个帽子就好")
else:
    print("都不用带~")

elifelse if 的缩写,中文意思上有点 "要不然..." 的含意,也就是上方条件如果不符合时,才会检查这个条件,如果全部条件都不符合,则执行else中的程序。

跟上面的程序码的逻辑是一模一样的,但比较起来行数就少一行,所以尽量能用elif就用elif来简化你的程序码。

回圈

回圈用於处理重复性高的工作,可帮助你省下许多程序码。

for回圈

假如我现在想要印出1~10,那我会这样写:

for i in range(1, 11):
    print("i =", i)

执行结果:

i = 1
i = 2
i = 3
i = 4
i = 5
i = 6
i = 7
i = 8
i = 9
i = 10

我们来看看for回圈做了什麽事。

首先这个range(1, 11)事实上是个产生器(generator),但如果要讲产生器是什麽,就可以花掉一天了XD,想了解产生器的话可以看我之前写的这篇或别人写的这篇也满推荐的。

我们这边就从简,当作他是一个从1到10的List,就像这样:[1, 2, 3, ..., 10]

接着for回圈就从头开始(1),一次取一个元素,取完後往前+1,这样一次称为一个迭代,就这样重复执行,直到List结束(10)。

还记得昨天和前天教的容器(Collection)吗? 他们其实都是可迭代的,也就是说,都可以透过for回圈走访一个个的元素。

mylist = ["A", "B", "C", "D", "E"]

for elem in mylist:
    print(elem)

执行结果:

A
B
C
D
E

也可以在for回圈中放入for回圈,这称之为巢状for回圈。

使用巢状for回圈就可以轻易地印出九九乘法表了!

for i in range(1, 10):
    for j in range(1, 10):
        print("{} * {} = {:2d}, ".format(i, j, i*j), end="")
    print()

结果:

1 * 1 =  1, 1 * 2 =  2, 1 * 3 =  3, 1 * 4 =  4, 1 * 5 =  5, 1 * 6 =  6, 1 * 7 =  7, 1 * 8 =  8, 1 * 9 =  9, 
2 * 1 =  2, 2 * 2 =  4, 2 * 3 =  6, 2 * 4 =  8, 2 * 5 = 10, 2 * 6 = 12, 2 * 7 = 14, 2 * 8 = 16, 2 * 9 = 18,
3 * 1 =  3, 3 * 2 =  6, 3 * 3 =  9, 3 * 4 = 12, 3 * 5 = 15, 3 * 6 = 18, 3 * 7 = 21, 3 * 8 = 24, 3 * 9 = 27,
4 * 1 =  4, 4 * 2 =  8, 4 * 3 = 12, 4 * 4 = 16, 4 * 5 = 20, 4 * 6 = 24, 4 * 7 = 28, 4 * 8 = 32, 4 * 9 = 36,
5 * 1 =  5, 5 * 2 = 10, 5 * 3 = 15, 5 * 4 = 20, 5 * 5 = 25, 5 * 6 = 30, 5 * 7 = 35, 5 * 8 = 40, 5 * 9 = 45,
6 * 1 =  6, 6 * 2 = 12, 6 * 3 = 18, 6 * 4 = 24, 6 * 5 = 30, 6 * 6 = 36, 6 * 7 = 42, 6 * 8 = 48, 6 * 9 = 54,
7 * 1 =  7, 7 * 2 = 14, 7 * 3 = 21, 7 * 4 = 28, 7 * 5 = 35, 7 * 6 = 42, 7 * 7 = 49, 7 * 8 = 56, 7 * 9 = 63,
8 * 1 =  8, 8 * 2 = 16, 8 * 3 = 24, 8 * 4 = 32, 8 * 5 = 40, 8 * 6 = 48, 8 * 7 = 56, 8 * 8 = 64, 8 * 9 = 72,
9 * 1 =  9, 9 * 2 = 18, 9 * 3 = 27, 9 * 4 = 36, 9 * 5 = 45, 9 * 6 = 54, 9 * 7 = 63, 9 * 8 = 72, 9 * 9 = 81,

while回圈

while回圈和for回圈不同点在於,while回圈没有给定一个明确的范围。while回圈会一直执行直到条件变为False或遇到break。

刚才数1到10的while回圈版本:

i = 1
while i < 11:
    print("i =", i)
    i += 1

i一开始是1,所以i < 11这个条件是True,因此回圈会执行print()和i+=1,但是执行到第10次时,i+=1後i就变11了,就不满足i < 11了阿,所以就会跳出回圈,结束程序。

除此之外也可以用break跳出回圈:

i = 1
while True:
    if i > 10:
        break
    print("i =", i)
    i += 1

就如同上一个while回圈,当i=11时,因为满足i > 10的条件,所以会执行break,跳出回圈。

小结

今天教了写程序中,很基础却也很重要的条件控制(if...else...)和回圈(for、while),以我写程序的经验来看,百分之七十的程序码都是由这些组成的,就可以得知这两个的观念有多重要的吧!

因为篇幅有限,只能让你快速的对Python的语法有个了解,还有很多观念都没有讲到,所以如果你是初学程序者的话(就是连条件控制和回圈的观念都没有的话),其实我是不太建议你看我的文章学(怕误人子弟),可以改看其他基础程序教学,到Google搜寻就有很多罗~ 或许我之後也会再出基础教学的系列 (先立Flag?

毕竟我是资工系本系,又是从C语言开始学程序的,对if和for这种东西早就用到比呼吸还自然了,一时间要写文章还真不知道要怎麽讲解XD,我已经尽量用最简单的方式去解释了,希望能让在座各位听得懂,如果有不懂或觉得怎样写会更好的,都欢迎在底下留言哦!

明天就是Python基本介绍的最後一天了! 我将介绍函数、读写档案、引用的观念,那麽,我们明天见(๑•̀ㅁ•́๑)✧


如果喜欢这系列文章麻烦帮我按Like加订阅,你的支持是我创作最大的动力~

本系列文章以及范例程序码都同步更新在GitHub上,後续会持续的更新,如果喜欢也麻烦帮我按个星星吧~

有任何问题或建议,都欢迎在底下留言区提出,还请大家多多指教。


<<:  Day17 Middleware - Kafka & Redis

>>:  Day5给你一个漂漂的导览列大家说好不好!

易用性、无障碍、通用、包容性设计 — part1

最近看设计相关文章时,常常会看到这四个名词,usability、accessibility、univ...

CLOUDWAYS主机限时6折优惠码,只到2021/12/1

优惠码BFCM2021 优惠时间:只到2021/12/01 折扣内容:首四个月6折(适用於所有方案)...

Day 26 排程管理

Day 26 排程管理 假设今天在架设一台服务器运作使用时,但很怕资料库或程序被误删等状况,这时候就...

食谱搜寻系统制作_上

制作目标 搜寻选择、使用者输入 Node.js从版本7开始提供readline模组,从可读串(例如p...

进击的软件工程师之路-软件战斗营 第十一周

学习进度 Android Studio View(View、Image view、Text view...