【问题标题】:Function return 'None' Python函数返回“无”Python
【发布时间】:2021-12-28 13:12:55
【问题描述】:

您好,我正在自学python。

任务: 反转单词而不影响特殊字符

示例 "abcd efgh" => "dcba hgfe" 示例 "a1bcd efg!h" => "d1cba hgf!e"

我的问题:函数返回 None

然后我添加了这一行: return reverse_text 但它仍然返回 None

谁能告诉我我的错误在哪里?

我的代码:

from string import punctuation
from string import digits


def reverse_text(str_smpl):
    sp = set.union(set(punctuation), set(digits))
    reverse_text.lst = []
    for word in str_smpl.split(' '):
        letters = [c for c in word if c not in sp]
        for c in word:
            if c not in sp:
                reverse_text.lst.append(letters.pop())
                continue
            else:
                reverse_text.lst.append(c)
        reverse_text.lst.append(' ')
    return reverse_text


if __name__ == '__main__':
    cases = [
        ("abcd efgh", "dcba hgfe"),
        ("a1bcd efg!h", "d1cba hgf!e"),
        ("", "")
    ]

    for text, reversed_text in cases:
        assert reverse_text(str_smpl) == reversed_text

    reverse_text(input('Input string '))
    print("".join(reverse_text.lst))

【问题讨论】:

  • 注入列表并不是那么 Pythonic。尝试返回重新排序的列表return reverse_text.lst
  • 为什么reverse_text在返回之前要给自己附加一个列表,而不是仅仅返回一个列表?
  • reverse_text.lst的目的是什么?
  • 一个提示是你的函数不会返回 None --- 它会返回自己。

标签: python python-3.x string function reverse


【解决方案1】:

问题是您返回的是函数名称reverse_text,因此该函数返回的是对自身的引用(不是您想要的!)。

reverse_text.lst 这样为函数分配属性并不是我在 Python 中真正遇到过的事情,我建议你只使用一个名为 reversed_text_list 之类的新局部变量以避免混淆。

我想您也想将列表中的字符连接在一起并返回一个字符串。

以下似乎正在做我认为您正在尝试做的事情:

def reverse_text(str_smpl):
    sp = set.union(set(punctuation), set(digits))
    reversed_text_list = []
    for word in str_smpl.split(' '):
        letters = [c for c in word if c not in sp]
        for c in word:
            if c not in sp:
                reversed_text_list.append(letters.pop())
                continue
            else:
                reversed_text_list.append(c)
        reversed_text_list.append(' ')
        reversed_text = ''.join(reversed_text_list)
    return reversed_text

【讨论】:

    【解决方案2】:

    返回错误是因为你定义了reverse_text.lst,但只返回reverse_text,下面的代码可以工作:-

    from string import punctuation
    from string import digits
    
    
    def reverse_text(str_smpl):
        sp = set.union(set(punctuation), set(digits))
        lst = []
    
        for word in str_smpl.split(' '):
            letters = [c for c in word if c not in sp]
    
            for c in word:
                if c not in sp:
                    lst.append(letters.pop())
                    continue
                else:
                    lst.append(c)
    
            lst.append(' ')
    
        return "".join(lst[:len(lst)-1])
    
    
    if __name__ == '__main__':
        cases = [
            ("abcd efgh", "dcba hgfe"),
            ("a1bcd efg!h", "d1cba hgf!e"),
            ("", "")
        ]
    
        for text, reversed_text in cases:
            assert reverse_text(text) == reversed_text
    
        print(reverse_text(input('Input string ')))
    

    【讨论】:

    • 首先,您删除了带有断言的行。现在程序无法正常工作,因为第 16 行 lst.append(' ')
    • 您的assert 不在函数中,而是在if 子句中
    猜你喜欢
    • 2014-02-23
    • 2013-03-25
    • 2013-09-27
    • 1970-01-01
    • 2020-08-24
    • 2021-05-10
    • 2019-02-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多