Python:重构代码以删除全局变量

标签 python refactoring global-variables

我目前在我的代码中使用一个名为 correct 的全局变量。考虑到全局变量不受欢迎,是否有更好的方法来设置我的代码以“保护”全局变量?

from random import randint
from random import choice

lower  = int(raw_input("Enter a lower integer constraint: "))
higher = int(raw_input("Enter a higher integer constraint: "))

correct = 0


def gen_randoms(lower, higher):
    integers = list()
    for x in xrange(4):
        rand_int = randint(lower, higher)
        integers.append(rand_int)
    return integers


def gen_equation(integers):
    nums = map(str, integers)
    operators = ['*', '+', '-']
    equation = 'num op num op num op num'
    while 'op' in equation:
        equation = equation.replace('op', choice(operators), 1)
    while 'num' in equation:
        equation = equation.replace('num', choice(nums), 1)
    print equation
    return equation


def evaluate(equation):
    answer = eval(equation)
    print answer
    return answer


def compare_answers(gen_answer, game):
    global correct
    user_answer = int(raw_input("What is the answer? "))
    if user_answer == gen_answer:
        correct += 1
        print 'Correct!'
        print 'Current streak: %s' % str(correct)
        game()
    else:
        print 'Incorrect!'
        correct = 0
        game()


def game():
    nums = gen_randoms(lower, higher)
    this_equation = gen_equation(nums)
    gen_answer = evaluate(this_equation)
    compare_answers(gen_answer, game)


game()

最佳答案

我可能会这样做:

#!/usr/bin/python

"""Equation solving game."""

from random import randint
from random import choice


def gen_randoms(lower, higher):

    """Generates four random numbers between provided bounds."""

    integers = [randint(lower, higher) for x in range(4)]
    return integers


def gen_equation(integers):

    """Generates a random equation from four provided integers."""

    nums = [str(i) for i in integers]
    operators = ['*', '+', '-']
    equation = 'num op num op num op num'
    while 'op' in equation:
        equation = equation.replace('op', choice(operators), 1)
    while 'num' in equation:
        equation = equation.replace('num', choice(nums), 1)
    return equation


def evaluate(equation):

    """Evaluates an equation."""

    return eval(equation)


def main():

    """Main game function."""

    lower = int(raw_input("Enter a lower integer constraint: "))
    higher = int(raw_input("Enter a higher integer constraint: "))
    nums = gen_randoms(lower, higher)
    streak = 0

    while True:
        this_equation = gen_equation(nums)
        print this_equation

        user_answer = raw_input("What is the answer? ('Q' to quit) ")

        if user_answer.lower()[0] == 'q':
            break

        gen_answer = evaluate(this_equation)
        print 'The answer was: %d' % gen_answer

        if gen_answer == int(user_answer):
            streak += 1
            print 'Correct!'
            print 'Current streak: %d' % streak
        else:
            streak = 0
            print 'Incorrect!'


if __name__ == "__main__":
    main()

一些评论:

  • 每个函数通常应该只做一件事,所以如果一个函数计算一个方程,通常最好不要让它也打印方程。
  • 执行此操作时,弄清楚变量应该去哪里会变得容易得多,因为您不需要像每个函数做几件不同的事情时那样频繁地传递它们。
  • 此处的主要游戏逻辑非常简单,您实际上不需要将其从主 game() 函数(或 main() 函数,在我的例子中)这么多,把它留在那儿并没有使事情过于复杂。如果您想做更多的错误检查(例如,查看用户是否输入了无效数字,如果是,您想要返回并要求更多输入),那么您可能想要进一步分解。

关于Python:重构代码以删除全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18432293/

相关文章:

python - 使用 Python 对 sin(x) 进行插值

c# - 批量重构 C#

IOS - 移动到单独的类(class)时播放 mp3 失败

javascript - 在单页应用程序中使用 AngularJs UI Router 和全局变量

javascript - Safari 扩展中的全局变量

javascript - 使变量的行为类似于全局变量

python - 从python中的一串数字中找到奇数的总和

python - 如何将嵌套的 OrderedDict 转换为字典?

python - 将 pymssql 与 freetds 一起使用时出现 UnicodeDecodeError

refactoring - 为了清晰起见,重构嵌套的 IF 语句