让字符串索引超出范围? python 3

Getting string index out of range? 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

你能告诉我更多有关我遇到的错误的信息吗?

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

您已经定义了一个 递归函数 split_rec 调用 split_rec (letters[1:])。由于字符串的长度有限,最终您将 将空字符串 传递给它。这意味着您无法访问第一个字符,因为它没有第一个字符。

你可以通过使用守卫来解决这个问题:

def split_rec (letters):
    uppers = ""
    lowers = ""
    <b>if not letters:
        return lowers, uppers</b>
    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 returns 是两个字符串的元组,所以不能将其添加到字符中。您可以使用以下方法解决问题:

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

但是尽管如此递归与输入成线性关系是Python一个坏主意:Python不优化递归调用,所以很容易得到Whosebug 异常(这与本网站无关)。

你最好使用生成器和 join 字符串:

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

正如@willemVanOnsem 所指出的,您是在减去第一个字符的字符串上递归调用它。最终,您在一个空字符串上调用它,这就是您收到索引错误的原因。在执行任何其他操作之前检查 "letters" 是否为空。

附带说明一下,我认为您的递归调用不会达到您的预期。

可以使用 while 循环吗?你提到不使用 for 循环?还是必须使用递归?