pepple:30
cars:20
buses:40
输出结果:
We should not take the cars.
That's top many buses.
Alright, let's just take the buses.
基本就是这段代码按着你输入的数据,选择语句打印出来。那么,elif是什么呢?
想必大家也看出来了,其实就是python中的将if else 缩写成了elif:,这就很符合python的特点了:优美简洁。
那么我想问三个问题:
①你认为if对它的下一行代码做了什么了?
②为什么if语句的下一行需要四个空格的缩进,不缩进会怎么样?
③如果多个elif块都是True,Python会如何处理?
大家心里有答案了吗?
①if语句为代码创建了一个所谓的分支。if语句告诉你的脚本:如果这个布尔表达式为真,就运行分支的内容,否则就跳过。
②行尾的冒号的作用就是告诉Python接下来你要创建一个新的代码块。如果没有缩进,就会报错。因为Python的规则里,只要一行以冒号(:)结尾,接下来的内容就必须缩进。
③Python只会运行遇到的第一个True块,余下的直接跳过。
那么,大家学了了上面,应该有能力写出更加有趣的程序出来了,熟练使用if,else,elif创建包含条件判断的脚本了,不妨花点时间试试写一段程序。
在这儿我要罗嗦一下,你可以在if语句内部再放一个if语句,这是一个很强大的功能,可以用来创造嵌套的决定,其中一个的分支引向另一个分支的子分支。
有人会问,如果想实现4个以上的判断呢?很简单,多写几个elif块就行了。
小弟不才,我也写了一个一段家庭情况调查的代码,这段代码我大概讲一下:
首先要你输入爸妈的姓名,然后问你有没有兄弟姐妹,如果有的话,要你输入爸妈和兄弟姐妹的年龄。如果没有,要你输入爸妈的年龄。
print("Today,You'll introduce your family members to you.")
print("Please write down your information about your family.")
father=input("What's your father name?>")
mother=input("What's your mother name?>")
other_people=input("Do you have brother or sister?which?>")
if other_people == 'brother' or other_people == 'sister':
other_people_name=input("What's your %s name?>"%other_people)
print("Right,your family has four members now,\nfather:%s\nmother:%s\n%s:%s\nand you.\n"
%(father,mother,other_people,other_people_name))
father_age=int(input("Please write down your father age:"))
mother_age=int(input("Please write down your mother age:"))
other_people_age=int(input("Please write down your %s age:"%other_people))
if (father_age >mother_age) and (mother_age > other_people_age) and (father_age > other_people_age):
print("Well,your family is very harmonious.\n")
elif (father_age < mother_age) and (mother_age>other_people_age)and (father_age>other_people_age):
print("Oh,your mother may be a family leader.\n")
else:
print("What the fuck?you may write wrongly.\n")
else:
print("Right,your family has there members now,\nfather:%s\nmother:%s\nand you.\n"
%(father,mother))
father_age=int(input("Please write down your father age:"))
mother_age=int(input("Please write down your mother age:"))
if father_age >mother_age:
print("Well,your family is very harmonious.\n")
else:
print("Oh,your mother may be a family leader.\n")
print("Thanks for your time.")
输出结果是这样的:
Today,You'll introduce your family members to you.
Please write down your information about your family.
What's your father name?>master
What's your mother name?>paopao
Do you have brother or sister?which?>brother
What's your brother name?>didi
Right,your family has four members now,
father:master
mother:paopao
brother:didi
and you.
Please write down your father age:50
Please write down your mother age:45
Please write down your brother age:10
Well,your family is very harmonious.
Thanks for your time.
当然了,加粗的内容部分是我键入回答问题的内容,怎么样,我写的这段程序还可以吧?
如果你输入的兄弟姐妹的年龄大于你的爸妈,这个程序会反馈你:What the fuck?you may write wrongly.
有兴趣的,可以复制过去自己运行试试噢,嘿嘿。
不过,不要太过于对自己的代码盲目,时刻对自己的程序有一个批判的态度,我写出来的程序并非最佳的程序,问题还是很多:
①只能支持一个兄弟姐妹的情况,有些人家里有两个哥哥姐姐,在这段程序中无法得到反馈。
②代码有太多重复的地方,不知道如何去最简化。
③妈妈的年龄不一定一定要比兄弟姐妹年龄大,有些父亲可以找年轻的后妈啊,比自己的儿女年轻……咳咳,扯远了,大家忽略这一条。
总之,你们看到这儿,你们最好也去尝试写一段if/elif/else代码,锻炼自己的动手能力,写完之后审视一下自己写的程序有哪些不足。
好了,我们接下来来介绍一下列表和while的知识:
while循环,顾名思义,会一直执行它下面的代码块,直到它对应的布尔表达式为False时才会停下来。
和if语句不一样的是,它下面的代码块不是只被运行一次,而是运行完后再跳回到while所在的位置,如此重复进行,直到while表达式为False为止。
那么我直接贴出列表和while的程序:
elements=[]
for i in range(0,5):
print("This one is %d"%i)
elements.append(i)
print("The element:",elements)
print(" ")
print("Now,the elements:",elements)
输出结果:
This one is 0
The element: [0]
This one is 1
The element: [0, 1]
This one is 2
The element: [0, 1, 2]
This one is 3
The element: [0, 1, 2, 3]
This one is 4
The element: [0, 1, 2, 3, 4]
Now,the elements: [0, 1, 2, 3, 4]
相信大家都能看得懂这段代码和运行结果,这儿就简单说一下吧:
append()到底是什呢?
它的功能是在列表的尾部追加元素。
for循环和while循环有什么不同?
for循环只能对一些的集合进行循环,while循环可以对任何对象进行循环,然而,while循环比起来更难弄,一般的任务用for循环更容易一些。
访问列表的元素到底是个什么情况呢?
这就是涉及到基数和序数了,扯概念的话估计也不懂,我用英语举例子,one,first。能理解了吗?一和第一的区别。只是在python列表中第一个基数是以0开始的,但它对应的是序数第一。
好了,现在已经到了一个激动人心的时刻了,本篇文章迈入一个高潮的时刻,前方高能,请备好纸巾。
我将放出一个游戏的代码程序,大家试着花时间去理解这个游戏:
from sys import exit #从sys功能包调用exit功能
def gold_room():
print("This room is full of gold. How much do you take?\n")
next=int(input("> ")) #经过优化过的代码
if next >= 0:
# next =input("> ") #这代码欠缺优化
# if "0" in next or "1" in next:
how_much=int(next)
else:
dead("Man,learn to type a number.\n")
if how_much <50:
print("Nice,you're not greedy,you win!")
exit(0) #exit(0)表示程序正常退出。在本段程序中,就是一个死亡的意思,游戏失败。
else:
dead("You greedy bastard!")
def bear_room():
print("There is a bear here.")
print("The bear has a bunch of honey.")
print("The fat bear is in front of another door.")
print("How are you going to move the bear?")
print("take honey or taunt bear?\n")
bear_moved = False
while True: #创建一个无限循环。
next=input("> ")
if next == "take honey":
dead("The bear looks at you then slaps your face off.")
elif next =="taunt bear" and not bear_moved:
print("The bear has moved from the door. You can go through it now.")
bear_moved =True
print("open door or taunt bear again?\n")
elif next == "taunt bear again" and bear_moved:
dead("The bear gets pissed off and chews your leg off.")
elif next== "open door" and bear_moved:
gold_room()
else:
print("I got no idea what that means.")
def cthulhu_room():
print("Here you see the great evil Cthulhu.")
print("He, it, whatever stares at you and you go insane.")
print("Do you flee for your life or eat your head?\n")
next =input("> ")
if "flee" in next:
start()
elif "head" in next:
dead("Well that was tasty!")
else:
cthulhu_room()
def dead(why):
print(why,"Good,job!")
exit(0)
def start():
print("You are in a dark room.")
print("There is a door to your right and left.")
print("Which one do you take?\n")
next=input("> ")
if next=="left":
bear_room()
elif next == "right":
cthulhu_room()
else:
dead("You stumble around the room until you starve.")
start()
我会给你们时间消化这段代码,并让它成功运行出来。然后问你们五个问题:
①开头的时候,我优化了以下两行代码:
next =input("> ")
if "0" in next or "1" in next:
请问,如果按这两行在里面运行,你们会遇到什么BUG?
优化成下面这两行代码过后,问题得到解决了?
next=int(input("> "))
if next >= 0:
②你能把这游戏的地图画出来吗?并把自己的路线也画出来。
③为什么会加入while True的无限循环?有什么意义?
④去查询一下exit(0)有什么意义?
⑤dead()到底是什么原理,在程序中有什么作用?
给大家一定的时间去解答一下这四个问题,停止向下浏览吧。
①如果按原代码运行,如果你要键入9,这段代码就会报错,因为它的要求就是要你输入含有0或1的数字,很显然这不合规矩。
所以优化之后,你输入的任何数字都转换为整数形式,符合用户输入的需求。
②我大概画了一个比较好看的地图,不喜勿喷,我觉得我画得很好。
然后我说一下我成功的路线吧,就是右转进入恶魔室,忽然反悔,安全回到了起点,左转进入大熊室,我选择了嘲讽大熊,
这时候熊让开了,我进去了黄金室,拿了49个黄金,被表扬不贪婪,游戏成功。
You are in a dark room.
There is a door to your right and left.
Which one do you take?
> right
Here you see the great evil Cthulhu.
He, it, whatever stares at you and you go insane.
Do you flee for your life or eat your head?
> flee
You are in a dark room.
There is a door to your right and left.
Which one do you take?
> left
There is a bear here.
The bear has a bunch of honey.
The fat bear is in front of another door.
How are you going to move the bear?
take honey or taunt bear?
> taunt bear
The bear has moved from the door. You can go through it now.
open door or taunt bear again?
> open door
This room is full of gold. How much do you take?
> 49
Nice,you're not greedy,you win!
当然了,老规矩,加粗的自然是键入的数据。
但是这世界不缺作死的人,嘲讽大熊还不够,想要继续得瑟,会再次回到选择门,直奔熊而去。
You are in a dark room.
There is a door to your right and left.
Which one do you take?
> left
There is a bear here.
The bear has a bunch of honey.
The fat bear is in front of another door.
How are you going to move the bear?
take honey or taunt bear?
> taunt bwar
I got no idea what that means.
> taunt bear
The bear has moved from the door. You can go through it now.
open door or taunt bear again?
> taunt bear again
The bear gets pissed off and chews your leg off. Good,job!
很显然,愤怒的大熊受不了你的再次嘲讽,选择了卸掉了你的腿,游戏失败。
当然,有人可能注意到了,我输错了一次,又回到了选择的阶段,不影响本次代码的继续运行,那么这就是第三个问题了,也就是While True。
③While True的意义当然很大了,你也看到了,我输错了之后,这段代码块并没有报错,而是打印了一条消息又经While True无限循环回到了开始选择门的阶段。
还有一个重要的作用就是,选择之后还有选择,就像你嘲讽大熊成功之后,后面还有一个开门进入黄金屋的选择啊。
如果你没有While True的话,你嘲讽大熊成功之后,这个if/elif/else的代码块就结束了,游戏也就结束了。就不会有后面开门进入黄金屋通关游戏的选择了。
当然了,如果恶魔屋输错了怎么办,我们可以看到恶魔屋的else的语句就是为输错而准备的,会反复让你停留在恶魔屋,直到你输入对了为止。
那么有人就会找茬,黄金屋不输入数字怎么办?
emm……这段代码会直接报错,玩游戏还是要遵守规则。不过你直接输入-50的话就不会报错了,会判定你死亡噢!
④exit(0)可以说是核心了,我们先来看看作用,在很多类型的操作系统里,exit(0)可以中止某个程序,可以表示正常退出程序。
当然了,你可以用不同的数字参数表示不一样的错误,比如exit(1)和exit(100)是不同的错误。要使用exit()首先就得从sys模块引入。
回到正题,exit(0)就是dead函数的核心,我们来看下一题。
⑤做一个有成功和失败的游戏程序,创造dead函数是不可避免的,定义一个dead函数里面,打印出死亡的原因,然后用exit(0)结束这代码,表示游戏的结束。
永远都不要害怕看懂长长的代码,我的推荐方法就是拆开来看,然后再又贯通起来,画一张地图,就可以慢慢去理解这段代码了。
那么,你们试过把加粗的字体反过来看吗?
画一张地图,确定各部分之间的联系,然后拆开各部分写程序,最后连起来。
没错,我布置的任务就是要你制作一个不同类型的游戏,运用本章的知识点,结合上一行加粗的字体的方法,再看看下面:
1.每一条if语句必须包含一个else。不为什么,就是为输错的情况而准备的。
2.如果else不被使用,那将没有任何意义,你要么加个While True再给用户机会,要么就dead安排用户出局。
3.使用if/elif/else使应当耐心,将它们看成一个个段落。每个段落之间适当用一个空行隔开,增加代码的可读性。
4.如果if后面的布尔测算句子很复杂,可以尝试先赋予到一个取好名字的变量里面,也是增加代码可读性。
祝你能够成功写出一个游戏!