def iterate(sess, iter_ops, feed_dict, summarizer=None, writer=None,
            global_step_val=None, options=None, run_metadata=None):
  """Iterates one step for the TensorFlow `Op`s in `iter_ops`.

  CAUTION:
    This "function" will change the state of the `sess`.

  NOTE:
    This implementation abstracts all, and nothing else is essential. (That is,
    all args in all employed functions (methods) have been fullfilled.)

    Since the saving process in TensorFlow is not achived by `Op` (as how the
    summarizing and writing to TensorBoard are done), it is not essential, thus
    will not also, be included herein.

  Args:
    sess:
      An instance of `tf.Session()`, as the session this iteration works on.

    iter_ops:
      List of `Op`s to be iterated. Ensure that it has been initialized.

    feed_dict:
      A `feed_dict` associated to the `tf.placeholder`s needed by the `iter_ops`.

    summarizer:
      A "summary op" that summarizes the graph, e.g. `tf.summary.merge_all`,
      optional.

    writer:
      An instance of `tf.summary.FileWriter` that writes the summary into disk.
      If the `summarizer` is `None` (as default), then this argument is useless,
      optional.

    global_step_val:
      `int` or `None`, as the value of global-step, optional.

    options:
      A `[RunOptions]` protocol buffer or `None`, as the associated argument of
      `tf.Session.run()`, optional.

    run_metadata:
      A `[RunMetadata]` protocol buffer or `None`, as the associated argument of
      `tf.Session.run()`, optional.

  Returns:
    List of numpy arraries, as the values of `iter_ops` in this iteration.
  """

  # Get `fetches`
  fetches = [op for op in iter_ops]
  if summarizer is not None:
    fetches.append(summarizer)

  # Iterate in one step and get values
  fetch_vals = sess.run(fetches,
                        feed_dict=feed_dict,
                        options=options,
                        run_metadata=run_metadata)

  # Write to TensorBoard
  if summarizer is not None and writer is not None:
    summary = fetch_vals[-1]
    writer.add_summary(summary, global_step=global_step_val)

  # Return the values of `iter_ops`
  if summarizer is not None:
    # The last element of `fetch_vals` will be the `summary`
    iter_op_vals = fetch_vals[:-1]
  else:
    iter_op_vals = fetch_vals
  return iter_op_vals