2017-09-21 2 views
1

私のプログラムは、文字列の形で入力を受け取り、文字列に分割します。一つは、すべて小文字、アンダースコア、およびドットで構成されます。もう一つはすべての大文字、パイプ、スペースで構成されています。私は使用するべきではありません(機能用)文字列インデックスが範囲外になっていますか? python 3

def split_rec (letters): 
    uppers = "" 
    lowers = "" 
    if letters[0].isupper() or letters[0] == "|" or letters[0].isspace(): 
     uppers += letters[0] + split_rec (letters[1:]) 
    elif letters[0].islower() or letters[0] == "_" or letters[0] == ".": 
     lowers += letters[0] + split_rec (letters[1:]) 
    elif not letters: 
     return lowers, uppers 

私が得ているエラーの詳細について教えてください。 通話split_rec (letters[1:])

if letters[0].isupper() or letters[0] == "|" or letters[0].isspace(): IndexError: string index out of range

+1

'letters'は空文字列なので、 –

+0

@WillemVanOnsem私の入力はletters = "HfEFfefF _"となります。 –

+1

しかし、文字列の末尾に再帰呼び出しを実行します。 –

答えて

2

は、あなたは再帰関数定義しました。文字列の長さは有限であるため、最終的にに空の文字列を渡します。つまり、最初の文字がないため、最初の文字にアクセスすることはできません。

def split_rec (letters): 
    uppers = "" 
    lowers = "" 
    if not letters: return lowers, uppers 
    if letters[0].isupper() or letters[0] == "|" or letters[0].isspace(): 
     uppers += letters[0] + split_rec (letters[1:]) 
    elif letters[0].islower() or letters[0] == "_" or letters[0] == ".": 
     lowers += letters[0] + split_rec (letters[1:]) 
    elif not letters: 
     return lowers, uppers

をしかし、これは問題を解決することはできません:

あなたはガードを使用してその問題を解決することができ 2つの文字列のタプルを返しているので、あなたが文字にこれを追加することはできません。あなたは使用して問題を解決することができます:

def split_rec (letters): 
    if not letters: 
     return lowers, uppers 
    lowers, uppers = split_rec(letters[1:]) 
    if letters[0].isupper() or letters[0] == "|" or letters[0].isspace(): 
     uppers = letters[0] + uppers 
    elif letters[0].islower() or letters[0] == "_" or letters[0] == ".": 
     lowers = letters[0] + lowers 
    return lowers, uppers

をしかし、それにもかかわらず入力してリニアにスケール再帰はPythonで悪い考えです:Pythonは再帰呼び出しを最適化していない、ので、1は簡単に(StackOverflowの例外を取得しますこれはこのサイトとは関係ありません)。

あなたがより良い発電機とjoin文字列を一緒に使用します。@willemVanOnsemが指摘したように

def split_rec (letters): 
    uppers = ''.join(c for c in letters if c.isupper() or c == "|" or c.isspace()) 
    lowers = ''.join(c for c in letters if c.islower() or c == "_" or c == ".") 
    return lowers, uppers 
+0

> uppers = split_rec() TypeError:split_rec()missing 1必要な位置引数: 'letters' ありがとう、私はあなたがそこで何をしたのか理解しています。私はあなたに本当に学んでいます。 –

+1

@nazeeroobu:ええ、私はパラメータを追加するのを忘れました。 –

1

を、あなたは再帰的に文字列を引い最初の文字でこれを呼んでいます。最終的には空の文字列で呼び出すため、インデックスエラーが発生します。他のことをする前に "letters"が空でないことを確認してください。

私はあなたの再帰的な呼び出しが期待したことをするつもりはないと思います。

whileループを使用できますか?あなたはforループを使わないと言いますか?または再帰を使用する必要がありますか?

関連する問題