2013-10-01 19 views
5

は、ここに私のプログラムそれが動作Pythonは:私の関数は、それは私がそれに

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

print (reverse("hello")) 

で何をしたいんが、それは「olleh」プリントアウトした後、「None」を返しませんが、後には、それが上で「None」を印刷しません改行。そして、なぜこれが頼まれているのですか? 明らかに、プログラムは単語を逆にすることであり、コードは機能していますが、関数がなければnoneを出力しないので、関数内でなぜ機能するのか分かりません。これは別の大きなプログラムで使用されているので、私はそれを関数として必要とし、それは学校用であるため、単純に.reverse()関数を使用することはできません。したがって、可能であれば大きな変更よりもむしろこのコードを修正する必要があります。

+1

[list in functionからの戻り値]の重複が可能です。 Python](http://stackoverflow.com/questions/18990977/return-items-from-list-in-function-python) – Freddie

答えて

2

return文を使用すると、値を返す関数を終了できます。関数がreturn文に到達することなく最後まで取得した場合、それはデフォルトでは、デフォルトで

def add1(x): 
    return x+1 

def returnsNone(): 
    pass 

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

これはどの言語ですか?これらの定義のどちらも有効なPython構文ではありません。 – Max

+0

@マックス:さあ、最初のものはコロンが足りなかった。 – hugomg

+1

@missingno:それだけではない。 'end'はPythonの特別なことを意味するものではありません。 – DSM

4

関数の戻りNoneをNoneを返しますので、あなたはreturn backwards明示的にも

は、あなたがにニシキヘビの方法を使用することができなければなりません問題を解決してください:

letters[::-1] 
+0

この問題を解決するためにpythonicの方法でupvotingします。 –

0

それを考えると意味があります。 reverseは何も返さず、結果だけを出力します。しかし、print (reverse("hello"))と書くと、実際にはreverseが返すものが印刷されます。何も返さないので、Noneが印刷されます。

1

すべての関数は、何かをPythonで返します。明示的に値を返さないと、Pythonは関数Noneを返します。

printが実際に値を返すのに対して、printはstdoutに出力するため、関数は実際に何も返しません。彼らはのように見えます。はREPLと同じですが、まったく異なっています。だからあなたの問題を解決するために

、値を返す:

return backwards 
0

はただ試してみてください。実際には

reverse(hello) 

print reverse(hello) 

にあなたが逆の戻り値を印刷しています。その戻り値はNoneです。

アドバイス私はあなたにいくつかの一般的に挙げてみましょう:

逆を()あなたのコード内の副作用(印刷)との関数です。必要のないときは、逆の()の単語を返す代わりに、それを印刷することを検討、副作用の 機能を回避する必要があります。

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

また

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

がmantainしやすいと場合ではありませんループに機能を追加すると、減分i = i-1は「概念的に」あるはずの場所から遠く離れたものになります。あなたがチェックとともに減少した好む必要があります。

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

私は怠け者だとき、私はので、私はあなたが怠けて理解することができます

myString = myString + fewChars 

を書きます。しかし、fewCharsを追加してもmyStringは変更されませんが、新しいものが作成されます。頻繁に多くの文字を追加している場合、最も効率的な方法はまれに1つずつ追加することです。 join()の使用を検討してください。私は同意する。例えば

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

okが読めない、おそらくないより速く、より大きな文字列のためにそれはNEWSTRING = oldString + oneCharアプローチよりも優れスケール。より多くのニシキヘビがすでに私は通常、非常にうまく機能し、Pythonプログラマが読むことが容易なよりも早く誰かが提案し

letters[::-1] 

に近づき、言っ

0

前述のとおりです。 Python関数がreturnステートメントを渡さない場合、デフォルトでNoneが出力されます。以下に示すように小さな変更を加えることで、これは修正されます。

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"))