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?
Odpowiedz
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.
Dziękuję za odpowiedź. Ma to sens i ma charakter informacyjny! – rookie
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
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. –
Jeśli ma to sens z punktu widzenia konserwacji/czytelności, nie przejmuj się nadmiernie kosztem tworzenia funkcji obiektu. –
@MartijnPieters: Zrobię to ... dzięki! – rookie