if语句中的变量问题

2024-09-23 22:25:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我刚刚开始使用python,我决定从一个简单的程序开始,将一行两个参数的数学表达式直接解析成一个答案。例如:4+2、3/4、5435*3423等。首先,我试图解释方程中的两个变量,然后再让程序对它们进行数学化。我的问题是第39、40、42和43行没有修改它们在1、3、2和5处的变量。在PyCharm中,它们会因将名称隐藏在范围之外的错误而变灰。你知道吗

现在已经快凌晨1点了,我也不是什么夜猫子(我永远不会成为一个程序员哈哈),所以我可能犯了一个愚蠢的错误,但以防万一。。。你知道吗

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

Tags: 程序nonetrueifdef错误数学statement
1条回答
网友
1楼 · 发布于 2024-09-23 22:25:09

在Python中,如果函数中设置了在函数中引用的变量的值,则假定这些变量是局部变量。要重写此默认行为,并从函数内部设置全局变量,您需要使用global语句声明它们(仅当您希望写入它们时,不需要预先声明它们以读取它们)

代码中的其他问题:您随机地将访问globals与传递globals和默认为globals混合在一起,您应该最小化globals并一致地对待它们;选择更具描述性的变量名(为什么希望人们猜测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

相关问题 更多 >