Python &引用;如果;声明不移到“;否则";条款

Python &引用;如果;声明不移到“;否则";条款,python,dictionary,if-statement,random,Python,Dictionary,If Statement,Random,我正在为一个小游戏编写一个函数,在这个小游戏中,每个回合都会填充一个作业列表。作业本身是具有路线、时间和薪资属性的对象 我想名单是5个项目的总数和随机填充从一个名单上挑选路线和支付等级 我有一个for循环要迭代5次,我希望仅当选择了某两条路线时,pay grade选择为5。否则,薪资等级将是1到4之间的随机数 当我在IF条款中将薪酬等级设置为5时,即使IF条款的条件不正确,它也不会设置为else条款。我不确定我做错了什么 for pick in range(5): job = rando

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

我想名单是5个项目的总数和随机填充从一个名单上挑选路线和支付等级

我有一个for循环要迭代5次,我希望仅当选择了某两条路线时,pay grade选择为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))
打印新职务发布列表中的第一个索引属性始终返回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 ('Raiders'):
任何非空字符串的计算结果均为true(比较REPL中的
not'
not'abc'
),因此
'Raiders'
,整个条件表达式的计算结果始终为true

你真正想要的是

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

问题在于这一点:

if job == 'Military Base' or 'Raiders':
=
运算符优先于
运算符,这意味着它的计算与

if (job == 'Military Base') or ('Raiders'):
任何非空字符串的计算结果均为true(比较REPL中的
not'
not'abc'
),因此
'Raiders'
,整个条件表达式的计算结果始终为true

你真正想要的是

if job == 'Military Base' or job == 'Raiders':
当你说

    if job == 'Military Base' or 'Raiders':
第二个条件意味着:如果“袭击者”==真,并不意味着袭击者等于“军事基地”

更正: 如果job==“军事基地”或job==“袭击者”:

当你说

    if job == 'Military Base' or 'Raiders':
第二个条件意味着:如果“袭击者”==真,并不意味着袭击者等于“军事基地”

更正:
如果job==‘军事基地’或job==‘袭击者’:

如果job==‘军事基地’或‘袭击者’:可能应该是
如果job==‘军事基地’或job==‘袭击者’:
job==‘军事基地’或‘袭击者’总是正确的,因为
'Raiders'
是一个真实值,并且您已经用
作业=='millity Base'
对其进行了
编辑。使用当前的if子句,在
之后的后半部分,
'Raiders'
总是计算为
(因为在Python中非空字符串总是
),因此,
else
将永远不会被输入。@Samwise哇,谢谢,你应该知道这回答了你的问题吗<代码>如果作业==‘军事基地’或‘袭击者’:
可能应该是
如果作业==‘军事基地’或作业==‘袭击者’:
作业==‘军事基地’或‘袭击者’
将始终为真,因为
'Raiders'
是一个真实值,并且您已经用
作业=='millity Base'
对其进行了
编辑。使用当前的if子句,在
之后的后半部分,
'Raiders'
总是计算为
(因为在Python中非空字符串总是
),因此,
else
将永远不会被输入。@Samwise哇,谢谢,你应该知道这回答了你的问题吗?另一种可能更可取的方法是
if-job-in('军事基地','突袭者'):
其优点是,当我们添加选项时,它可以很好地扩展,并且允许您做出更动态的选择(它们不再是硬编码的,所以我们可以传递它们等等),如果我们谈论性能,我们使用一组:
if-job-in{'Military Base','Raiders'}:
。当然,只有两个条目并不重要。另一个可能更可取的方法是
如果job in('Military Base','Raiders'):
的优点是,随着我们添加选项,这可以很好地扩展,并且允许您做出更动态的选择(它们不再是硬编码的,所以我们可以传递它们,等等)如果我们谈论性能,我们使用一组:
if job in{'Military Base'、'Raiders'}:
。但是当然,只有两个条目并不重要。