2016-08-21 188 views
0

我刚刚开始使用python,我决定从一个简单的程序开始,将一行,两个参数的数学表达式直接解析为答案。例子:4 + 2,3/4,5435 * 3423等。首先,我试图解释方程中的两个变量,然后才开始对其进行数学运算。我的问题是第39,40,42和43行没有在1,3,2和5中修改它们各自的变量。在PyCharm中,它们因关于影子名称超出范围的错误而变灰。if语句中的变量

这是目前几乎上午01点,我没有太大的夜猫子(我永远不会做它作为一个编码笑),所以它可能是一个愚蠢的错误在我的一部分,但为了以防万一......

primeNumber = None 
secNumber = None 
num11 = 0 
buildList = [] 
finished = False 

def interpret(statement): 
    i = 0 
    iMax = len(statement) 
    while True: 
     if i >= iMax: 
      break 
     parse(statement[i]) 
     i = i + 1 

def parse(char, buildList=buildList): 
    interrupt = [" ", "+", "-", "/", "*"] 
    if char in interrupt: 
     buildNumber(buildList) 
     buildList.clear() 
    elif num11 == 1: 
     buildNumber(buildList) 
     buildList.clear() 
    else: 
     buildList.append(char) 

def isNumber(att): 
    try: 
     int(att) 
     return True 
    except ValueError: 
     return False 

def buildNumber(finishedList, num11 = num11): 
    finishedNumber = ''.join(finishedList) 
    print(finishedNumber) 

    if num11 == 0: 
     primeNumber = finishedNumber # <<< line 39 
     num11 = 1 
    elif num11 == 1: 
     secNumber = finishedNumber 
     finished = True 
+1

你应该阅读有关变量范围,局部和全局变量等......错误并不是那么愚蠢,理解错误需要一点思考。 – Julien

+0

你可以发布完整的程序,包括调用你定义的函数吗? –

回答

0

在Python中,函数中引用的变量被假定为本地,如果它们的值在函数中设置的话。要覆盖这种默认行为,并从函数内部设置全局变量,您需要声明它们与global声明(仅当您想要编写它们时,您不需要预先声明它们为读取它们。)

你的代码的其他问题:你随机地混合访问全局变量,传递全局变量和默认变为全局变量 - 你应该最小化你的全局变量并且一致地对待它们;选择更多的描述性变量名称(为什么期望人们猜测num11意味着什么?);不要改造布尔值(num11);你提前建立第二个数字。

我返工你的代码考虑到上述问题,并添加刚够包装和胶水代码,使其运行:

firstNumber = None 
secondNumber = None 
finishedFirst = False 
finishedSecond = False 
operation = None 

operations = { 
    " ": None, 
    "+": lambda a, b: a + b, 
    "-": lambda a, b: a - b, 
    "/": lambda a, b: a/b, 
    "*": lambda a, b: a * b, 
} 

def interpret(statement): 
    buildList = [] 

    for character in statement: 
     parse(character, buildList) 

    if not finishedSecond: 
     buildNumber(buildList) 

def parse(character, buildList): 
    global operation 

    if character in operations: 
     if buildList: 
      buildNumber(buildList) 
      buildList.clear() 
     if operations[character] is not None: 
      operation = operations[character] 
    else: 
     buildList.append(character) 

def buildNumber(finishedList): 
    global firstNumber, secondNumber, finishedFirst, finishedSecond 

    finishedNumber = ''.join(finishedList) 

    if not finishedFirst: 
     firstNumber = int(finishedNumber) 
     finishedFirst = True 
    else: 
     secondNumber = int(finishedNumber) 
     finishedSecond = True 

statement = input("> ") 

interpret(statement) 

print(operation(firstNumber, secondNumber)) 

python3 test.py 
> 34 + 56 
90