Próbuję więc wymyślić, jak funkcja Pythona {X0}} działa jako sposób na trochę przyspieszenia mojego programu. Z mojego podstawowego zrozumienia wygląda na to, że możesz użyć map(), aby zastąpić pewne instancje, w których użyłeś pętli for. To, co jestem ciekawi, czy możesz zmienić coś takiego:

loopNum = 25
for i in range (loopNum):
    self.doSomething()

Do:

loopNum = 25
map(self.doSomething(), range(loopNum))

Dodatkowo, w powyższym przykładzie, czy mógłbym zrezygnować z zmiennej loopNum, a na mapie po prostu ma map(something, 25)?

0
Skitzafreak 26 czerwiec 2017, 23:26

3 odpowiedzi

Najlepsza odpowiedź

Nie, nie możesz jako map(function, iterable) stosuje function do każdego elementu iterable . Jeśli po prostu chcesz wykonać trochę funkcji n razy, wystarczy użyć pętli.

Należy pamiętać, że iterable musi bądź (niespodzianka!) Iterable , a nie numer.

4
ForceBru 26 czerwiec 2017, 20:30

Chcę dodać do tego pytania, że map() jest praktycznie nigdy nie właściwe narzędzie w Pythonie. Nasz bdfl, chciał Usuń z Python 3, wraz z lambda s i, najsilniej reduce.

W prawie wszystkich przypadkach, w których czujesz się kuszony, aby użyć map(), zdobądź krok do tyłu i spróbuj przepisać kod za pomocą listy Rozumienie. Dla twojego obecnego przykładu, to byłoby:

my_list = [self.doSomething() for i in range(loopNum)]

Lub

my_generator = (self.doSomething() for i in range(loopNum))

Zamiast tego zrobić generator.

Ale w ogóle, aby mieć jakikolwiek sens, self.doSomething() powinien prawdopodobnie wziąć zmienną i jako wejście. Po tym wszystkim próbujesz mapy wartości w swoim zakresie do czegoś innego.

0
JohanL 26 czerwiec 2017, 20:49

map jest mniej więcej odpowiednikiem tego for pętla:

# my_map(func, iter1, iterN...) 
def my_map(func, *iteables)
    for x, y,... in zip(iter1, iter2,iterN...): 
        yield func(x,y,...)

Co robisz w swoim kodzie, jest tak samo:

my_map(self.doSomething(), range(loopNum))

self.dSomething() musi zwrócić funkcję lub obiekt wywołany lub to oczywiście nie działa. To dlatego, że, niezależnie od obiektu, który przechodzi do argumentu func, zostanie wywołany, a następnie oprócz przekazywania odpowiedniej liczby argumentów do {x3}}, func musi być Obiekt wywołany również :-)

* Musisz zmierzyć się nad iterable zwróconą przez map, aby uzyskać wyniki, w przeciwnym razie, po prostu otrzymasz iterable obiekt bez namacalnej pracy.

1
direprobs 26 czerwiec 2017, 21:36