2017-09-21 5 views
1

Mein Programm soll eine Eingabe in Form einer Zeichenkette aufnehmen und in Zeichenfolgen aufteilen, eine mit allen Kleinbuchstaben, Unterstrichen und Punkten. Der andere mit all den oberen Fällen, den Pfeifen und den Räumen. Ich bin nicht verwenden (Funktion) sollString-Index außerhalb des zulässigen Bereichs? 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 

Können Sie mir bitte sagen, mehr über den Fehler erhalte ich?

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

+1

Weil 'Buchstaben' die leere Zeichenfolge ist? –

+0

@ WillemVanOnsem meine Eingabe wäre Buchstaben = "HfEFFefF _" z. –

+1

Sie führen jedoch einen rekursiven Aufruf am Ende der Zeichenfolge aus. –

Antwort

2

Sie haben eine rekursive Funktion definiert: die Anrufe split_rec (letters[1:]). Da eine Zeichenfolge endliche Länge hat, werden Sie schließlich die leere Zeichenfolge übergeben. Das bedeutet, dass Sie nicht auf das erste Zeichen zugreifen können, da es kein erstes Zeichen hat.

Sie können dieses Problem lösen, indem eine Wache mit:

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

Aber das wird das Problem nicht lösen: da ein Tupel von zwei Strings zurückgibt, können Sie dies zu einem Zeichen nicht hinzufügen können. Sie können das Problem lösen, indem Sie:

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

Aber dennoch Rekursion, die linear mit Eingang skaliert in Python ist eine schlechte Idee: Python optimiert nicht rekursive Aufrufe, und so eine leicht eine Ausnahme Stackoverflow wird (das hat nichts mit dieser Seite zu tun).

Sie besser einen Generator und join die Saiten zusammen verwenden:

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

> senkt, upers = split_rec() TypeError: split_rec() fehlt 1 benötigt positional Argument: 'Briefe' Vielen Dank, ich verstehe, was Sie dort getan haben, aber ich bekomme diesen Fehler jetzt, ich weiß, ich bin viel fragen, aber ich lerne wirklich von dir –

+1

@nazeeroobu: ja, ich habe vergessen, den Parameter hinzuzufügen. –

1

als @willemVanOnsem wies darauf hin, Sie werden diese minus dem ersten Zeichen auf der Saite rekursiv aufrufen. Eventuell rufen Sie eine leere Zeichenfolge auf, weshalb Sie einen Indexfehler erhalten. Überprüfen Sie, dass "Buchstaben" nicht leer ist, bevor Sie etwas anderes tun.

als eine Randnotiz, ich glaube nicht, dass Ihre rekursive Anruf wird tun, was Sie erwarten.

können Sie eine While-Schleife verwenden? Sie erwähnen, keine for-Schleife zu verwenden? oder müssen Sie Rekursion verwenden?

Verwandte Themen