title: Is there a way to autogenerate valid arithmetic expressions?
body: <p>I'm currently trying to create a Python script that will autogenerate space-delimited arithmetic expressions which are valid. However, I get sample output that looks like this: <code>( 32 - 42 / 95 + 24 ( ) ( 53 ) + ) 21</code></p>
  
  <p>While the empty parentheses are perfectly OK by me, I can't use this autogenerated expression in calculations since there's no operator between the 24 and the 53, and the + before the 21 at the end has no second argument.</p>
  
  <p>What I want to know is, is there a way to account for/fix these errors using a Pythonic solution? (And before anyone points it out, I'll be the first to acknowledge that the code I posted below is probably the worst code I've pushed and conforms to...well, very few of Python's core tenets.)</p>
  
  <pre><code>import random
  parentheses = ['(',')']
  ops = ['+','-','*','/'] + parentheses
  
  lines = 0
  
  while lines &lt; 1000:
      fname = open('test.txt','a')
      expr = []
      numExpr = lines
      if (numExpr % 2 == 0):
          numExpr += 1
      isDiv = False # Boolean var, makes sure there's no Div by 0
  
      # isNumber, isParentheses, isOp determine whether next element is a number, parentheses, or operator, respectively
      isNumber = random.randint(0,1) == 0 # determines whether to start sequence with number or parentheses
      isParentheses = not isNumber
      isOp = False
      # Counts parentheses to ensure parentheses are matching
      numParentheses = 0
      while (numExpr &gt; 0 or numParentheses &gt; 0):
          if (numExpr &lt; 0 and numParentheses &gt; 0):
              isDiv = False
              expr.append(')')
              numParentheses -= 1
          elif (isOp and numParentheses &gt; 0):
              rand = random.randint(0,5)
              expr.append(ops[rand])
              isDiv = (rand == 3) # True if div op was just appended
              # Checks to see if ')' was appended
              if (rand == 5):
                  isNumber = False
                  isOp = True
                  numParentheses -= 1
              # Checks to see if '(' was appended
              elif (rand == 4):
                  isNumber = True
                  isOp = False
                  numParentheses += 1
              # All other operations go here
              else:
                  isNumber = True
                  isOp = False
          # Didn't add parentheses possibility here in case expression in parentheses somehow reaches 0
          elif (isNumber and isDiv):
              expr.append(str(random.randint(1,100)))
              isDiv = False
              isNumber = False
              isOp = True
          # If a number's up, decides whether to append parentheses or a number
          elif (isNumber):
              rand = random.randint(0,1)
              if (rand == 0):
                  expr.append(str(random.randint(0,100)))
                  isNumber = False
                  isOp = True
              elif (rand == 1):
                  if (numParentheses == 0):
                      expr.append('(')
                      numParentheses += 1
                  else:
                      rand = random.randint(0,1)
                      expr.append(parentheses[rand])
                      if rand == 0:
                          numParentheses += 1
                      else:
                          numParentheses -= 1
              isDiv = False
          numExpr -= 1
  
      fname.write(' '.join(expr) + '\n')
      fname.close()
      lines += 1
  </code></pre>