Pozor na to, že map i filter vrací generátor (tuším, že ke změně došlo mezi py2 a py3). A obsah generátoru se vyhodnocuje líně, až ve chvíli, kdy je to nezbytně potřeba. I proto jsou demonstrační příklady plné list()ů. Takže jednak přes výsledek nepůjde iterovat dvakrát...
>>> g = map(lambda x: x, range(10)) >>> list(g) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> list(g) []
... druhak, pokud map-ujete něco, co má svůj stav, výsledek nebude odpovídat stavu, kdy byl generátor vytvořený, ale stavu, kdy byl rozbalený. Já vím, není to funkcionální, ale mohlo by to překvapit.
>>> class Multiplier: ... def __init__(self, by): ... self.by = by ... def __call__(self, number): ... return self.by * number ... >>> m = Multiplier(1) >>> num_in = list(range(5)) >>> num_out = map(m, num_in) >>> m.by = 7 >>> list(num_out) [0, 7, 14, 21, 28] >>> num_out = map(m, num_in) >>> num_in.append(11) >>> list(num_out) [0, 7, 14, 21, 28, 77]
E: oprava vyšinutí z větné stavby
27. 7. 2023, 16:58 editováno autorem komentáře
U světla, tykat prosím, děkuju Vám :)
Jo, jde to napsat líp, a já bych takhle map dobrovolně nepoužil, ale programátoři (a skoro bych řekl zejména v pythonu) jsou různí. Kdo ví, nedokážu si představit, že by "mutabilní map" byl k něčemu dobrý, ale nehodlám kategoricky tvrdit, že taková situace nenastane.