Czy można wywołać funkcję bez wcześniejszego jej pełnego zdefiniowania? Przy próbie tego pojawia się błąd: „ nazwa_funkcji nie jest zdefiniowana”. Pochodzę z C ++, więc ten problem mnie przytłacza.
Deklarowanie funkcji przed działaniem:
def Kerma():
return "energy / mass"
print Kerma()
Jednak próba wywołania funkcji bez wcześniejszego jej zdefiniowania sprawia kłopoty:
print Kerma()
def Kerma():
return "energy / mass"
W C ++ możesz zadeklarować funkcję po wywołaniu, gdy umieścisz przed nią jej nagłówek.
Czy coś mi umyka?
python
function
formatting
TheGentleOne
źródło
źródło
Kerma is an acronym for "kinetic energy released per unit mass"
.py
pliku i importowania tego? Czy są jakieś niezamierzone konsekwencje?Odpowiedzi:
Jednym ze sposobów, które jest trochę idiomatyczne w Pythonie, jest pisanie:
def main(): print Kerma() def Kerma(): return "energy / mass" if __name__ == '__main__': main()
Pozwala to na pisanie kodu w dowolnej kolejności, o ile wywołujesz funkcję
main
na końcu.źródło
main
funkcji jest zwykle umieszczona na końcu.if __name__ == '__main__':
przełącznik jest wspólną częścią idiomatyczną.if ... __main__':
. Nie powiedziałem, żemain
powinien być umieszczony nad resztą kodu. Powiedziałem, że ważna część to wezwanie_\_main__
na końcu i nie ma znaczenia, gdzie wtedy umieścisz jego definicję.Kiedy uruchamiany jest moduł Pythona (plik .py), zawarte w nim instrukcje najwyższego poziomu są wykonywane w kolejności, w jakiej się pojawiają, od góry do dołu (od początku do końca). Oznacza to, że nie możesz się do czegoś odwołać, dopóki tego nie zdefiniujesz. Na przykład poniższe wygeneruje pokazany błąd:
c = a + b # -> NameError: name 'a' is not defined a = 13 b = 17
W przeciwieństwie do wielu innych językach,
def
aclass
sprawozdania są wykonywalne w Pythonie nie tylko deklaratywne, więc nie można odwołać alboa
czyb
aż tak się dzieje i są one zdefiniowane. Z tego powodu pierwszy przykład ma problem - odwołujesz się doKerma()
funkcji przed wykonaniem jejdef
instrukcji i przetworzeniem treści, a wynikowy obiekt funkcji jest powiązany z nazwą funkcji, więc nie jest zdefiniowany w tym momencie w skrypcie.Programy w językach takich jak C ++ są zwykle wstępnie przetwarzane przed uruchomieniem, a na tym etapie kompilacji cały program i wszystkie
#include
pliki, do których się odnosi, są odczytywane i przetwarzane jednocześnie. W przeciwieństwie do Pythona, język ten zawiera deklaratywne instrukcje, które pozwalają na zadeklarowanie (ale niezdefiniowanie) nazwy i sekwencji wywoływania funkcji (lub statycznego typu zmiennych) przed użyciem, aby kompilator napotkał ich nazwę miał wystarczająco dużo informacji, aby sprawdzić ich użycie, które obejmuje przede wszystkim sprawdzanie typów i konwersje typów, z których żadna nie wymaga jeszcze zdefiniowania ich rzeczywistej zawartości ani treści kodu.źródło
doit(); sub doit { print("I'm doing it!\n"); }
Nie jest to możliwe w Pythonie, ale szczerze mówiąc, wkrótce okaże się, że w ogóle go nie potrzebujesz. Pythonowym sposobem pisania kodu jest podzielenie programu na moduły, które definiują klasy i funkcje oraz jeden „główny moduł”, który importuje wszystkie pozostałe i działa.
W przypadku prostych skryptów do wyrzucenia przyzwyczaić się do umieszczania „wykonywalnej części” na końcu lub jeszcze lepiej, naucz się korzystać z interaktywnej powłoki Pythona.
źródło
Python jest językiem dynamicznym, a interpreter zawsze przyjmuje stan zmiennych (funkcji, ...) taki, jaki jest w momencie ich wywołania. Możesz nawet przedefiniować funkcje w niektórych blokach if i wywoływać je za każdym razem inaczej. Dlatego musisz je zdefiniować, zanim do nich zadzwonisz.
źródło
Jeśli chcesz być jak C ++ i używać wszystkiego wewnątrz funkcji. możesz wywołać pierwszą funkcję od dołu pliku, na przykład:
def main(): print("I'm in main") #calling a although it is in the bottom a() def b(): print("I'm in b") def a(): print("I'm in a") b() main()
W ten sposób Python najpierw „czyta” cały plik, a dopiero potem zaczyna wykonywanie
źródło