2013-08-25 10 views
5

को हटाने के लिए रिफैक्टर कोड मैं वर्तमान में 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() 
+0

क्या यह एक इनपुट है और compar_answers() से वापस आ गया है? – Jiminion

+0

सबसे आसान तरीका 'compar_answers() 'को' game() 'में रेखांकित करना है, और चर' सही' 'को' game() 'में भी ले जाना है। – Nayuki

+0

इसके अलावा, तथ्य यह है कि आप 'गेम()' और 'compar_answers()' में पूंछ रिकर्सन का उपयोग कर रहे हैं, इसका मतलब है कि आप अंततः स्टैक स्पेस से बाहर हो जाएंगे। – Nayuki

उत्तर

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() 

कुछ टिप्पणियाँ:

  • प्रत्येक समारोह आम तौर पर केवल एक काम करते जाना चाहिए ताकि एक समारोह एक समीकरण का मूल्यांकन करता है, तो यह है आम तौर पर इसे समीकरण मुद्रित करने के लिए बेहतर नहीं है।
  • यह पता लगाने के लिए कि चर को कब जाना चाहिए, यह पता लगाना चाहिए कि जब आप ऐसा करते हैं, तो आपको उन्हें इतनी अधिक पास करने की आवश्यकता नहीं होती है जब आपको प्रत्येक कार्य कई अलग-अलग चीजें करता है।
  • यहां मुख्य गेम तर्क पर्याप्त रूप से सरल है कि आपको इसे अपने मुख्य game() फ़ंक्शन (या main() फ़ंक्शन, मेरे उदाहरण में) से बाहर तोड़ने की ज़रूरत नहीं है) इतना, यह चीजों को वहां छोड़ने के लिए जटिल नहीं करता है । यदि आप कुछ और त्रुटि जांच करना चाहते हैं (उदाहरण के लिए कि उपयोगकर्ता ने अमान्य नंबर दर्ज किया है, और आप वापस जाना चाहते हैं और यदि अधिक इनपुट चाहते हैं तो) तो आप इसे और अधिक तोड़ना चाहेंगे।
1

कुछ इस तरह:

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

इस जोड़ें:

def game(): 
    correct = 0 
    while True: 
     nums = gen_randoms(lower, higher) 
     this_equation = gen_equation(nums) 
     gen_answer = evaluate(this_equation) 
     user_answer = int(raw_input("What is the answer? ")) 
     if user_answer == gen_answer: 
      correct += 1 
      print 'Correct!' 
      print 'Current streak: %s' % str(correct) 
     else: 
      print 'Incorrect!' 
      correct = 0 

फिर पुराने कोड के इन हिस्सों को हटा दें: game(), compare_answers(), और वैश्विक चर correct

0
  1. global correctcompare_answers से
  2. game सेट डिफ़ॉल्ट मान 0 के साथ एक कीवर्ड तर्क correct में लेने के लिए हटा दें। def game(correct =0)
  3. जब correct

में compare_answers पास से game बुला एक तीसरा तर्क correct

  • लेने के लिए compare_answers सेट अर्थात्:

    def compare_answers(gen_answer, game, 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(correct) 
        else: 
         print 'Incorrect!' 
         correct = 0 
         game(correct) 
    
    
    def game(correct = 0): 
        nums = gen_randoms(lower, higher) 
        this_equation = gen_equation(nums) 
        gen_answer = evaluate(this_equation) 
        compare_answers(gen_answer, game, correct) 
    
    
    game() 
    
  • 0

    मैं @ JoelCornett के सुझाव लेने के लिए और एक बना दी कक्षा:

    from random import randint 
    from random import choice 
    
    class Math_Problem_Generator(object): 
    
        def __init__(self): 
         self.lower = int(raw_input("Enter a lower integer constraint: ")) 
         self.higher = int(raw_input("Enter a higher integer constraint: ")) 
         self.correct = 0 
         self.game(self.correct) 
    
    
        def gen_randoms(self, lower, higher): 
         integers = list() 
         for x in xrange(4): 
          rand_int = randint(lower, higher) 
          integers.append(rand_int) 
         return integers 
    
    
        def gen_equation(self, 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(self, equation): 
         answer = eval(equation) 
         print answer 
         return answer 
    
    
        def compare_answers(self, gen_answer): 
         user_answer = int(raw_input("What is the answer? ")) 
         if user_answer == gen_answer: 
          self.correct += 1 
          print 'Correct!' 
          print 'Current streak: %s' % str(self.correct) 
          self.game(self.correct) 
         else: 
          print 'Incorrect!' 
          self.correct = 0 
          self.game(self.correct) 
    
    
        def game(self, correct): 
         nums = self.gen_randoms(self.lower, self.higher) 
         this_equation = self.gen_equation(nums) 
         gen_answer = self.evaluate(this_equation) 
         self.compare_answers(gen_answer) 
         self.game() 
    
    
    Math_Problem_Generator() 
    
    +2

    एफवाईआई, जबकि यह काम करता है, यह वास्तव में अच्छा ओओपी नहीं है, और यह अभी भी ओओपी वाक्यविन्यास में हल्के ढंग से लपेटा गया एक प्रक्रियात्मक कार्यक्रम है। उदाहरण के लिए, आपके पांच तरीकों में से तीन ('__init __()' को छोड़कर) किसी भी इंस्टेंस डेटा तक नहीं पहुंचते हैं या किसी भी इंस्टेंस विधियों को कॉल नहीं करते हैं, जो दृढ़ता से सुझाव देते हैं कि वे कक्षा में नहीं हैं। यह वैश्विक चर मुद्दे को हटा देता है, लेकिन दूसरे के लिए एक बुरे अभ्यास को प्रतिस्थापित करता है। –

    +0

    क्या पैकेज का '__init __()' कॉल 'self.game() 'रखने का भी बुरा व्यवहार नहीं है? आपको '__init() __' से 'गेम() 'या' रन()' बाहर अलग करना चाहिए। आप अभी भी 'Math_Problem_Generator() रन() के साथ एक-लाइनर के रूप में इसे (अनामित रूप से) घोषित और चला सकते हैं। – smci

    0

    कॉलर में अपने परिणाम एकत्रित करें, और फिर गणना मुद्रित करें। यह संस्करण आपके अन्य ग्लोबल्स, lower और higher से छुटकारा पाता है।

    def compare_answers(gen_answer): 
        user_answer = int(raw_input("What is the answer? ")) 
        return user_anser == gen_answer 
    
    def game(): 
    
        correct = 0 
        play_again = 'Y' 
    
        while play_again.lower() == 'y': 
         lower = int(raw_input("Enter a lower integer constraint: ")) 
         higher = int(raw_input("Enter a higher integer constraint: ")) 
         nums = gen_randoms(lower, higher) 
         this_equation = gen_equation(nums) 
         gen_answer = evaluate(this_equation) 
         if compare_answers(gen_answer): 
          correct += 1 
          print('You were right! Your winning streak is {0}'.format(correct)) 
         else: 
          print('Sorry, your answer was wrong. :(') 
          correct = 0 
    
         play_again = raw_input('Would you like to play again? (Y/N): ') 
    
    संबंधित मुद्दे