2014-04-17 14 views
7

Mam pewien rekurencyjny kod powrotu, który sprawdza, czy wybór jest ważny przed jego wykonaniem. Czy nie jest złym pomysłem zagnieżdżanie funkcji is_legal_choice wewnątrz funkcji rekursywnej solve? Czy ta funkcja wewnętrzna zostanie przedefiniowana za każdym razem, gdy wywoływana jest funkcja solve?Czy wewnętrzna funkcja wewnątrz funkcji rekursywnej jest złym pomysłem?

+3

Funkcja * * Obiekt zostanie odtworzony za każdym razem swoją funkcją jest tzw. To nie jest tak źle, jak się wydaje; obiekt kodu jest już obecny, a tworzenie obiektu funkcji jest stosunkowo lekkie. –

+0

Jeśli ma to sens z punktu widzenia konserwacji/czytelności, nie przejmuj się nadmiernie kosztem tworzenia funkcji obiektu. –

+0

@MartijnPieters: Zrobię to ... dzięki! – rookie

Odpowiedz

5

Tak, wewnętrzna funkcja zostanie przedefiniowana za każdym razem, gdy funkcja zostanie wywołana. Jednak nie jest tak źle, jak można by przypuszczać; kod Pythona jest raz przetwarzany w obiekt kodu, a tylko obiekt funkcji (który służy jako rodzaj opakowania dla obiektu kodu) jest budowany od nowa za każdym razem.

+0

Dziękuję za odpowiedź. Ma to sens i ma charakter informacyjny! – rookie

1

Tak, zostanie ponownie zdefiniowane za każdym razem, gdy zostanie wywołane. Jednak nie zawsze jest to zły pomysł. W ten sposób możesz zrobić zamknięcie, które czasami jest przydatne.

Jeśli twoja funkcja is_legal_choice potrzebuje użyć pewnych danych, które są dostępne tylko w zakresie funkcji zewnętrznej, chciałbym powiedzieć, idź za tym. Narzut wydajności nie będzie zbyt duży (zawsze możesz profilować, jeśli potrzebujesz).

Jeśli is_legal_choice nie potrzebuje żadnych danych z parametrów solve, rób wszystko, co czyni twój kod bardziej zrozumiałym.

można znaleźć więcej informacji na temat zamknięć z google, ale oto przykład: http://ynniv.com/blog/2007/08/closures-in-python.html

Powiązane problemy