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

Eva*_*olo 5 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()
Run Code Online (Sandbox Code Playgroud)

Cro*_*man 3

我可能会这样做:

#!/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()
Run Code Online (Sandbox Code Playgroud)

一些评论:

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