第2关灭霸的选择
欢迎回来!o(* ̄▽ ̄*)ブ~请和我一起全屏吧~windows:请按F11(或Fn+F11);mac:请同时按control+command+F。
在上一关,老师带领你攻克了如何与Python沟通的语言大关——通过三种数据类型(字符串、整数和浮点数)的相互转换,突破语言差异的墙,将代码成功执行。
但是,对于Python来讲,光掌握正确的沟通语言还不够,还需要正确的沟通逻辑,才能让Python准确地执行你的命令。
我不知道100年后的未来,人工智能会发展到哪一步,但就现在来讲,一切所谓的人工智能都只是服务于人类的机器。
并且,现在的人工智能,不仅是一个超级听话的仆人,还是一个智商不那么“高”的仆人。
所以,在与它沟通时,为了达成某个目标,你要理清自己讲话的逻辑,下达精准的执行命令:在什么情况下,先做什么,再做什么。不然,你得到的只会是“纳尼?侬缩撒?”的黑人问号脸。
比方说,我想让天猫精灵在感知到我开门的一瞬间,打开客厅的灯。如果我只说:天猫精灵,打开灯。那么,由于缺少开门的前提条件,即使你进了门,灯也打不开。
所以,我们下的命令应该是这样:天猫精灵,如果我开门,你就打开客厅的灯。这时,我们就从本拉登,变成了本开灯。
而这个下命令的如果…就…逻辑,就是与计算机沟通的逻辑——条件判断,其作用就是明确地让计算机知道:在什么条件下,该去做什么。
对于Python也是同样。Python之所以能做很多自动化任务,比如自动抓取网页关键词,自动下载小电影等,就是因为它可以执行条件判断。
Python的条件判断,就像霍格沃茨的分院帽,它通过识别你的条件,产生对应的结果,把你分在适合的学院中。
下面,我们来get一下逻辑判断的趣味性。请同学们先点击下面代码框左侧的运行选项,然后在右侧的终端处按照提示语,填写选择的数字。
亲爱的小巫师,你看到没?这就是条件判断如果…就…逻辑产生的魔法。
那么回到现实中,如果你学会了条件判断,你就能干嘛?
比如,做一个告白决策模型,给自己发个好人卡:
再比如,做个测量BMI健康指数程序,输入身高和体重,看看自己是正常、过轻还是肥胖,来老铁扎个心:
那么,这个条件判断的代码,要怎么码呢?
条件判断
在Python宇宙,条件判断语句总共有三种表现形式,我们先从最简单的单向判断:if开始说起:
单向判断:if
单向判断:if代表什么呢?下面,吴枫老师要给大家讲一个《复仇者联盟3:无限宝石》的故事。 (友情提示:即使小同学你没看过电影不知道故事情节,也不会影响你理解代码的。)
A long time ago in a galaxy far, far away……有一位出生于泰坦星,无情、残忍、实力强劲的强者——紫薯精!啊不对,这位强者的名字叫灭霸……
相传,宇宙中存在着六颗宝石——力量、时间、空间、灵魂、现实和心灵。这六颗宝石是宇宙中最强大的东西。如果一个人同时拥有六颗宝石,ta就可以实现包括毁灭宇宙在内的所有事情。
你发现,上面的故事中,有一个如果……就。那么,如果我们要用代码来“翻译”这段话,就可以用条件判断语句中的单项判断:if来表述。直接运行下面这段代码,看看结果。
运行以后结果如下:
那么,这段代码是如何实现的呢?
首先,第一行代码,用赋值运算符=对当前情况进行赋值:将你拥有的宝石个数6赋值给变量——宝石数stonenumber。
第二步,确定if条件:如果变量stonenumber的值>=个数6时,就执行冒号后,下一行的命令。
第三步,用print()命令打印出结果:你拥有了毁灭宇宙的力量。
所以,if语句的单向判断逻辑,我们可以这样归纳:
在这里,你可能注意到了一个细节:在条件判断代码中的冒号:后、下一行内容的前面,会空几个格,但这是为什么呢?
首先,在计算机的沟通语言中,空格的学名叫缩进,比如我们写文章都要空两个格,这就叫首行缩进。
对于Python而言,冒号和缩进是一种语法。它会帮助Python区分代码之间的层次,理解条件执行的逻辑及先后顺序。
并且,在if条件语言中,缩进不需要我们手动按空格键。当你用英文输入法打:后按回车,我们的开发工具(用来编写Python代码的程序)为了方便大家编程,会自动实现下一行代码,向右缩进的功能。
此时,被缩进的内容(print()函数)和if条件语句组成了一个代码块(一个整体),成为了if条件下的内部命令。
这意味着:如果赋值满足if条件,计算机就会准确执行if条件内部的命令。
通俗点讲,我们可以把if当作一个黑社会大哥,冒号后的内容都是他的小弟,当老大if提出一个条件时,他组织下的小弟就会自动执行任务。
那么下面,请你运行下面这个代码,看看运行结果是什么。(请不要更改代码,直接点击运行键,当终端出现红色报错提醒后,点击跳过本题)
这是因为,当我们去掉缩进时,if条件和print命令成为了两个不同的代码组,属于平行关系。你看,print小弟都自立为王了,他自然就不会执行if老大的命令了。
答案B!print()函数才能实现“打印”的操作,而不是if条件判断语句,其它选项正确。
所以,我们总结一下单向判断:if的代码逻辑及语法格式:
下面,我们回到灭霸的故事:当灭霸得知无限宝石的能力之后,他决定集齐六颗宝石,完成灭掉一半宇宙生灵,实现他所谓的“人口控制”计划。
很快,他就通过完虐对手的几场战斗,从其他人手中抢到了两颗宝石,展现漫威宇宙“最强反派”的实力。
虽然还没完成收集6颗宝石的目标,但现在拥有了2颗宝石的灭霸,会拥有怎样的能力呢?
请修改下方代码框中无限宝石的代码:在if条件不变的情况下,修改第一行的赋值语句,把stonenumber=6改为stonenumber=2,并点击运行,看看会出现什么结果。
请注意:1.符号要在英文输入法下输入;2.检查条件判断语句下是否缩进;3.只要显示运行通过,就请点击回车键继续课程。
这时,你可能会在心里犯嘀咕:纳尼?别提结果,为什么连个报错都没有呢?
别急,在这个操作下,终端里不显示结果就是正常的。我来解释一下这是怎么回事儿。
首先,你要知道,第一行的赋值语句stonenumber=6是后面if条件判断语句的前提情况,如果没有这个前提,后面的if条件就没有被判断的对象了。
老师讲过,计算机是一行行往下执行代码的。所以,当第一行赋值情况的前提不满足if的条件时,Python的逻辑就会判断:条件不满足,无法执行if条件下的命令,从而自动跳过,执行下一行命令。
但是,在上面的代码中,除了if之外,我们并没有设置其他的命令去让Python执行。因此,Python自然就无法输出结果。
也就是说,由于灭霸的宝石数量还太少,没有满足6颗宝石的if条件,if条件下的打印命令就无法生效,自然没办法获得摧毁宇宙的力量。
作为最强反派,灭霸当然不会就此善罢甘休,他要继续寻找宝石,直到集齐6颗,达到他的目的为止。
那么,这个如果6颗宝石的条件没满足,就做其他事情——寻找宝石的判断,在Python中要如何实现呢?
双向判断:if…else…
在获得了收藏家手里的现实宝石后,拥有三颗宝石的灭霸选择用狡猾、残忍的手段,逼迫自己的养女卡魔拉,说出了第四颗灵魂宝石的下落——沃弥尔星。
在Python宇宙,我们可以利用if的双向判断形式:if…else…去实现这个行动:当宝石数量还没达到6颗的时候,需要带着卡魔拉去沃弥尔星寻找灵魂宝石。
下面,请你直接运行下面的代码,看程序是如何识别的:
这里,我们应用到了,在上一部分老师曾讲过if条件语句。那么,我们来复习一下,if条件语句代表着什么呢?
答对了答案是A,我们学习的if条件语句是如果…就…的单向逻辑,如果满足条件,就执行结果。
但很多时候,我们不能把鸡蛋放在一个篮子里,要做好两手准备:如果不满足条件时,我们要怎么办。
Python则很贴心地,让我们借用if…else…语句,让码农们有了另一种选择——如果…不满足,就…
还记得我们在讲单向判断if条件时,老师说过if条件下的内容会自动缩进,所以按照这个思路,else前也应该有缩进才对。
可在这个多向判断语句里,为什么我们还要手动删去else前的空格呢?那就让我们先来看看,如果有空格会发生什么吧。
请抄写下方代码框中的代码,将else改为缩进格式(即else前空两格)并点击运行(当终端出现红色报错提醒后,点击跳过本题)。
Python是不是又爆出了让我们头痛的报错【SyntaxError: invalid syntax】(语法错误:无效语法),把我们按在地上摩擦摩擦?
那么,这是为什么呢?为了找到错误,我们得先了解一下正确语法下if和else运行的原理:
首先,当else条件前没缩进时,if和else各自抱团,形成两个不同的代码块。这时,if条件和else条件是平级的。
其次,在平级关系的前提下,他们表示的意思是条件和其他条件的互斥关系——如果不满足if条件,就执行else其他条件。
如果用我们上面宝石的例子讲解的话,if定义的就是宝石数>=6,而else定义的则是宝石数<6。
而由于赋值【stonenumber=3】,并不满足【if stonenumber>=6:】这个条件,所以不能执行【print('你拥有了毁灭宇宙的力量')】的命令。
只能走第二条else:的路——执行print('带着卡魔拉去沃弥尔星寻找宝石')的结果。
现在,我们归纳一下if...else正确运行的语句逻辑:(1)if和else两个条件判断是平级关系;(2)当if条件不被满足时,才会执行else下的命令。
看到没,想让else正确运行有两个关键点——平级和if前提条件:当else有一个和它平级的if前提条件,且这个前提条件无法执行时,才会轮到else发挥作用。
这下,你明白了刚才那段代码报错的原因了吧:
(1)在语法方面,else缺少和它平级的if前提条件(见下图);
(2)第一行的赋值也无法满足if条件。
所以,Python才会犯懵:你到底想让我干啥?算了我报个错吧……
下面,我们来做个练习巩固一下if...else...的知识点:前天晚上,酱酱无比纠结自己要不要吃夜宵,所以她打算上秤称一下,如果体重超过100斤,就不吃了,没有的话,就放心吃。结果……刚好101斤(泪目)……
请在下面代码框里用if...else...把酱酱的夜宵判断语句写出来。【要点提示:1. 为酱酱的体重weight赋值;2. 开始判断,如果if体重超过100斤,打印结果不吃了,否则else,打印结果放心吃吧;3. if和else语句后需跟英文冒号:】
我的答案是这样的:
下面,请看老师的答案,并结合#后的注释同时“食用”:
刚才你自己用if...else...写出了一个基本的条件判断语句。现在,问题又来了:else一定要和if组团,才能运行吗?
并不是,虽然想要让else生效,一定需要一个平级的前提条件,但这个前提条件却不一定是条件判断语句,还可以是后面你会学到的其他命令语句。
可这个和else平级的命令有个限制条件:它不能是一个“一步到胃”的命令——像print()一样直接得出结果的命令,它得是一个需要再处理的命令。
什么叫再处理呢?白话点讲就是:我得先把食物嚼碎了,咽下去才能进到胃里。回归到计算机语言,就是要让计算机先做个判断(如先运行if条件),看是否通过,如果不通过,再运行else。
举一些具体的例子:像我们未来会学到的,让你痛并快乐着的while循环、for循环,这些都是需要再处理的命令,所以他们也可以作为else的平级命令。
下面,请你先看一下这段代码。这是老师在第五关会教给大家的知识点for循环(现在也许你还不能完全看懂这段代码,不要紧,只关注代码中if和else的结构就好。)
发现了吗?在这块代码中,else和if不仅不是平级,而且if语句还缩进了,并且else在if外,比if还高一级。那么,这段代码可以打印出结果吗?
请大家将以上代码,按照格式一字不落地抄写在代码区域中(注意缩进及符号的格式),并点击运行。
你运行出“未找到结果”了吗?在上面这段代码中,由于if缩进,成为了for循环的“小弟”。所以else和for的内部条件if无关,只和它的平级条件for循环有关。
这就意味着:根据计算机一行行往下执行命令的语法特点,计算机会先执行for循环下的代码块,完成后再执行else下的命令。
关于if...else...的相关知识点到这里就讲完了,下面我们来做一道选择题,巩固一下基础知识。
如果你的答案是C,那么恭喜你,答对啦!在这里,赋值的前提是'新垣结衣',满足了if条件,因此,会执行if下的命令,打印出新垣结衣是我老婆。而其它几个选项要么没有满足条件,要么无法打印出需求的结果。
最后,我们来总结一下if…else…语句的知识点。
代码讲解告一段落,我们再回到灭霸的故事中,看他会用怎样的手段抢夺剩下的宇宙宝石。
虽然灭霸找到了灵魂宝石的下落,但获取灵魂宝石的代价,却是献祭他最爱的养女:卡魔拉。纠缠着心痛和不舍的灭霸最后还是选择了成全心中的理想,将卡魔拉推下悬崖,换来了灵魂宝石。
此时的灭霸强大到让人心惊,连钢铁侠、蜘蛛侠、星爵和奇异博士联手都难以抵挡。在连续的战斗之后,灭霸无限宝石的收集之旅,只差最后一颗——心灵宝石。
不巧的是,这颗宝石镶在了其中一个超级英雄:幻视的头上。幻视深知想要阻止灭霸,只能请求自己的爱人红女巫,毁掉自己头上的宝石。
所以,摆在红女巫面前的问题条件是:灭霸已经拥有5颗宝石,如果宝石数大于等于6,世界会被灭霸毁灭;
但是,如果想让宝石数停留在5个及以下,她必须要亲手毁掉幻视头上的宝石,同时,还要从灭霸手中至少夺回一颗宝石,才会有胜利的希望;
或者,还有第三种胜利的可能——如果想让灭霸手中一个宝石都没有,让一切都未曾发生,那么我们需要穿越时空,回到过去。
那么,这三个如果在Python中要如何实现呢?
多向判断:if…elif…else…
国际惯例,在思考如何用代码实现某个目标时,首先,我们需要先来梳理一下逻辑。
通过上面的故事情节我们知道,在代码中,我们需要添加三个如果:如果宝石数>=6,如果3<宝石数<=5,如果宝石数=0。并产生3个对应的执行结果。
那么,在判断3个或3个以上的条件时,我们就需要借助Python中的多向判断命令:if…elif…else…。
这三者共同构成了多向判断的命令逻辑关系:如果if的条件不满足,就按顺序看是否满足elif的条件,如果不满足elif的条件,就执行else的命令。
并且当判断的条件超过3个时,中间的多个条件都可以使用elif,如下图。
那么,这个代码要怎么写呢?我们还是在代码中来感受一下elif的逻辑,直接点击运行就好:
通过上面if和else的积累,多向判断elif的逻辑是不是很好理解?
首先,第一行的赋值,也就是整个条件判断的大前提会按照从上到下的顺序挨个试一遍,看满足哪个条件,满足了就不往下走,不满足就继续试,试到出结果为止。
其次,elif的运行本质上和else一样,都需要一个和elif平级的前提,但是这个前提只能是if。
最后,elif已经带有其他条件的意思,所以elif后也可以不接else。
在上面的代码里,大前提stonenumber=5会对下面的if`elif`else条件逐个扫描,看看自己满足哪一个,就执行哪个条件底下的命令。
很显然,第二个条件elif 3<stonenumber<=5刚好能与stonenumber=5的前提相匹配,于是,执行elif底下的命令:print('红女巫需要亲手毁掉幻视额头上的心灵宝石')
下面,请你练习一下,试着不要看刚才的代码,参考下面的提示,自己来重写一遍刚才我们学过的那段代码,通过修改宝石数的赋值语句,让输出结果变为需要惊奇队长逆转未来。
提示:(1)为宝石数量赋值(数量可为0-3任意数字)(2)条件1:如果宝石数量>=6,显示你拥有了毁灭宇宙的力量(3)条件2:如果3<宝石数量<=5,显示红女巫需要亲手毁掉幻视额头上的心灵宝石(4)条件3:如果是其它情况,显示需要惊奇队长逆转未来
步骤有了,下面,请你来“逆转未来”:
我的代码是这样的:
怎么样,有没有偷看上面的答案呢?说谎的小盆宇会被Python按在地上摩擦摩擦的哟~再来看下老师的答案吧:
下面,我们来总结一下elif的知识点:
但是,不管复仇者联盟怎么竭尽全力,灭霸还是得到了最后一颗宝石。stonenumber的赋值也变为了6,自此,灭霸拥有了毁灭宇宙的力量。
未有任何喘息,在所有人还在悲伤、震惊、痛苦中徘徊时,灭霸举着镶满了6颗宝石的无限手套打出了响指。
然后,我们迎来了最不想看到的结果:
(友情提示:前方高能预警,非战斗人员请迅速撤离现场……)
虽然套着超级英雄的衣服,但蜘蛛侠彼得·帕克也仅仅是个18岁的高中生而已,在死亡面前他会感到害怕。当然,他也像所有18岁的青少年一样,有着自己成长的烦恼。
他曾只顾忙着在街头巷尾当超级英雄,结果在期末历史考试里只考了26分,荣获“学渣”提名。
但这个“学渣”评价并不是随便来的,而是通过规则一步步过滤出来的:
像这种如果底下还有如果、条件里还套着条件的情况,我们要如何用Python把上面的规则写出来,并得出专属于彼得·帕克的成绩评价呢?
答案就是,我们需要用到嵌套:
if嵌套
if嵌套的应用场景,简单来讲就是:在基础条件满足的情况下,再在基础条件底下增加额外的条件判断。
就像上面的基础条件是60分及格,想要判断优秀和一般还要增加额外条件。
因此,彼得·帕克的成绩评价规则,用if嵌套可以这样写:
居然出现了三个扎心的结果……那么,在Python中,我们如何同时得出不及格、学渣、程序结束这三个结果的呢?
首先,我们先从整体总览一下,这段彼得·帕克成绩评价规则的代码总共分为四部分(分别是赋值、if、else、print()),两个大代码组。
根据缩进看,这四个部分都是平级关系。并且,在if和else的代码组里面,又包含了条件判断命令if...else...。这正是嵌套在实际代码中的使用方式。
这其中,if hsitoryscore>=60是第一条件;if historynumber>=80是在满足了60分后的第一个额外条件;而与if historynumber>=80平级的else条件,则是满足60分后的第二个额外条件。
那么,这种嵌套命令我们要如何理解呢?这就需要你回想一下,老师曾教给你的4个知识点:1.缩进;2.冒号:后的从属关系;3.命令按顺序执行;4.if和else条件的互斥。
首先,我们曾学过,缩进相同的平级命令都是老大,都是有头有脸的人物,谁都不能怠慢。所以,第一步,计算机就要按顺序一条一条地跟老大们“打招呼”(按顺序执行命令)。
那么,计算机执行的顺序就是:(1)接受带头大哥1号的赋值;(2)因为if大哥和else大哥是只能留一个的互斥关系,所以计算机要根据赋值,判断赋值的内容是满足2号还是3号的条件。
如果满足if大哥的条件,就执行if大哥的命令,如果不满足就执行else大哥的命令;第三步,执行带头大哥4号的固定命令。
下面,吴枫老师又要开启提问模式了,如果回答正确请找酱酱学姐给你放烟花啊:
你选择C,那么恭喜你答对了,else条件代表的范围是historyscore<60,包含historyscore=26,记得找酱酱学姐给你放烟花啊~
经过判断,我们知道了,蜘蛛侠26分的历史成绩要找带头大哥3号。然而,问题又来了,else大哥后面不仅跟着三个print(),还有if,所以我到底要输出哪个?
你看一个体制健全生生不息的黑社会,哪有扁平式管理的?不都是老大下还有中层,中层下还有小头目,小头目下还有组长,组长下才是真正搬砖的。
所以,计算机语法的执行逻辑永远都不会变:else下的代码也要一行一行往下执行,根据缩进判断层级、在对应条件下运行对应的层级,并输出对应层级下的结果。
所以,我们的运行顺序是,先输出组长1号的结果不及格,然后再判断历史成绩26分的赋值符合组长2号:历史成绩<60分且<30分还是组长3号:历史成绩<60分且>=30分的条件。
下面,我们再通过一张导图理一下if嵌套的逻辑,老师建议你把这张图收藏起来,接下来写嵌套代码的时候可以翻看:
要注意的是,elif也是可以放进嵌套里的,就是在上述结构的基础上,多加一个带头大哥elif条件,以及底下跟着的elif条件的小弟就好。因为用法及结构是一样的,在这里就不重复讲解了。
说了这么多,对于if嵌套你掌握得怎么样?可以自己脱离课本,自己码出一段if嵌套了吗?
下面,我将教给你一个写出嵌套条件代码的小技巧。
如何写嵌套代码
if嵌套由于涉及多个条件判断,并且是条件套条件的判断,所以对于新手来说,可能会将逻辑搞混。为了理清逻辑,我们可采用扒洋葱大法写if嵌套。
如果我们想要自己写出上面“彼得·帕克的历史成绩”那样的嵌套代码,第一步就是:我们要搞定最外层那张皮,将最基础的命令和条件写出来。
那么,我们的思考逻辑应该是这样
(1)把彼得·帕克26分的历史成绩赋值到变量historyscore;
(2)用if…else写最基础判断条件如果historyscore>=60时,打印你已经及格,否则,打印不及格;
(3)用print( 出程序结束。
来来来,跟老师动起来,请根据上面提示自己写一遍代码,并点击运行。看在成绩为26分的赋值情况下,只套了第一层条件判断皮的代码,会出现怎样的结果:
运行通过了吗?正确的话,你应该会看到终端显示不及格、程序结束。老师的答案是这样子的:
第二步,在“第一层皮”里装东西。也就是在条件【historyscore>=60】下,增加额外条件。
其中,额外条件1:当历史成绩大于80分,显示结果你很优秀;额外条件2:当历史成绩在60到80分之间,显示结果:你只是一般般。
下面,请你先看一眼正确的代码,并注意我是怎样安排额外条件的代码的。
到你了,请同步把上面那段代码写一遍,如果能够做到不看上面的答案,独立写出来是最好的。【要点提示:请注意额外条件的缩进格式】。
最后一步,你要为另一个大条件else增加额外条件了!
请你以下方代码框中出现的代码为基础,在else底下增加上面两个额外条件。
其中,额外条件1:当历史成绩小于60,同时还小于30时,输出结果学渣;
额外条件2:当历史成绩小于60,但大于等于30时,输出结果还能抢救一下。
我的代码运行结果是这样的:
怎么样,洋葱大法好不好?顺利码出来了吗?如果你能成功运行出不及格、学渣、程序结束的扎心结果的话,证明你已经初步掌握嵌套代码的写法啦。
不过,就算没写对也不要紧,勤做练习,后面还有更多的实操检验机会!
最后的最后,我们来总结一下整节课的知识点:
这关的课程就到这里了,你学习的怎么样呢?在下一关,我们将通过“霍格沃茨的来信”,一同学习用input()函数与计算机进行交互沟通的方法。
答案是B,当多个条件存在时,else不是必须的,可以if…elif…elif。
最后,老样子。课后有两道练习,一道是初阶的必做题,一道是进阶的选做题。大家要记得完成哦,如果有不懂的,微信找酱酱去~
那么,我们下一关见啦(o≖◡≖)✧
网友评论