def divisors(num: int) -> Iterable[int]: """ >>> sorted(divisors(24)) [1, 2, 3, 4, 6, 8, 12] """ yield 1 for i in filter(not_(num % __), range(2, sqrt_ceil(num))): yield i d = num // i if d != i: yield d
def distinct(it: It[A], trs: Fn[[A], bool]=lambda *a: a, on=None)-> It[A]: """ >>> list(distinct(distinct([1,1,1,2,2,3,4,4,4]))) == list(distinct([1,1,1,2,2,3,4,4,4])) True >>> list(distinct([1,1,1,2,2,3,4,4,4])) [1, 2, 3, 4] >>> list(distinct([])) [] """ if on is None: on = set() for i in filter(not_(contains(on, __)), it): yield i on.update(trs(i))