2013-10-01 25 views
5

Oto mój programPython: Moja funkcja zwraca wartość „None” Po robi to co chcę go

def reverse(letters): 
    backwards = "" 
    i = len(letters) - 1 
    while i >= 0: 
     backwards = backwards + letters[i] 
     i = i - 1 
    print (backwards) 

print (reverse("hello")) 

To działa, to wypisuje „olleh”, ale po tym, że drukuje „None” na zasadzie Nowa linia. I pytam, dlaczego tak jest. Oczywiście program ma odwrócić słowo, kod działa, a bez funkcji nie drukuje żadnego, więc nie wiem, dlaczego działa w funkcji. Jest to używane w innym większym programie, więc potrzebuję go jako funkcji, a ponieważ jest on przeznaczony dla szkół, nie wolno mi po prostu korzystać z funkcji .reverse(). Naprawdę potrzebuję tego kodu, a nie dużych zmian, jeśli to możliwe.

+1

możliwy duplikat funkcji [Zwróć pozycje z listy w funkcji. Python] (http://stackoverflow.com/questions/18990977/return-items-from-list-in-function-python) – Freddie

Odpowiedz

2

Możesz użyć instrukcji return, aby wyjść z funkcji zwracającej wartość. Jeśli funkcja dostaje się do końca bez sięgania do instrukcji return, zwróci None domyślnie

def add1(x): 
    return x+1 

def returnsNone(): 
    pass 

print(add1(2)) 
print(returnsNone()) 
+3

Jaki to jest język? Żadna z tych definicji nie jest poprawną składnią pythona. – Max

+0

@ Max: chodź, pierwszy brakowało dwukropka :) – hugomg

+1

@missingno: Nie tylko to. 'end' nie znaczy nic specjalnego w Pythonie. – DSM

4

funkcji zwrot None domyślnie, więc należy return backwards wyraźnie

również można użyć pythonic sposobem rozwiązać problem:

letters[::-1] 
+0

upvoting na pytony sposób na rozwiązanie problemu. –

0

Ma to sens, jeśli się nad tym zastanowić. Twój reverse niczego nie zwraca - po prostu wypisuje wynik. Ale kiedy piszesz print (reverse("hello")), faktycznie drukujesz to, co zwraca reverse. Ponieważ nic nie zwraca, drukowana jest None.

1

Każda funkcja zwraca coś w języku Python. Jeśli nie zwracasz jawnie wartości, Python ma twoją funkcję return None.

Twoja funkcja nie zwraca niczego, ponieważ print drukuje na standardowe wyjście, podczas gdy return faktycznie zwraca wartość. Mogą one wyglądać tak samo w REPL, ale są zupełnie inne.

Tak, aby naprawić problem, zwróci wartość:

return backwards 
0

Spróbuj tak:

reverse(hello) 

W rzeczywistości z

print reverse(hello) 

drukowania wartości zwracanej odwrocie. A tą wartością zwracaną jest None.

Podam kilka ogólnych radzi:

odwróconych() w kodzie jest funkcją ze skutkami ubocznymi (druk). Należy unikać funkcje z efektów ubocznych, gdy nie trzeba, należy rozważyć odwróconych() powraca słowo zamiast drukować go:

def reverse(letters): 
    backwards = "" 
    i = len(letters) - 1 
    while i >= 0: 
     backwards = backwards + letters[i] 
     i = i - 1 
    return backwards 
print (reverse("hello")) 

Ponadto

i = len(letters) - 1 
    while i >= 0: 
     backwards = backwards + letters[i] 
     i = i - 1 

nie jest łatwe, a jeśli mantain dodajesz funkcjonalność pętli, której dekrement i = 1 będzie daleki od miejsca, w którym powinien być "koncepcyjnie".Należy wolisz mający ubytek wraz z czekiem:

for i in xrange(len(letters)-1,-1,-1): 
    backwards = backwards + letters[i] 

Kiedy jestem leniwy Piszę

myString = myString + fewChars 

więc mogę zrozumieć, że jesteś leniwy. Ale dodanie fewChars nie modyfikuje myString, ale tworzy nowy. Jeśli iteracyjnie dodajesz wiele znaków, rzadko najskuteczniejszym sposobem jest dodawanie jeden po drugim. Rozważ użycie join(). Na przykład

letters = 'word' 
lettersList = [letters[i] for i in xrange(len(letters)-1,-1,-1)] 
myReversed ''.join(lettersList) 

ok zgadzam nie jest czytelny i prawdopodobnie nawet szybciej, ale dla większych ciągów skaluje lepiej niż newString = oldString + oneChar podejścia.

To powiedziawszy, bardziej pythonic zbliża

letters[::-1] 

już sugerowane przez kogoś szybciej niż ja zazwyczaj działa znacznie lepiej i są łatwe do odczytania przez programistów Pythona.

0

Jak wspomniano wcześniej. Jeśli funkcja python nie natknie się na instrukcję return, domyślnie wypisze None. Dokonanie niewielkiej zmiany, jak pokazano poniżej, powoduje, że:

def reverse(letters): 
    backwards = "" 
    i = len(letters) - 1 
    while i >= 0: 
     backwards = backwards + letters[i] 
    i = i - 1 
    return(backwards) # instead of print(backwards) 

print(reverse("hello"))