# 基础知识
# 布尔值or
# 先做题后思考
"Boolean make the code simply"
# 1 以下函数判断三个人是否都是你的队友。请使用or(布尔运算符)来替换函数体中代码,使代码看起来更简洁。
def is_teammate(name):
if name == "Alice":
return True
elif name == "Bob":
return True
else:
return False
assert_equal(is_teammate("Alice"), True)
assert_equal(is_teammate("Bob"), True)
assert_equal(is_teammate("Charlie"), False)
-- 1 输出应该是三个OK,如果看过我之前的文章Python ---- ‘return’ 结束函数调用,就知道assert_equal是干嘛的。
# replace
if name == "Alice":
return True
elif name == "Bob":
return True
# with
if name == "Alice" or name == "Bob":
return True
-- 1 替换后代码看起来更简洁,功能没变。or是一个布尔运算符,两个布尔值(True或False)。如果A或B中的一个为真,即A为真或B为真,或两者都为真,则表达式A或B为真。只有当A和B都不为真,即都为假时,它才为假。
代到代码中,原本是先判断name是否等于"Alice",如果不等于也就是比较结果返回False,则代码继续判断是否等于"Bob",也不等于则同样返回False,则代码走到else,最后判断是否等于"Charlie"。读到这里你是否跟我一样有个问题,如果判断name等于"Alice",结果是相等也就是返回True,是否还会判断name等于"Bob",答案是不会的,因为return直接就中断函数执行,将True返回给函数。这也就是我们这篇"猪脚"--or 的运算真谛,or 运算符左边的式子如果返回True,则不会继续运算右边的式子,返回True则你可以认为or会用return把运算终结。(记住这里,考试会考)
# 2 连接上一题,因为有些童鞋可能会想,既然让代码更简洁,那么下面这个代码还能怎么变。
def is_teammate(name):
if name == "Alice" or name == "Bob":
return True
else:
return False
assert_equal(is_teammate("Alice"), True)
assert_equal(is_teammate("Bob"), True)
assert_equal(is_teammate("Charlie"), False)
-- 2 让我们来分析下这几行代码
name == "Alice" or name == "Bob"
你有没有注意到上面这行核心代码,是一个布尔值,并且两个return语句都返回布尔值True或False:
- returns
True
whenname == "Alice" or name == "Bob"
isTrue
, and - returns
False
whenname == "Alice" or name == "Bob"
isFalse
.
因此,在这两种情况下,我们可以简单地返回布尔值 name ==“Alice” or name ==“Bob” 本身!
这是简化代码的常用模式。如果你曾经发现自己在写这样的代码:
if x:
return True
else:
return False
其中x本身是一个布尔值(要么是True,要么就是False),你再观察这段代码,最终返回的也是True或者False,所以你可以将这段代码简化为:
return x
最终结果是:
def is_teammate(name):
return name == "Alice" or name == "Bob"
# 3 到这里要特别小心,因为这里会有坑🕳等着你。有些童鞋会说,这段代码在英语中表示的含义是,返回的name是否就等于“Alice”或“Bob”,如果是就返回True,不是就返回False,听上去蛮有道理,但当你运行代码,就会报错。
def is_teammate(name):
return name == "Alice" or "Bob"
assert_equal(is_teammate("Alice"), True)
assert_equal(is_teammate("Bob"), True)
assert_equal(is_teammate("Charlie"), False)
-- 3 运行结果。
OK
Error! 'Bob' != True
Error! 'Bob' != False
-- 怎么会返回Bob,而不是True呢。因为or是一个布尔运算符,所以两边必须都是布尔值(这样等式才能成立)。在上面的代码中,当运行到Bob时,左边返回False,那么现在等式是这样子,
reuturn False or "Bob"
-- 进一步解释当or左边是False,则会继续执行右边,那么看起来是这样
return "Bob"
-- 所以就返回了Bob,而不是True。
# 4 接下来给大家出个题,题目如下:
编写一个名为is_valid_percentage的函数,接受一个数字参数x。如果x在0到100(包括)之间,它应该返回True,否则返回False。你的函数应该只使用or,并通过以下测试:
def is_valid_percentage(x):
# input your code by yourself
assert_equal(is_valid_percentage(-1), False)
assert_equal(is_valid_percentage(0), True)
assert_equal(is_valid_percentage(50), True)
assert_equal(is_valid_percentage(100), True)
assert_equal(is_valid_percentage(101), False)
-- 4 输出结果应该是五个OK
OK
OK
OK
OK
OK
独立完成,多思考,答案下篇给出,谢谢。