code: def column_print(fmt, rows, print_func):
      
      # Figure out the max width of each column
      num_cols = len(fmt)
      width = [max(0 if isinstance(row, str) else len(row[i]) for row in rows)
               for i in range(num_cols)]
      for row in rows:
          if isinstance(row, str):
              # Print a separator line
              print_func(' '.join([row * width[i] for i in range(num_cols)]))
          else:
              print_func(' '.join([align_cell(fmt[i], row[i], width[i])
                                   for i in range(num_cols)]))
docs: Prints a formatted list, adjusting the width so everything fits.
      fmt contains a single character for each column. < indicates that the
      column should be left justified, > indicates that the column should
      be right justified. The last column may be a space which implies left
      justification and no padding.