przenoszenie plików, map, lambda

0

Witam Panie i Panowie
Przyglądam się Pythonowi i będę się tu zapytywał pewnie nierzadko.

Np. dlaczego to nie działa/

files = os.listdir(source_dir)
map(lambda f: move(source_dir + f, dest_dir + f), files)

a to oczywiście działa

for f in files:
    move(source_dir + f, dest_dir + f)

lambdy czegoś nie potrafią?

1

Co to znaczy nie działa? map jest leniwe -- ot, powód.

0

list(map(lambda f: move(source_dir + f, dest_dir + f), files)) Ci zadziała.

2

Działa, tylko map w Pythonie zwraca iterator, trochę wyjasnień też tutaj.

0

Aha. Dzięki, to niezła dziwność dla mnie.
Przejrzałem ze 3 artykuły i żaden o tym nie wspomniał.

Rozumiem, że nie ma znaczenia czy dokładnie się "zmaterializuje" tego map-a? Dowolny Iterable?

2

Tak. Możesz też go przelecieć forem albo zrobić co tylko sobie wymyślisz z nim.

Python 3 co tylko mógł wepchnął w generatory — które są leniwe. range, na przykład, też nim zostało. Efekt jest taki, że zamiast mieć duży koszt natychmiast, jest on odkładany w czasie do ostatniego momentu.

Tak w sumie, to nawet zamiast robienia tablicy, raczej byś wolał pętlę — bo tworzenie tablicy wymusza stworzenie w pamięci, no cóż, całej tablicy na raz, co przy dużej liczbie plików jest zdecydowanie niepotrzebne, pamięciożerne i wolne. A jak już masz pętlę, to równie dobrze możesz sobie dać spokój z mapem, on Ci tutaj niepotrzebny…

To nie jest silver bulet w Pythonie do używania wszędzie, tylko coś co ma konkretne zastosowanie — właśnie ominięcie tego wysokiego kosztu „na raz”. Czasem użyteczne, czasem przeszkadza. Tutaj właśnie przeszkadza.

1 użytkowników online, w tym zalogowanych: 0, gości: 1