2009-10-15 11 views
26

Po prostu uczę się Pythona i zdezorientowany, gdy kończy się "def" funkcji?Funkcja defektu Pythona: Jak określa się koniec funkcji?

widzę przykłady kodu, takich jak:

def myfunc(a=4,b=6): 
    sum = a + b 
    return sum 

myfunc() 

wiem, że to nie koniec, bo w zamian (bo widziałem if ... jeśli FOO niż powrotnej BAR, jeszcze powrócić foobar). W jaki sposób Python wie, że nie jest to funkcja rekursywna, która sama się nazywa? Kiedy uruchomiona jest ta funkcja, po prostu kontynuuje program, dopóki nie znajdzie zwrotu? Doprowadziłoby to do kilku interesujących błędów.

Dzięki

+25

W jakim samouczku uczysz się Python? –

+2

To bardzo dobry komentarz. Każde wprowadzenie do Pythona wymienia istotne białe znaki jako jedną z pierwszych, jeśli nie pierwszą, rzeczy - jest to jedna z najbardziej charakterystycznych cech Pythona. –

+0

Do tej pory używałem tylko tego arkusza na temat ściągania: http://www.ibm.com/developerworks/library/l-cheatsheet3.html , aby po prostu spróbować i nauczyć się składni. Jeśli masz dobre sugestie samouczka, jestem otwarty. – Dan

Odpowiedz

46

Spacja w języku Python jest znacząca. Funkcja kończy się, gdy wcięcie staje się mniejsze (mniej).

def f(): 
    pass # first line 
    pass # second line 
pass # <-- less indentation, not part of function f. 

Uwaga który funkcjonuje jedna linia może być napisany bez wcięcia, w jednym wierszu:

def f(): pass 

A potem jest stosowanie średnikami, ale nie jest to polecany:

def f(): pass; pass 

trzy formy powyższe pokazują, jak koniec funkcja jest definiowana składniowo. Jeśli chodzi o semantyki w Pythonie istnieją trzy sposoby, aby wyjść z funkcji:

  • pomocą instrukcji return. Działa to tak samo, jak w każdym innym wymagającym języku programowania, który możesz znać.

  • Korzystanie z wyciągu yield. Oznacza to, że funkcja jest generatorem. Wyjaśnienie jego semantyki wykracza poza zakres tej odpowiedzi. Spójrz na Can somebody explain me the python yield statement?

  • Po prostu wykonując ostatnią instrukcję. Jeśli nie ma więcej instrukcji, a ostatnia instrukcja nie jest instrukcją return, funkcja istnieje tak, jakby ostatnia instrukcja była return None. Oznacza to, że bez wyraźnego oświadczenia return funkcja zwraca None.Funkcja ta zwraca None:

    def f(): 
        pass 
    

    I tak robi to jedno:

    def f(): 
        42 
    
1

białe przestrzenie mają znaczenie. kiedy blok zostanie zakończony, wtedy kończy się definicja funkcji.

po uruchomieniu funkcji, trwa do momentu jej zakończenia lub do napotkania return lub yield. Jeśli funkcja zostanie zakończona bez napotkania instrukcji return lub yield, zostanie zwrócona niejawnie.

jest dużo więcej informacji w the tutorial.

23

Python jest white-space czuły w odniesieniu do wcięcia. Gdy poziom wcięcia powróci do poziomu, na którym funkcja jest zdefiniowana, funkcja została zakończona.

+3

Wow ... nie spodziewał się tego. Nigdy nie słyszałem o wcięciu używanym do niczego oprócz czytelności. Dzięki! – Dan

1

wykorzystuje wgłębienie

def func(): 
    funcbody 
    if cond: 
     ifbody 
    outofif 

outof_func 
8

Mówiąc dokładniej, w bloku kończy się, gdy napotka niepusty linii wgniatany co najwyżej na tym samym poziomie, na początku. To nie pusta linia nie jest częścią tego bloku Na przykład, następujący wydruku kończy dwa bloki w tym samym czasie:

def foo(): 
    if bar: 
     print "bar" 

print "baz" # ends the if and foo at the same time 

Poziom wcięcie jest mniejszy niż lub równy zarówno def a jeśli , dlatego kończy je jedno i drugie.

Linie bez rachunku, bez względu na wgniecenia, nie ma znaczenia

def foo(): 
    print "The line below has no indentation" 

    print "Still part of foo" 

Ale stwierdzenie, że oznacza koniec bloku musi być wcięty na tym samym poziomie co istniejącej wcięcia. Dodaje, wtedy jest błąd:

def foo(): 
    print "Still correct" 
    print "Error because there is no block at this indentation" 

Generalnie, jeśli jesteś przyzwyczajony do nawiasów klamrowych języku, po prostu wciąć kod jak nimi i wszystko będzie w porządku.

BTW, "standardowy" sposób wcięcia jest tylko spacjami, ale oczywiście zakładka jest możliwa, ale proszę nie mieszać ich obu.

1

Tak więc liczy się wcięcie. Tak, jak wskazali ci inni użytkownicy, kiedy poziom wcięcia znajduje się w tym samym punkcie, co deklaracja funkcji def, twoja funkcja się zakończyła. Pamiętaj, że nie możesz mieszać kart i spacji w Pythonie. Większość redaktorów zapewnia obsługę tego.

2

Co ciekawe, jeśli piszesz tylko w Interpreteru interaktywnego Pythona, musisz wykonać funkcję z pustą linią. To nie działa:

def foo(x): 
    return x+1 
print "last" 

mimo że jest to całkowicie prawidłowa składnia Pythona w pliku. Istnieją inne różnice składniowe podczas pisania również do tłumacza, więc uważaj.

+0

Myślę, że jest to rozsądny sposób pisania funkcji Pythona."cofnięcie wcięcia" bez pustej linii wydaje się być receptą na kłopoty. –

Powiązane problemy