【问题标题】:Syntax error with Elif Statements [closed]Elif 语句的语法错误[关闭]
【发布时间】:2015-10-24 20:07:24
【问题描述】:

我正在尝试学习 Python,并且正在制作文本 rpg 作为练习。下面的函数旨在根据百分比随机分配 npc 统计数据,这些数据因班级而异。

def mob_Stat_Assign(self, level): 
    statCount = (3 * self.level)
    while(statCount > 0):
        statRoll = random.randrange(1, 101)            
        if(statRoll >= (100 - self.statS)):
            self.strength += 1
        elif((statRoll >= (100 - (self.statP + self.statS)) and (statRoll < (100 - self.statS))):
            self.perception += 1
        elif((statRoll >= (100 - (self.statE + self.statP + self.statS) and (statRoll <(100 - (self.statP + self.statS)))):
            self.endurance += 1
        elif((statRoll >= (100 - (self.statC + self.statE + self.statP + self.statS)) and (statRoll < (100 - (self.statE + self.statP + self.statS)))):
            self.charisma += 1
        elif((statRoll >= (100 - (self.statI + self.statC + self.statE + self.statP + self.statS)) and (statRoll < (100 - (self.statC + self.statE + self.statP + self.statS)))):
            self.intelligence += 1
        elif((statRoll >= (100 - (self.statA + self.statI + self.statC + self.statE + self.statP + self.statS)) and (statRoll < (100 - (self.statI + self.statC + self.statE + self.statP + self.statS))
            self.agility += 1 
        else:
            self.luck += 1
        statCount -= 1

当我尝试编译时,我收到一个错误,指出语法无效,并且第一个 elif 语句末尾的冒号被突出显示。

我可以通过将 (100 -(self.statP + self.statS)) 放入一个变量并将其代入来解决此问题,但是在下一个 elif 语句中出现了同样的错误。 我确信我可以通过以类似方式为所有语句定义条件变量来修复整个函数,但我真的很想知道为什么这不能按原样工作。

我看不出两者之间的区别

(statRoll >= (100 - (self.statP + self.statS))

x = (100 - (self.statP + self.statS))
(statRoll >= x)

【问题讨论】:

  • 仔细数括号。
  • 使用更好的名称会有很大帮助。 statP 是什么?为什么使用statRoll 而不是roll?这是非常规的(即难以阅读)camelCase_Especially_With_Underscores。 docstring 总是一个好主意。

标签: python if-statement syntax-error


【解决方案1】:

你的括号不匹配,你在表达式中缺少一个结束 ) 括号:

elif(
    (
        statRoll >= (
            100 - (self.statP + self.statS)
        ) and (
            statRoll < (100 - self.statS)
        # ?
    )
):

你不需要一半的括号;如果您在 elif 和不需要外对的表达式之间放置一个空格。接下来,您可以在总和中去掉更多的括号(a - b + c 不会轻易混淆)。事实上,您不需要 any,但在算术上添加一些可能有助于提高可读性:

elif statRoll >= (100 - self.statP + self.statS) and statRoll < (100 - self.statS):

将此应用于所有测试,再加上一点 PEP-8 重新安排,给出:

if statRoll >= (100 - self.statS):
    self.strength += 1
elif (statRoll >= (100 - self.statP + self.statS) and
        statRoll < (100 - self.statS)):
    self.perception += 1
elif (statRoll >= (100 - self.statE + self.statP + self.statS) and 
        statRoll < (100 - self.statP + self.statS)):
    self.endurance += 1
elif (statRoll >= (100 - self.statC + self.statE + self.statP + self.statS) and
        statRoll < (100 - self.statE + self.statP + self.statS)):
    self.charisma += 1
elif (statRoll >= (100 - self.statI + self.statC + self.statE + 
                   self.statP + self.statS) and
        statRoll < (100 - self.statC + self.statE + self.statP + self.statS)):
    self.intelligence += 1
elif (statRoll >= (100 - self.statA + self.statI + self.statC + 
                   self.statE + self.statP + self.statS) and
        statRoll < (100 - self.statI + self.statC + self.statE +
                    self.statP + self.statS)):
    self.agility += 1 
else:
    self.luck += 1

但仍然不是最易读的;考虑添加函数来分解这些计算。

【讨论】:

  • 啊哇,它修好了。我听说过“如有疑问,请使用括号”。我想我太认真了。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2012-09-01
  • 2014-11-23
  • 1970-01-01
  • 2016-09-04
  • 1970-01-01
  • 1970-01-01
  • 2017-09-04
  • 2013-06-18
相关资源
最近更新 更多