pwnlib.util.iters
— Extension of standard module itertools
¶
This module includes and extends the standard module itertools
.
-
pwnlib.util.iters.
bruteforce
(func, alphabet, length, method = 'upto', start = None)[source]¶ Bruteforce func to return
True
. func should take a string input and return abool()
. func will be called with strings from alphabet until it returnsTrue
or the search space has been exhausted.The argument start can be used to split the search space, which is useful if multiple CPU cores are available.
Parameters: - func (function) – The function to bruteforce.
- alphabet – The alphabet to draw symbols from.
- length – Longest string to try.
- method – If ‘upto’ try strings of length
1 .. length
, if ‘fixed’ only try strings of lengthlength
and if ‘downfrom’ try strings of lengthlength .. 1
. - start – a tuple
(i, N)
which splits the search space up into N pieces and starts at piece i (1..N).None
is equivalent to(1, 1)
.
Returns: A string s such that
func(s)
returnsTrue
orNone
if the search space was exhausted.Example
>>> bruteforce(lambda x: x == 'hello', string.lowercase, length = 10) 'hello' >>> bruteforce(lambda x: x == 'hello', 'hllo', 5) is None True
-
pwnlib.util.iters.
mbruteforce
(func, alphabet, length, method = 'upto', start = None, threads = None)[source]¶ Same functionality as bruteforce(), but multithreaded.
Parameters: - alphabet, length, method, start (func,) – same as for bruteforce()
- threads – Amount of threads to spawn, default is the amount of cores.
-
pwnlib.util.iters.
chained
(func)[source]¶ A decorator chaining the results of func. Useful for generators.
Parameters: func (function) – The function being decorated. Returns: A generator function whoose elements are the concatenation of the return values from func(*args, **kwargs)
.Example
>>> @chained ... def g(): ... for x in count(): ... yield (x, -x) >>> take(6, g()) [0, 0, 1, -1, 2, -2]
-
pwnlib.util.iters.
consume
(n, iterator)[source]¶ Advance the iterator n steps ahead. If n is :const:`None, consume everything.
Parameters: - n (int) – Number of elements to consume.
- iterator (iterator) – An iterator.
Returns: None
.Examples
>>> i = count() >>> consume(5, i) >>> next(i) 5 >>> i = iter([1, 2, 3, 4, 5]) >>> consume(2, i) >>> list(i) [3, 4, 5]
-
pwnlib.util.iters.
cyclen
(n, iterable) → iterator[source]¶ Repeats the elements of iterable n times.
Parameters: - n (int) – The number of times to repeat iterable.
- iterable – An iterable.
Returns: An iterator whoose elements are the elements of iterator repeated n times.
Examples
>>> take(4, cyclen(2, [1, 2])) [1, 2, 1, 2] >>> list(cyclen(10, [])) []
-
pwnlib.util.iters.
dotproduct
(x, y) → int[source]¶ Computes the dot product of x and y.
Parameters: - x (iterable) – An iterable.
- x – An iterable.
Returns: The dot product of x and y, i.e. –
x[0] * y[0] + x[1] * y[1] + ...
.Example
>>> dotproduct([1, 2, 3], [4, 5, 6]) ... # 1 * 4 + 2 * 5 + 3 * 6 == 32 32
-
pwnlib.util.iters.
flatten
(xss) → iterator[source]¶ Flattens one level of nesting; when xss is an iterable of iterables, returns an iterator whoose elements is the concatenation of the elements of xss.
Parameters: xss – An iterable of iterables. Returns: An iterator whoose elements are the concatenation of the iterables in xss. Examples
>>> list(flatten([[1, 2], [3, 4]])) [1, 2, 3, 4] >>> take(6, flatten([[43, 42], [41, 40], count()])) [43, 42, 41, 40, 0, 1]
-
pwnlib.util.iters.
group
(n, iterable, fill_value = None) → iterator[source]¶ Similar to
pwnlib.util.lists.group()
, but returns an iterator and usesitertools
fast build-in functions.Parameters: - n (int) – The group size.
- iterable – An iterable.
- fill_value – The value to fill into the remaining slots of the last group if the n does not divide the number of elements in iterable.
Returns: An iterator whoose elements are n-tuples of the elements of iterable.
Examples
>>> list(group(2, range(5))) [(0, 1), (2, 3), (4, None)] >>> take(3, group(2, count())) [(0, 1), (2, 3), (4, 5)] >>> [''.join(x) for x in group(3, 'ABCDEFG', 'x')] ['ABC', 'DEF', 'Gxx']
-
pwnlib.util.iters.
iter_except
(func, exception)[source]¶ Calls func repeatedly until an exception is raised. Works like the build-in
iter()
but uses an exception instead of a sentinel to signal the end.Parameters: - func (callable) – The function to call.
- exception (Exception) – The exception that signals the end. Other exceptions will not be caught.
Returns: An iterator whoose elements are the results of calling
func()
until an exception matching exception is raised.Examples
>>> s = {1, 2, 3} >>> i = iter_except(s.pop, KeyError) >>> next(i) 1 >>> next(i) 2 >>> next(i) 3 >>> next(i) Traceback (most recent call last): ... StopIteration
-
pwnlib.util.iters.
lexicographic
(alphabet) → iterator[source]¶ The words with symbols in alphabet, in lexicographic order (determined by the order of alphabet).
Parameters: alphabet – The alphabet to draw symbols from. Returns: An iterator of the words with symbols in alphabet, in lexicographic order. Example
>>> take(8, imap(lambda x: ''.join(x), lexicographic('01'))) ['', '0', '1', '00', '01', '10', '11', '000']
-
pwnlib.util.iters.
lookahead
(n, iterable) → object[source]¶ Inspects the upcoming element at index n without advancing the iterator. Raises
IndexError
if iterable has too few elements.Parameters: - n (int) – Index of the element to return.
- iterable – An iterable.
Returns: The element in iterable at index n.
Examples
>>> i = count() >>> lookahead(4, i) 4 >>> next(i) 0 >>> i = count() >>> nth(4, i) 4 >>> next(i) 5 >>> lookahead(4, i) 10
-
pwnlib.util.iters.
nth
(n, iterable, default = None) → object[source]¶ Returns the element at index n in iterable. If iterable is a iterator it will be advanced.
Parameters: - n (int) – Index of the element to return.
- iterable – An iterable.
- default (objext) – A default value.
Returns: The element at index n in iterable or default if iterable has too few elements.
Examples
>>> nth(2, [0, 1, 2, 3]) 2 >>> nth(2, [0, 1], 42) 42 >>> i = count() >>> nth(42, i) 42 >>> nth(42, i) 85
-
pwnlib.util.iters.
pad
(iterable, value = None) → iterator[source]¶ Pad an iterable with value, i.e. returns an iterator whoose elements are first the elements of iterable then value indefinitely.
Parameters: - iterable – An iterable.
- value – The value to pad with.
Returns: An iterator whoose elements are first the elements of iterable then value indefinitely.
Examples
>>> take(3, pad([1, 2])) [1, 2, None] >>> i = pad(iter([1, 2, 3]), 42) >>> take(2, i) [1, 2] >>> take(2, i) [3, 42] >>> take(2, i) [42, 42]
-
pwnlib.util.iters.
pairwise
(iterable) → iterator[source]¶ Parameters: iterable – An iterable. Returns: An iterator whoose elements are pairs of neighbouring elements of iterable. Examples
>>> list(pairwise([1, 2, 3, 4])) [(1, 2), (2, 3), (3, 4)] >>> i = starmap(operator.add, pairwise(count())) >>> take(5, i) [1, 3, 5, 7, 9]
-
pwnlib.util.iters.
powerset
(iterable, include_empty = True) → iterator[source]¶ The powerset of an iterable.
Parameters: - iterable – An iterable.
- include_empty (bool) – Whether to include the empty set.
Returns: The powerset of iterable as an interator of tuples.
Examples
>>> list(powerset(range(3))) [(), (0,), (1,), (2,), (0, 1), (0, 2), (1, 2), (0, 1, 2)] >>> list(powerset(range(2), include_empty = False)) [(0,), (1,), (0, 1)]
-
pwnlib.util.iters.
quantify
(iterable, pred = bool) → int[source]¶ Count how many times the predicate pred is
True
.Parameters: - iterable – An iterable.
- pred – A function that given an element from iterable returns either
True
orFalse
.
Returns: The number of elements in iterable for which pred returns
True
.Examples
>>> quantify([1, 2, 3, 4], lambda x: x % 2 == 0) 2 >>> quantify(['1', 'two', '3', '42'], str.isdigit) 3
-
pwnlib.util.iters.
random_combination
(iterable, r) → tuple[source]¶ Parameters: - iterable – An iterable.
- r (int) – Size of the combination.
Returns: A random element from
itertools.combinations(iterable, r = r)
.Examples
>>> random_combination(range(2), 2) (0, 1) >>> random_combination(range(10), r = 2) in combinations(range(10), r = 2) True
-
pwnlib.util.iters.
random_combination_with_replacement
(iterable, r)[source]¶ random_combination(iterable, r) -> tuple
Parameters: - iterable – An iterable.
- r (int) – Size of the combination.
Returns: A random element from
itertools.combinations_with_replacement(iterable, r = r)
.Examples
>>> cs = {(0, 0), (0, 1), (1, 1)} >>> random_combination_with_replacement(range(2), 2) in cs True >>> i = combinations_with_replacement(range(10), r = 2) >>> random_combination_with_replacement(range(10), r = 2) in i True
-
pwnlib.util.iters.
random_permutation
(iterable, r=None)[source]¶ random_product(iterable, r = None) -> tuple
Parameters: - iterable – An iterable.
- r (int) – Size of the permutation. If
None
select all elements in iterable.
Returns: A random element from
itertools.permutations(iterable, r = r)
.Examples
>>> random_permutation(range(2)) in {(0, 1), (1, 0)} True >>> random_permutation(range(10), r = 2) in permutations(range(10), r = 2) True
-
pwnlib.util.iters.
random_product
(*args, repeat = 1) → tuple[source]¶ Parameters: - args – One or more iterables
- repeat (int) – Number of times to repeat args.
Returns: A random element from
itertools.product(*args, repeat = repeat)
.Examples
>>> args = (range(2), range(2)) >>> random_product(*args) in {(0, 0), (0, 1), (1, 0), (1, 1)} True >>> args = (range(3), range(3), range(3)) >>> random_product(*args, repeat = 2) in product(*args, repeat = 2) True
-
pwnlib.util.iters.
repeat_func
(func, *args, **kwargs) → iterator[source]¶ Repeatedly calls func with positional arguments args and keyword arguments kwargs. If no keyword arguments is given the resulting iterator will be computed using only functions from
itertools
which are very fast.Parameters: - func (function) – The function to call.
- args – Positional arguments.
- kwargs – Keyword arguments.
Returns: An iterator whoose elements are the results of calling
func(*args, **kwargs)
repeatedly.Examples
>>> def f(x): ... x[0] += 1 ... return x[0] >>> i = repeat_func(f, [0]) >>> take(2, i) [1, 2] >>> take(2, i) [3, 4] >>> def f(**kwargs): ... return kwargs.get('x', 43) >>> i = repeat_func(f, x = 42) >>> take(2, i) [42, 42] >>> i = repeat_func(f, 42) >>> take(2, i) Traceback (most recent call last): ... TypeError: f() takes exactly 0 arguments (1 given)
-
pwnlib.util.iters.
roundrobin
(*iterables)[source]¶ Take elements from iterables in a round-robin fashion.
Parameters: *iterables – One or more iterables. Returns: An iterator whoose elements are taken from iterables in a round-robin fashion. Examples
>>> ''.join(roundrobin('ABC', 'D', 'EF')) 'ADEBFC' >>> ''.join(take(10, roundrobin('ABC', 'DE', repeat('x')))) 'ADxBExCxxx'
-
pwnlib.util.iters.
tabulate
(func, start = 0) → iterator[source]¶ Parameters: - func (function) – The function to tabulate over.
- start (int) – Number to start on.
Returns: An iterator with the elements
func(start), func(start + 1), ...
.Examples
>>> take(2, tabulate(str)) ['0', '1'] >>> take(5, tabulate(lambda x: x**2, start = 1)) [1, 4, 9, 16, 25]
-
pwnlib.util.iters.
take
(n, iterable) → list[source]¶ Returns first n elements of iterable. If iterable is a iterator it will be advanced.
Parameters: - n (int) – Number of elements to take.
- iterable – An iterable.
Returns: A list of the first n elements of iterable. If there are fewer than n elements in iterable they will all be returned.
Examples
>>> take(2, range(10)) [0, 1] >>> i = count() >>> take(2, i) [0, 1] >>> take(2, i) [2, 3] >>> take(9001, [1, 2, 3]) [1, 2, 3]
-
pwnlib.util.iters.
unique_everseen
(iterable, key = None) → iterator[source]¶ Get unique elements, preserving order. Remember all elements ever seen. If key is not
None
then for each elementelm
in iterable the element that will be rememberes iskey(elm)
. Otherwiseelm
is remembered.Parameters: - iterable – An iterable.
- key – A function to map over each element in iterable before remembering
it. Setting to
None
is equivalent to the identity function.
Returns: An iterator of the unique elements in iterable.
Examples
>>> ''.join(unique_everseen('AAAABBBCCDAABBB')) 'ABCD' >>> ''.join(unique_everseen('ABBCcAD', str.lower)) 'ABCD'
-
pwnlib.util.iters.
unique_justseen
(iterable, key=None)[source]¶ unique_everseen(iterable, key = None) -> iterator
Get unique elements, preserving order. Remember only the elements just seen. If key is not
None
then for each elementelm
in iterable the element that will be rememberes iskey(elm)
. Otherwiseelm
is remembered.Parameters: - iterable – An iterable.
- key – A function to map over each element in iterable before remembering
it. Setting to
None
is equivalent to the identity function.
Returns: An iterator of the unique elements in iterable.
Examples
>>> ''.join(unique_justseen('AAAABBBCCDAABBB')) 'ABCDAB' >>> ''.join(unique_justseen('ABBCcAD', str.lower)) 'ABCAD'
-
pwnlib.util.iters.
unique_window
(iterable, window, key=None)[source]¶ unique_everseen(iterable, window, key = None) -> iterator
Get unique elements, preserving order. Remember only the last window elements seen. If key is not
None
then for each elementelm
in iterable the element that will be rememberes iskey(elm)
. Otherwiseelm
is remembered.Parameters: - iterable – An iterable.
- window (int) – The number of elements to remember.
- key – A function to map over each element in iterable before remembering
it. Setting to
None
is equivalent to the identity function.
Returns: An iterator of the unique elements in iterable.
Examples
>>> ''.join(unique_window('AAAABBBCCDAABBB', 6)) 'ABCDA' >>> ''.join(unique_window('ABBCcAD', 5, str.lower)) 'ABCD' >>> ''.join(unique_window('ABBCcAD', 4, str.lower)) 'ABCAD'
-
pwnlib.util.iters.
chain
()[source]¶ Alias for
itertools.chain()
.
-
pwnlib.util.iters.
combinations
()[source]¶ Alias for
itertools.combinations()
-
pwnlib.util.iters.
compress
()[source]¶ Alias for
itertools.compress()
-
pwnlib.util.iters.
count
()[source]¶ Alias for
itertools.count()
-
pwnlib.util.iters.
cycle
()[source]¶ Alias for
itertools.cycle()
-
pwnlib.util.iters.
dropwhile
()[source]¶ Alias for
itertools.dropwhile()
-
pwnlib.util.iters.
groupby
()[source]¶ Alias for
itertools.groupby()
-
pwnlib.util.iters.
ifilter
()[source]¶ Alias for
itertools.ifilter()
-
pwnlib.util.iters.
ifilterfalse
()[source]¶ Alias for
itertools.ifilterfalse()
-
pwnlib.util.iters.
imap
()[source]¶ Alias for
itertools.imap()
-
pwnlib.util.iters.
islice
()[source]¶ Alias for
itertools.islice()
-
pwnlib.util.iters.
izip
()[source]¶ Alias for
itertools.izip()
-
pwnlib.util.iters.
izip_longest
()[source]¶ Alias for
itertools.izip_longest()
-
pwnlib.util.iters.
permutations
()[source]¶ Alias for
itertools.permutations()
-
pwnlib.util.iters.
product
()[source]¶ Alias for
itertools.product()
-
pwnlib.util.iters.
repeat
()[source]¶ Alias for
itertools.repeat()
-
pwnlib.util.iters.
starmap
()[source]¶ Alias for
itertools.starmap()
-
pwnlib.util.iters.
takewhile
()[source]¶ Alias for
itertools.takewhile()
-
pwnlib.util.iters.
tee
()[source]¶ Alias for
itertools.tee()