code: def next_tip(self, num_tips: int = 1) -> Optional[Well]:
          
          assert num_tips > 0
  
          columns: List[List[Well]] = self.columns()
          drop_leading_empties = [
              list(dropwhile(lambda x: not x.has_tip, column))
              for column in columns]
          drop_at_first_gap = [
              list(takewhile(lambda x: x.has_tip, column))
              for column in drop_leading_empties]
          long_enough = [
              column for column in drop_at_first_gap if len(column) >= num_tips]
  
          try:
              first_long_enough = long_enough[0]
              result: Optional[Well] = first_long_enough[0]
          except IndexError:
              result = None
  
          return result
docs: Find the next valid well for pick-up.
  
          Determines the next valid start tip from which to retrieve the
          specified number of tips. There must be at least `num_tips` sequential
          wells for which all wells have tips, in the same column.
  
          :param num_tips: target number of sequential tips in the same column
          :type num_tips: int
          :return: the :py:class:`.Well` meeting the target criteria, or None