视频文稿
打开《编程农场》,发现农场主已经升级好了无人机,让我们去验证上次的程序。其实我们心里已经有了结果,回顾上次写的程序,我们意识到把harvest()函数作为while循环的条件语句是个错误的决定,因为harvest()是先执行移除实体的指令,再进行判断是否移除到了实体, 这里的说的实体应该包含了正在生长的草。也就说只要草在下一次循环,开始条件判断时生长,harvest函数就会一直能移除到实体并返回true,让循环一直进行。之所以之前测试的时候无人机都割到成熟的草是因为无人机本身速度不快,执行割草指令的时间刚好够草生长成熟,这次升级速度后,就没那么幸运了,我们可能会看到无人机不停割掉正在生长中的草。
尽管如此,我们也并不懊悔,因为我们当时可用的函数和语句中也没有其他能解决问题的选择。
执行命令。果然,升级速度后的无人机不停的执行割草指令,完全没有,等草长起来的意思。
我们的程序验证失败,农场主要求我们支付无人机升级的费用,可我们没钱,农场主也不生气,表示可以用工资抵扣,让我们继续干活。
好难过,因为失去了工资,但生活还得继续。查看农场主的任务,发现有了更新:
- 让无人机持续有效的工作;
- 明天有重要客户来农场参观,尽可能保证无人机割草效率下,让无人机表演后空翻并和小猪互动充分展示我们农场的和谐美好。
任务变多变复杂了,但无人机升级的同时我们的操作空间有了新的扩展,新增了can_harvest用于判断植物是否成熟,还有新的if条件语句。
看到can_harvest()函数我们心情复杂,这是升级无人机速度之后才解锁的内置函数,它的作用是判断植物是否成熟,成熟返回true,未成熟返回false,没有其余动作。这正好完美解决我们昨天的问题,只要用它替换while循环条件,再让它无限循环即可。
也不知农场主是否知道升级无人机后会获得新的功能。
分析下任务,我们需要在割草的同时,穿插表演和互动。但是要注意,割草效率是首要的,所以不能因为表演和互动而错过草成熟的时间。
我们回顾下残缺的记忆,if 语句是一种条件控制结构意思是如果…就…,用于根据条件的真假来决定是否执行一段代码。 如果条件评估为 True为真,则执行 if 语句后的代码块;如果为 False为假,则跳过该代码块,执行else语句后的代码块,else的意思是否则;如果遇到复杂选择问题时,还可以增加elif语句,它是else if 的缩写,意思是否则 如果。
例如下面的例子,如果条件1为true就执行代码1,否则,如果条件2为true就执行代码2,否则执行代码3。
它与 while 的关键区别是:
if 是一次判断,执行一次后继续往下走。
while 是循环判断,条件为true时会重复执行其代码块直到条件变为假。
所以:需要重复检测时用 while;只需做一次判断时用 if。
回顾了对if语句的知识,思路变得清晰,我们可以利用循环和条件判断,在草没有成熟的时候进行表演和互动,一旦草成熟就立即收割。
我们只需在while循环下执行草是否成熟的条件判断,如果成熟执行割草,否则执行表演和互动。
想到就做,执行命令。
无人机先割了一次草之后,表演了一次后空翻,然后去摸了猪头,又再次回来割草持续循环。
虽然程序成功按照预期运行,但我们心里还是没底,因为无人机表演和互动的时间有点长,草的生长时间为0.5秒,而后空翻加上摸猪头总共耗时2秒,无人机速度提升后耗费割草时间可以忽略不计,那就浪费1.5秒的时间在表演和互动上,农场主很可能不满意这个效率。
于是我们决定还是在表演和互动中间插入一次割草,这样能最大程度提高一次循环的割草次数;
然而,农场主对程序的效率依然不满意,这是意料之中的事情,但仅凭现有的技术,我们没有其他保证进行表演和互动同时提高割草效率的方案了。
农场主抱怨着离去,扬言要扣我们工资。
我们无能为力。
大家还有什么更有效率的方案吗?
代码
# 割草:harvest()
# 表演:do_a_flip()
# 互动:pet_the_piggy()
# 割草效率是首要的;
# 需要重复检测时用while;
# 只需要做一次判断时用if;
while True: # 持续工作;
if can_harvest(): # 判断草是否成熟;
harvest() # 割草;
else: # 否则执行表演和互动;
do_a_flip() # 翻跟头表演;
harvest() # 割草效率为先;
pet_the_piggy() # 与小猪互动;








暂无评论内容