Skip to content

Latest commit

 

History

History
287 lines (221 loc) · 6.65 KB

263-203377-跳过猜丁壳_pass.sy.md

File metadata and controls

287 lines (221 loc) · 6.65 KB
show version enable_checker
step
1.0
true

比较运算符

回忆

  • 这次了解了 elif
  • elif 就是 else + if
  • 可以构成多分支语句
  • 不过在这个某些分支上
  • 我想啥都不做
  • 却出现了问题
  • 能否做到啥都不做呢???🤔

修改代码

图片描述

  • 问题就在于 num == 0 的时候
  • 没有任何语句
  • 我让他打印空字符串
  • 并且最后也不要加换行
  • 可以么?

图片描述

  • 可以倒是可以
  • 但是其实我要的是啥都不干
  • 但是他还是调用了 print 函数
  • 能否完全啥也不干呢?

pass

  • 有这么一个关键字 pass
  • 他的意思就是啥都不做
  • 就像玩牌的时候
  • 什么都不出
  • 就是 pass 直接过

图片描述

  • 可以用么?

代码

图片描述

  • 这样真的就可以啥都不用做
  • 而且也通过
  • 帮助手册里究竟是怎么说的呢?

手册

图片描述

  • pass 是空运算
  • 当被执行的时候
  • 没有任何事情发生
  • 他是有用的占位标志
  • 当需要一个语句
  • 但是并不做任何事的时候
  • 就可以用 pass
  • 甚至可以定义空的函数和类
  • 但是就事论事
  • 我们这个代码可以再优化

再优化

图片描述

from random import randint
num = randint(1,10) - 5
if num > 0:
	print("more than 0")
elif num < 0:
	print("less than 0")
  • 这样,首先引入随机
  • 确保条件判断有意义
  • 然后处理了两个条件
  • 最后等于 0 的时候
  • 自然什么也不做
  • 也就相当于 pass
  • pass 更多用在哪里呢?

pass 填充分支路径

  • 比如原始程序是这样的
from random import randint
num = randint(1,10) - 5
if num > 0:
	print("more than 0")
  • 这肯定没有任何问题
  • 但是如果我想注释掉满足条件时所执行的语句
from random import randint
num = randint(1,10) - 5
if num > 0:
	#print("more than 0")
  • 但是这个程序运行会直接报错

图片描述

  • 这是一个经典的错误
  • 其实我们只需啊要加上 pass
  • 程序逻辑不变,条件分支保留
  • 而且也能执行了
from random import randint
num = randint(1,10) - 5
if num > 0:
	#print("more than 0")
	pass

完成功能

图片描述

  • 这样我这个功能就完成了
  • 而且啥都不干的位置就是啥都不干
  • 这个程序现在是一个多分支
  • 可以做成嵌套么?
  • 可以,但没有必要
  • 这种根据一个变量判断
  • 能用一层条件解决的问题
  • 没有必要用两层条件
  • 那什么时候需要用嵌套呢?
  • 比如面对两个变量

图片描述

两个变量

图片描述

  • 一个是我出的
  • 还有一个是电脑随机出的
  • 这个手势有相应代码吗?

unicode

图片描述

  • 这个是有的
  • mac 的 iterm2 上可以用

图片描述

  • 可是目前 xfce 的 terminal 对于 emoji 还不支持
  • 我们选择字符串元组来描述手势

构建基础

图片描述

  • 然后讨论可能性

第一层条件

图片描述

  • 根据我的选择
  • 三种可能性
  • 每种可能性下
  • 电脑还有三种可能性

第二层条件

图片描述

  • 可以完成程序
  • 不过这个程序有点复杂
  • 可以简化一下吗?

简化

  • 首先如果相等,肯定是平局
  • 先把三种可能性合并
  • 然后再对手势分类讨论

图片描述

  • 不过这个代码中有一个小瑕疵
  • 可以优化的
  • 你可以看出来吗?

修改之后

from random import randint
hands = ("Rock","Scissors","Paper")
choice = int(input("input(O:Rock,1:Scissors,2:Paper):"))
computer = randint(0,2)
print("you:",hands[choice]," ; computer:",hands[computer])
if choice == computer:
    print("draw!")
else:
    if choice == 0:
        if computer == 1:
            print("you win")
        else:
            print("you lose")
    elif choice == 1:
        if computer == 0:
            print("you lose")
        else:
            print("you win")
    else:
        if computer == 0:
            print("you win")
        elif computer == 1:
            print("you lose")
  • 其实主要是如果出手相同
  • 原来代码还需要进入下面一大长串的判断
  • 新代码由于 else 的存在
  • 会节省一点点时间和能源
  • 但是这个东西容错性不好
  • 我怎么知道输入的能否转化为 0、1、2 呢?

提高鲁棒性 容错性处理

from random import randint
hands = ("Rock","Scissors","Paper")
s_hand = input("input(O:Rock,1:Scissors,2:Paper):")
if s_hand not in ['0', '1', '2']:
	print("not proper choice!exit!")
	exit()
choice = int(s_hand)
computer = randint(0,2)
print("you:",hands[choice]," ; computer:",hands[computer])
if choice == computer:
    print("draw!")
else:
    if choice == 0:
        if computer == 1:
            print("you win")
        else:
            print("you lose")
    elif choice == 1:
        if computer == 0:
            print("you lose")
        else:
            print("you win")
    else:
        if computer == 0:
            print("you win")
        elif computer == 1:
            print("you lose")
  • 这样就让程序更加健壮
  • 提高了 Robustness
  • 翻译叫做鲁棒性
  • 这个词是我们从日本间接获取的

图片描述

  • 而且报错信息更加明确了

总结

  • 这次完成了综合案例 - 猜丁壳
  • 猜丁壳中有两个变量
    • 你的选择
    • 电脑的选择
  • 这样就构成了嵌套的条件结构
  • 一般来说这种条件结构无法转化为多分支
  • 是不是绝对无法转化为多分支呢???🤔
  • 下次再说 👋