每当我运行此功能时,输出为
You found emerald!
为什么? 由于极少有3/999的机会找到祖母绿,我通常应该找到其他东西。这不是纯粹的机会。我已经检查了代码,但找不到问题。
block=randint(1,1000)
if block==456 or 742 or 327:
print('You found emerald!')
elif block==275 or 467 or 234 or 978 or 10 or 3 or 256 or 475 or 103 or 701 or 124 or 9:
print('You found diamond!')
elif block==range(900,930):
print('You found iron!')
elif block==range(800,870):
print('You found coal!')
else:
print('You found stone...')
答案 0 :(得分:2)
尽管您的条件在英语中可能有意义,但实际上并没有按照您的期望在python中完成。让我们分解一下。
if block==456 or 742 or 327:
您在这里拥有的是一个布尔值语句,该值具有true / false值,它由三个子语句组成:
if (block==456) or (742) or (327):
这是因为python语法的工作方式,==
是一个二进制运算符(意味着它有两个操作数,一个在左边,一个在右边),or
同样是一个二进制运算符。因此,python解释器不会将其解析为:
if block == (456 or 742 or 327):
仅仅是因为,那不是python设计的工作方式。
那为什么每次都会emerald
被选中?因为在此语句中:
if (block==456) or (742) or (327):
您正在检查数字“ 742”的真/假值。根据python的规则(以及许多其他语言),值“ 0”将被评估为false
,但其他任何数字都将被视为true
。因此您的测试可以解决:
if (block==456) or (True) or (True):
这意味着它将总是返回True,这就是为什么它将总是进入第一个条件分支并返回最稀有结果的原因。
正如其他人在评论中提到的那样,您想要的不是平等检查,而是检查该值是否包含在列表中:
if block in (456, 742, 327):
这将检查block
的值是否在指定的值列表内。
答案 1 :(得分:1)
为什么因为您的条件归结为
val route =
get {
complete("good user, only get requests are matched")
} ~
complete(405 -> "bad user, only get requests are matched")
除if (block==456) or (742) or (327):
以外的任何内容都将评估为0
。在这种情况下,True
被评估为742
,因此True
被执行。
将测试更改为任意一个
print('You found emerald!')
要么
if (block==456) or (block==742) or (block==327)