[Tutor] Generating dynamic output

Andreas Perstinger andreas.perstinger at gmx.net
Fri Dec 2 15:08:46 CET 2011


On 2011-12-02 00:30, Charles Karl Becker wrote:
> So the main thing I'm looking for are pointers on how I could
> optimize/refactor this, and any resources on this and how to 'think'
> more in the right way for this type of thing.  Also, please let me
> know what's good about it :P
>
> def build_line(part):
>      ''' dynamically builds and returns the static lines for use in the board '''
>      line = [part for x in range(board_size)]
>      line = ''.join(line)
>      line = line[:-1]
>      return line
>
> # defines the board size
> board_size = 5
>
> # these pieces are used in creating the two static lines
> part1 = '   |'
> part2 = '---|'
>
> # this creates a list of the line #s which will be dynamic (if 0 is the first)
> dynamic_list = [x for x in range(board_size)[1:board_size*board_size:4]]

I don't understand what you want to do with "dynamic_list". You are not 
using it and if you need a range from 1 to board_size with step 4 just 
use the range-function:

dynamic_list = range(1, board_size, 4)

But I've still no clue why you need this list.

> # generates the array used for controlling the board spaces/taken locations
> master = [[str(x+1), 0] for x in range(board_size**2)]

I guess "master" is later used to save the content of each board cell, 
right? But why do you store the cell-number as a string? And what is the 
second value (0)?
Wouldn't it be easier to have a structure like

master = ["xxo",
	  " xo",
	  "xoo"]

because then you can easily index every cell with

master[row][col]

?

> # this section builds the two static lines
> line1 = build_line(part1)
> line2 = build_line(part2)

As Alan has already mentioned you can build the two lines without using 
an extra function. For example "line1" becomes

line1 = "   |" * (board_size - 1)

>
> # these are used for loop/flow control
> b = 0 # this is used to tell which line needs to be printed
> c = 0 # this controls the slicing to tell the board where to start 'temp_row'
> # this generates the board on the fly
> for row in range(board_size*4-1):
>      if(b == 0 or b == 2):
>          print(line1)
>      elif(b == 3):
>          print(line2)
>      elif(b == 1):
>          # since these rows are dynamic they are called 'temp_row'
>          # and are reset each time a new one is made
>          temp_row = ''
>          for cell in master[c:c+board_size]:
>              if(int(cell[0])>= 100):
>                  temp_row += '{0}|'.format(cell[0])
>              if(int(cell[0])>= 10):
>                  temp_row += '{0} |'.format(cell[0])
>              else:
>                  temp_row += ' {0} |'.format(cell[0])
>          c += board_size # this is how this variable determines where
> to start next time
>          temp_row = temp_row[:-1] # need to get rid of extra '|' at end of line
>          print(temp_row)
>      # this is just some loop/flow control
>      b += 1
>      if(b == 4):
>          b = 0

You can easily simplify your main drawing part:

for row in board_size:
     content_line = master[row] # You have to build the line here
     print(line1)
     print(content_line)
     print(line1)
     if row < (board_size - 1): print(line2)

So no need for "b" and "c" and and all the if-checks.

Bye, Andreas


More information about the Tutor mailing list