<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def next_tip(self, num_tips: int = 1) -> Optional[Well]: """ 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 """

        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