Vlákno názorů k článku Podpora funkcionálního programování v Pythonu a knihovna functools od Ravise - Pozor na to, že map i filter vrací...

  • Článek je starý, nové názory již nelze přidávat.
  • 27. 7. 2023 16:58

    Ravise
    Stříbrný podporovatel

    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

  • 27. 7. 2023 18:43

    Pavel Tišnovský
    Zlatý podporovatel

    máte absolutně pravdu (+ používat funkci se stavem u filter a map je cesta do hodně nepěkných míst :-)

    jinak ten příklad jde přepsat na použití uzávěru a nolocal (už to, že se musí přidat nové klíčové slovo, značí, že to není moc čisté)

  • 27. 7. 2023 19:05

    Ravise
    Stříbrný podporovatel

    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.