Rozważ trzy funkcje:
def my_func1():
print "Hello World"
return None
def my_func2():
print "Hello World"
return
def my_func3():
print "Hello World"
Wszystkie wydają się zwracać Brak. Czy są jakieś różnice między zachowaniem zwracanej wartości tych funkcji? Czy są jakieś powody, by preferować jedno od drugiego?
return None
sugeruje mi, że funkcja czasami maNone
wartość zwrotną, ale w miejscureturn None
takiej wartości zwrotnej nie ma. Brakreturn
zapisu sugeruje, że nigdy nie ma interesującej wartości zwracanej, takiej jak „procedura” w przeciwieństwie do „funkcji”.return
implikuje istnienie wcześnie na podstawie „procedury” zgodnie z poprzednim punktem.Odpowiedzi:
Od rzeczywistego zachowania nie ma różnicy. Wszyscy wracają
None
i to wszystko. Jest jednak czas i miejsce na wszystkie z nich. Poniższe instrukcje przedstawiają w zasadzie, w jaki sposób należy stosować różne metody (a przynajmniej tak, jak mnie nauczono, jak należy ich używać), ale nie są to bezwzględne zasady, więc możesz je mieszać, jeśli uważasz, że jest to konieczne.Za pomocą
return None
To mówi, że funkcja rzeczywiście ma zwrócić wartość do późniejszego użycia, w tym przypadku zwraca
None
. Tę wartośćNone
można następnie wykorzystać w innym miejscu.return None
nigdy nie jest używane, jeśli nie ma innych możliwych wartości zwracanych z funkcji.W poniższym przykładzie zwracamy
person
,mother
jeśliperson
dany jest człowiekiem. Jeśli to nie jest człowiek, wracamy,None
ponieważperson
nie mamother
(przypuśćmy, że to nie zwierzę ani coś takiego).Za pomocą
return
Jest to używane z tego samego powodu, co
break
w pętlach. Zwracana wartość nie ma znaczenia i chcesz tylko wyjść z całej funkcji. Jest to niezwykle przydatne w niektórych miejscach, nawet jeśli nie jest to tak często potrzebne.Mamy 15
prisoners
i wiemy, że jeden z nich ma nóż. Pętlimy poprisoner
kolei, aby sprawdzić, czy mają nóż. Jeśli uderzymy osobę nożem, możemy po prostu wyjść z funkcji, ponieważ wiemy, że jest tylko jeden nóż i nie ma powodu, aby sprawdzić resztęprisoners
. Jeśli nie znajdziemyprisoner
noża, alarmujemy. Można to zrobić na wiele różnych sposobów, a użyciereturn
prawdopodobnie nie jest nawet najlepszym sposobem, ale jest to tylko przykład pokazujący, jak używaćreturn
do wychodzenia z funkcji.Uwaga: Nigdy nie należy tego robić
var = find_prisoner_with_knife()
, ponieważ wartość zwracana nie jest przeznaczona do przechwycenia.W ogóle nie
return
używamTo również zwróci
None
, ale ta wartość nie jest przeznaczona do użycia ani przechwycenia. Oznacza to po prostu, że funkcja zakończyła się powodzeniem. Zasadniczo jest taki sam, jakreturn
wvoid
funkcjach w językach takich jak C ++ lub Java.W poniższym przykładzie ustawiamy imię matki osoby, a następnie funkcja kończy działanie po pomyślnym zakończeniu.
Uwaga: Nigdy nie należy tego robić
var = set_mother(my_person, my_mother)
, ponieważ wartość zwracana nie jest przeznaczona do przechwycenia.źródło
var = get_mother()
jest OK, jeśli przechodziszvar
do innych funkcji, które akceptująNone
- „nigdy” jest trochę ekstremalnevar = get_mother()
nie można jej użyć? IMHO to w porządku. Musisz tylko sprawdzić, czy nie maNone
wartościif var
przed użyciem.Tak, wszystkie są takie same.
Możemy przejrzeć zinterpretowany kod maszynowy, aby potwierdzić, że wszyscy robią dokładnie to samo.
źródło
dis.dis
zwracaNone
: -Xdis.dis
zgłasza również niektóre numery linii ...Każdy z nich zwraca ten sam singleton
None
- nie ma różnicy funkcjonalnej.Myślę, że rozsądnie idiomatyczne jest pominięcie
return
instrukcji, chyba że trzeba jej wcześnie wyjść z funkcji (w takim przypadku nagireturn
występuje częściej) lub zwrócić coś innego niżNone
. Ma to również sens i wydaje się idiomatyczne do pisania,return None
gdy jest w funkcji, która ma inną ścieżkę, która zwraca coś innego niżNone
. Piśmiereturn None
z wyraźnie jest wizualną wskazówkę dla czytelnika, że istnieje inny oddział, który zwraca coś bardziej interesujący (i to wywołanie kodu będzie prawdopodobnie trzeba obsługiwać oba typy wartości zwracanej).Często w Pythonie, funkcje, które zwracają
None
służą jakvoid
funkcje w C - Ich celem jest generalnie działają na argumentach wejściowych na miejscu (chyba, że używasz danych globalnych ( dreszcze )). ZwracanieNone
zwykle czyni bardziej wyraźnym, że argumenty zostały zmutowane. To sprawia, że nieco bardziej jasne jest, dlaczego warto pominąć toreturn
stwierdzenie z punktu widzenia „konwencji językowych”.To powiedziawszy, jeśli pracujesz w bazie kodu, która ma już ustalone konwencje dotyczące tych rzeczy, zdecydowanie podążę za tym, aby baza kodu pozostała jednolita ...
źródło
return
instrukcję, zwracaNone
.Ruby
iJavascript
przyjmują takie samo podejście jak python. Jestem pewien, że tam są przykłady języków wysokiego poziomu, które mówią „void” w wyrażeniu, ale nie mogę myśleć o każdy w tej chwili (może jeśli wziąć pod uwagęJava
język wysokiego poziomu) ... W jaki sposób małpa-łatanie funkcja (która jest przydatna między innymi do wyśmiewania się w testach) działa w hipotetycznym świecie, w którym python otrzymałvoid
słowo kluczowe, które ją sprawiło, że funkcja nic nie zwróciła? (Ponadto, jak powiedziałem wcześniej, nie musisz mnie przekonywać, że to zły projekt. Nie mogę nic zrobić, nawet jeśli masz rację)Jak inni odpowiedzieli, wynik jest dokładnie taki sam,
None
jest zwracany we wszystkich przypadkach.Różnica jest stylistyczna, ale należy pamiętać, że PEP8 wymaga spójnego użycia:
https://www.python.org/dev/peps/pep-0008/#programming-recommendations
Zasadniczo, jeśli kiedykolwiek zwrócisz
None
wartość w funkcji, oznacza to, że zwracana wartość ma znaczenie i jest przeznaczona do przechwycenia przez osoby dzwoniące. Więc kiedy wracaszNone
, musi być również jawne, aby przekazaćNone
w tym przypadku ma znaczenie, jest to jedna z możliwych wartości zwracanych.Jeśli w ogóle nie potrzebujesz zwrotu, funkcja działa w zasadzie jako procedura zamiast funkcji, więc po prostu nie dołączaj
return
instrukcji.Jeśli piszesz funkcję podobną do procedury i istnieje możliwość powrotu wcześniej (tj. Już skończyłeś i nie musisz wykonywać pozostałej części funkcji), możesz użyć pustych znaków
return
s do zasygnalizowania czytnikowi jest to tylko wczesne zakończenie wykonywania, aNone
wartość zwrócona niejawnie nie ma żadnego znaczenia i nie jest przeznaczona do przechwycenia (funkcja podobna do procedury i tak zawsze zwraca wartośćNone
).źródło
Pod względem funkcjonalności są one takie same, różnica między nimi polega na czytelności kodu i stylu (co należy wziąć pod uwagę)
źródło