Python &引用;如果;声明不移到“;否则";条款
我正在为一个小游戏编写一个函数,在这个小游戏中,每个回合都会填充一个作业列表。作业本身是具有路线、时间和薪资属性的对象 我想名单是5个项目的总数和随机填充从一个名单上挑选路线和支付等级 我有一个for循环要迭代5次,我希望仅当选择了某两条路线时,pay grade选择为5。否则,薪资等级将是1到4之间的随机数 当我在IF条款中将薪酬等级设置为5时,即使IF条款的条件不正确,它也不会设置为else条款。我不确定我做错了什么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
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'}:
。但是当然,只有两个条目并不重要。