【问题标题】:"if" statement not moving to the "else" clause“if”语句不移动到“else”子句
【发布时间】:2021-01-24 19:06:51
【问题描述】:

我正在为一个小游戏编写一个函数,其中每回合都会填充一个工作列表。工作本身是具有路线、时间和薪酬属性的对象。

我希望该列表共有 5 项,并通过从路线和工资等级列表中进行选择来随机填充。

我有一个 for 循环来迭代 5 次,并且我希望只有在选择了某些两条路线时才选择工资等级为 5。否则,薪酬等级将是 1 到 4 之间的随机数。

当我在 IF 子句中将薪酬等级设置为 5 时,即使 IF 的条件不正确,它也永远不会进入 else 子句。我不确定我在这里做错了什么。

for pick in range(5):
    job = random.choice(random_routes)
    if job == 'Military Base' or 'Raiders':
        pay_key = 5
    else:
        pay_key = random.randint(1, 4)
    pay = pay_grades[pay_key]

    job_postings.append(Job(job, routes[job], pay))

从新的 job_postings 列表打印第一个索引属性总是返回 5 级工资数字,即使选择的路线不是军事基地或突袭者。

这里是路线和支付词典:

routes = {'Boneyard': 5, 'Brotherhood': 6, 'Cathedral': 6, 'Junktown': 4,
          'Military Base': 14, 'Necropolis': 5, 'Raiders': 10, 'Shady Sands': 11}

pay_grades = {
    1: random.randrange(200, 401, 50),
    2: random.randrange(300, 501, 50),
    3: random.randrange(400, 601, 50),
    4: random.randrange(500, 701, 50),
    5: random.randrange(900, 1600, 50),
}

【问题讨论】:

  • if job == 'Military Base' or 'Raiders': 应该是if job == 'Military Base' or job == 'Raiders':
  • job == 'Military Base' or 'Raiders' 将永远为真,因为'Raiders' 是一个真实的值,而您已将or 编辑为job == 'Military Base'
  • 使用当前的 if 子句,or'Raiders' 之后的后半部分始终计算为 True(因为在 Python 中非空字符串始终为 True),并且因此永远不会输入else
  • @Samwise 哇,谢谢,应该已经看到了
  • 这能回答你的问题吗? How to test multiple variables against a value?

标签: python dictionary if-statement random


【解决方案1】:

问题出在这一行:

if job == 'Military Base' or 'Raiders':

== 运算符优先于 or 运算符,这意味着它的计算结果与,

if (job == 'Military Base') or ('Raiders'):

任何非空字符串的计算结果都为真(比较 REPL 中的 not ''not 'abc'),因此 'Raiders' 并且整个条件表达式将始终计算为真。

你真正想要的是,

if job == 'Military Base' or job == 'Raiders':

【讨论】:

  • 另一种可能更可取的方法是if job in ( 'Military Base', 'Raiders'): 优点是,当我们添加选项时,它可以很好地扩展,并且它允许您使选择更加动态(它们不再是硬编码的,这样我们就可以传递它们,等等)
  • 如果我们谈论性能,我们使用一组:if job in {'Military Base', 'Raiders'}:。但是当然只有两个不重要的条目。
【解决方案2】:

当你说

    if job == 'Military Base' or 'Raiders':

第二个条件意味着:如果'Raiders' == True,并不意味着Raiders等于'军事基地'。

更正: 如果 job == 'Military Base' 或 job == 'Raiders':

【讨论】:

    猜你喜欢
    • 2022-08-16
    • 2019-04-09
    • 2015-04-27
    • 2012-01-19
    • 2017-02-05
    • 1970-01-01
    • 2021-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多