Jak używać funkcji main?¶
Używanie funkcji to dobry pomysł. Pomaga nam to zorganizować nasz program w logiczne części, gdzie każda z osobna realizuje specyficzne zadanie. Wróćmy na chwilę do naszego pierwszego programu, gdzie zdefiniowaliśmy funkcję draw_square, która miała za zadanie narysować kwadrat danych rozmiarów za pomocą żółwia. Właściwy obiekt, będący żółwiem oraz konkretna długość boku kwadratu musiały być zdefiniowane, tak, aby mogły być podane jako argumenty. Poniżej widnieje oryginalny program.
import turtle
def draw_square(t, sz):
"""Uzywa zolwia t do narysowania kwadratu o boku sz."""
for i in range(4):
t.forward(sz)
t.left(90)
wn = turtle.Screen() # Ustawiamy okno i jego atrybuty
wn.bgcolor("lightgreen")
alex = turtle.Turtle() # tworzymy alexa
draw_square(alex, 50) # wolamy funkcje rysujaca kwadrat
wn.exitonclick()
Jeżeli przyjrzymy się strukturze tego programu, zauważymy, że na początku umieszczamy wszystkie niezbędne wyrażenia import (zaimportuj); w tym przypadku są one niezbędne do tego, by używać modułu turtle (żółw). W następnym kroku definiujemy funkcję draw_square. Będąc w tym miejscu możemy zdefiniować tyle funkcji, ile nam potrzeba. Następnie widzimy pięć wyrażeń, które ustawiają okno do rysowania, budują żółwia, wywołują funkcję i ostatecznie czekają, aż użytkownik kliknie myszą, aby zakończyć działanie programu.
Te pięć końcowych wyrażeń wykonuje główną cześć programu. Zauważmy, że dużą część detali umieszczono w ciele funkcji draw_square. Pomimo tego wciąż potrzebujemy tych pięć linii kodu, aby dokończyć zadania.
W wielu językach programowania (jak Java czy C++), nie jest możliwe, aby wyrażenia podobne do tych na końcu programu widniały ot tak, samodzielnie. Wymagane jest by były one częścią specjalnej funkcji o nazwie main (funkcja główna). Pomimo tego, że nie jest to wymagane w języku Python, nie będzie to zły pomysł, jeżeli włączymy je w logiczną strukturę programu. Innymi słowy, te pięć linii jest ze sobą logicznie połączone, ponieważ stanowią one główną część zadania jakie ma wykonać program. Jako, że funkcje są stworzone do tego by rozbijać program na logiczne części, nazywanie tej części programu główną (main) zdecydowanie ma sens.
Poniższy activecode ukazuje tę ideę. W linii 11 zdefiniowaliśmy nową funkcję, którą nazwaliśmy main. Nie wymaga ona żadnych dodatkowych parametrów. Owe pięć linii, stanowiących główną część programu umieścimy teraz wewnątrz tej funkcji. Teraz, by uruchomić główną część programu musimy wywołać funkcję main (patrz linia 20). Gdy wciśniecie przycisk „run”, zobaczycie, że program działa dokładnie tak samo jak wcześniej.
Teraz struktura programu wygląda następująco. Na początku importujemy te moduły, które będą niezbędne do jej działania. Następnie definiujemy wszystkie potrzebne funkcje. Teraz definiujemy funkcję main, która uruchomi główną część programu. Na koniec wywołujemy funkcję główną main (która wywoła inne potrzebne funkcje).
Informacja
W języku Python nie ma nic specjalnego w funkcji main. Moglibyśmy nazwać ją jak tylko chcemy. Wybraliśmy nazwę main tylko po to, by zachować zgodość z innymi językami programowania.
Część zaawansowana
Zanim interpreter języka Python uruchomi Twój program, definiuje on kilka specjalnych zmiennych. Jedną z nich jest zmienna __name__, do której automatycznie przypisywana jest wartość "__main_" w momencie, gdy dany kod uruchamiany jest niezależnie, jako samodzielny program. Z drugiej strony, gdy dany kod importowany jest z poziomu innego programu, wartość zmiennej __name__ ustawiana jest jako nazwa tego właśnie modułu. Oznacz to, że wiemy, czy moduł uruchamiany jest jako niezależny program czy może używany jest przez inny program. Bazując na tej wiedzy, możemy zdecydować, czy uruchamiać wybraną część kodu.
Załóżmy przykładowo, że napisaliśmy szereg funkcji, wykonujących proste obliczenia matematyczne. Wywołania tych funkcji możemy zamieścić w funkcji main. Jest jednak bardziej prawdopodobne, że funkcje te będą zaimportowane przez inny program, do zupełnie innych celów. W tym przypadku, nie będziemy raczej chcieli wywoływać funkcji main.
W poniższym oknie activcode zdefiniowane są dwie proste funkcje oraz funkcja main.
W linii 12 znajdziemy wyrażenie if, aby sprawdzić wartość zmiennej __name__. Jeżeli będzie to __main__, wtedy wywołana będzie funkcja main. W innym przypadku możemy założyć, że powyższy program został zaimportowany z poziomu innego programu, nie będziemy zatem chcieli wywołać funkcji main, gdyż ów nowy program będzie używać powyższych funkcji wedle potrzeb. Możliwość warunkowego uruchamiania funkcji main może się okazać bardzo potrzebna, gdy piszemy program, który potencjalnie będzie używany przez innych. Umożliwia nam też dodanie tej funkcjonalności, której użytkownik kodu nie będzie potrzebował. Najczęściej będą to procedury testowe sprawdzające poprawne funkcjonowanie funkcji.
Informacja
Aby warunkowo wywołać funkcję main użyliśmy wyrażenia if, aby stworzyć rozgałęzienie. Tematyka ta będzie dokładnie omawiana nieco później.