code: def reset_learning_rate(learning_rates):
      
      def get_learning_rate(i, n, learning_rates):
          """helper providing the learning rate"""
          if isinstance(learning_rates, list):
              if len(learning_rates) != n:
                  raise ValueError("Length of list 'learning_rates' has to equal 'num_boost_round'.")
              new_learning_rate = learning_rates[i]
          else:
              new_learning_rate = learning_rates(i, n)
          return new_learning_rate
  
      def callback(env):
          """internal function"""
          context = _get_callback_context(env)
  
          if context == 'train':
              bst, i, n = env.model, env.iteration, env.end_iteration
              bst.set_param('learning_rate', get_learning_rate(i, n, learning_rates))
          elif context == 'cv':
              i, n = env.iteration, env.end_iteration
              for cvpack in env.cvfolds:
                  bst = cvpack.bst
                  bst.set_param('learning_rate', get_learning_rate(i, n, learning_rates))
  
      callback.before_iteration = True
      return callback
docs: Reset learning rate after iteration 1
  
      NOTE: the initial learning rate will still take in-effect on first iteration.
  
      Parameters
      ----------
      learning_rates: list or function
          List of learning rate for each boosting round
          or a customized function that calculates eta in terms of
          current number of round and the total number of boosting round (e.g.
          yields learning rate decay)
  
          * list ``l``: ``eta = l[boosting_round]``
          * function ``f``: ``eta = f(boosting_round, num_boost_round)``
  
      Returns
      -------
      callback : function
          The requested callback function.