python - 为什么总是显示最稀有的输出?(Python 3)
问题描述
每当我运行这个函数时,输出是
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...')
解决方案
虽然您的情况在英语中可能有意义,但它实际上并没有像您期望它在 python 中那样做。让我们分解一下。
if block==456 or 742 or 327:
您在这里拥有的是一个具有真/假值的布尔语句,它由三个子语句组成:
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
是否在指定的值列表内。
推荐阅读
- javascript - 瓷砖不右转
- sql - 雪花中的合并功能限制
- angular - cdk-Table 工作,但 mat-Table 不工作
- vue.js - Algolia 细化列表未正确选择值
- google-sheets - Google 表格的 IMPORTXML 随机中断
- typescript - Vue:Typescript 仅在 App.vue 中不起作用
- typo3 - TYPO3 v10 动作控制器和子文件夹中的模板
- javascript - 如何使用二次缓动函数获得 2 个数字的值范围?
- wildfly - Wildfly 14 + EAR 在处理大量数据时不会被禁用
- c++ - 为什么通过引用返回向量比通过移动返回要快得多?