Iteradors com a paràmetres

  • Els iteradors són objectes de Python; per tant, es poden passar com a paràmetres d’una funció. Per tant, podem definir funcions que reben iteradors (o iterables) i/o retornen iteradors. Exemples: generadors2.py

Funcions predefinides

Funció

Acció

map()

Aplica una funció als elements d’un iterable (o més d’un)

filter()

Tria els elements d’un iterable que compleixen una condició

zip()

Ajunta dos (o més) iterables en un de sol

any()

Comprova si algun dels elements d’un iterable és cert

all()

Comprova si tots els elements d’un iterable són certs

functools.reduce()

Aplica una funció repetidament a un iterable

Avís

Els iteradors no tenen la funció len()

  • Algunes d’aquestes funcions reben funcions com a paràmetres. Podem definir noves funcions o bé utilitzar la notació lambda, que crea funcions anònimes.

Exemples:

>>> it = iter('CADIRA')
>>> max(it)
'R'
>>> sorted('xyzacb')
['a', 'b', 'c', 'x', 'y', 'z']
>>> '#'.join(sorted('axbyzc'))
'a#b#c#x#y#z'
>>> list(enumerate('xyzabc'))
[(0, 'x'), (1, 'y'), (2, 'z'), (3, 'a'), (4, 'b'), (5, 'c')]
>>> def f(x):
...    return x * 2
>>> list(map(f, [4, 3.7, 'pa', [1,2], 8]))
[8, 7.4, 'papa', [1, 2, 1, 2], 16]
>>> list(map(lambda x: x**2, range(6)))
[0, 1, 4, 9, 16, 25]
>>> list(map(lambda x, y: x+y, [1, 2, 3, 4, 5], [50, 20, 30, 10, 50, 80]))
[51, 22, 33, 14, 55]
>>> def acaba_01(x):
...   return x % 10 < 2
>>> list(filter(acaba_01, range(40)))
[0, 1, 10, 11, 20, 21, 30, 31]
>>> list(filter(lambda x:'3' in str(x), range(40)))
[3, 13, 23, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39]
>>> list(zip('ABCDEF', '4321'))
[('A', '4'), ('B', '3'), ('C', '2'), ('D', '1')]
>>> any(filter(lambda x: 'a' in x, 'tinc sis fills tísics i prims'.split()))
False
>>> all(filter(lambda x: 'i' in x, 'tinc sis fills tísics i prims'.split()))
True
>>> import functools
>>> functools.reduce(lambda x, y: x*y, range(1, 6))
120

El mòdul itertools

El mòdul itertools conté d’altres funcions que treballen amb iterables.

Alguns exemples d’ús:

>>> import itertools
>>> list(itertools.islice(itertools.count(), 4, 10))
[4, 5, 6, 7, 8, 9]
>>> list(itertools.islice(itertools.cycle('123'), 3, 10)) (
['1', '2', '3', '1', '2', '3', '1']
>>> list(itertools.accumulate([2, 4, 5, 10, 30]))
[2, 6, 11, 21, 51]
>>> list(itertools.pairwise('ABCDE'))
[('A', 'B'), ('B', 'C'), ('C', 'D'), ('D', E')]
>>> it1, it2 = itertools.tee(iter('ABCDEF'))
>>> a = next(it2)
>>> b = next(it2) 
>>> list(zip(it1, it2))
[('A', 'C'), ('B', 'D'), ('C', 'E'), ('D', 'F')]
>>> list(itertools.product('ABCD', '123'))
[('A', '1'), ('A', '2'), ('A', '3'), ('B', '1'), ('B', '2'), ('B', '3'), ('C', '1'), ('C', '2'), ('C', '3'), ('D', '1'), ('D', '2'), ('D', '3')]