2016-08-21 181 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