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¶
Diverses de les funcions que coneixem reben iteradors o iterables com a paràmetre:
max()
,min()
,sum()
,sorted()
,str.join()
,enumerate()
.Python conté d’altres funcions predefinides per treballar amb iterables:
Funció |
Acció |
---|---|
Aplica una funció als elements d’un iterable (o més d’un) |
|
Tria els elements d’un iterable que compleixen una condició |
|
Ajunta dos (o més) iterables en un de sol |
|
Comprova si algun dels elements d’un iterable és cert |
|
Comprova si tots els elements d’un iterable són certs |
|
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')]