【问题标题】:Return/print amount of digits in a sentence OR an error message返回/打印句子中的位数或错误消息
【发布时间】:2012-12-04 23:46:02
【问题描述】:

我是该网站和 python 的新手,所以我希望我能提供所有必需的信息。我已经搜索过这个问题,但似乎没有一个解决方案适合我。

我正在尝试创建一个函数来读取一些文本并返回它包含的位数。例如:

"It is 2012" , 应该返回 "Text has 4 digits"

如果没有数字,它应该返回不同的消息,例如:

"今天是星期一",应该返回"文本不包含数字"

所以我写了这个:

def CountNumbers(txt):
    sum = 0

    for n in txt:
        if n.isdigit() == False:
            print ("Text does not contain digits")

        else:
            sum += 1


    print("Text has", sum, "digit(s)")


txt = str(input("Write some text: "))
(CountNumbers(txt))

功能似乎还可以,但打印结果错误,例如:

Write some text: 65
Text has 2 digit(s) #this is ok, but...

当我只输入文字时:

Write some text: sd 
Text does not contain digits
Text does not contain digits
Text does not contain digits
Text has 0 digit(s)

当我输入文本和数字时(但首先输入文本):

Write some text: sd 564
Text does not contain digits
Text does not contain digits
Text does not contain digits
Text has 3 digit(s)

我知道我的错误在于块,(我认为),但我还没有想出办法,因为当我使用 return 时,它会在完成阅读文本之前停止。我已经尝试了大约 20 多种不同的方法,请帮助我!

谢谢!!

附:我需要它作为 .py 而不仅仅是在 IDLE (Python Shell) 窗口中工作,这就是我编写这样的块的原因。

【问题讨论】:

  • +1 表示简短的自包含代码和示例输入/输出。多个样品,甚至!喜欢它。
  • 请记住,根据 Python 的命名约定,您的函数应命名为 count_numbers() 而不是 CountNumbers
  • 另外,你不应该将变量命名为sum,因为这是一个内置函数的名称。
  • 非常感谢你们!...我知道我很接近...这 python 的东西对我来说真的很复杂哈哈哈...谢谢!
  • 是的,我不知道,因为我实际上是在用西班牙语编写代码,所以当我在这里翻译代码来询问它时,变量 suma(西班牙语为 sum)变成了 sum,直到在那之后我才意识到 sum 也是一个函数......它仍然有效,但我还是改变了它:P

标签: python string return message digits


【解决方案1】:

我刚刚解决了你的代码问题:

def CountNumbers(txt):
    sum = 0

    for n in txt:
        if n.isdigit():
            sum += 1

    if sum:
        print("Text has", sum, "digit(s)")
    else:
        print ("Text does not contain digits")


CountNumbers(input("Write some text: "))

【讨论】:

  • 您的回答真的很有帮助,非常感谢! ...我想知道,为什么你不写 if sum > 0: 和 just if sum ... 它们都有效,但我想知道为什么。我认为只是“如果总和:”甚至不是一个条件!哈哈
  • @user1911059 - 如果您将数字评估为布尔值,则如果它为零,则为 False,否则为 True。所以在像if sum: 这样的语句中,如果sum 大于零,即至少有一个数字,则为True
【解决方案2】:

问题是每次遇到非数字字符时都会打印“文本不包含数字”消息。当您知道有多少个字符时,尝试将该打印语句移到循环之后:

def CountNumbers(txt):
    sum = 0

    for n in txt:
        if n.isdigit():
            sum += 1

    if sum > 0:   
        print("Text has", sum, "digit(s)")
    else:
        print ("Text does not contain digits")

txt = str(input("Write some text: "))
(CountNumbers(txt))

编辑:关于优秀 Python 代码的几点:

  • 如您问题的 cmets 中所述,按照惯例,Python 中的函数/方法以小写字母命名,并带有下划线,即 count_numbers 而不是 CountNumbers
  • 迂腐模式:您计算的是字符串中的数字,而不是数字,因此为了清楚起见,它应该真正命名为 count_digits
  • 有一个名为sum 的内置Python 函数。通过使用同名变量来隐藏这个函数被认为是不好的做法。我会将您的 sum 变量重命名为 count
  • 无需将函数调用括在括号中(它不会造成任何伤害,除了在恕我直言时看起来很糟糕)。

通过这些更改,您的代码变为:

def count_digits(txt):
    count = 0

    for n in txt:
        if n.isdigit():
            count += 1

    if count > 0:   
        print("Text has", count, "digit(s)")
    else:
        print ("Text does not contain digits")

txt = str(input("Write some text: "))
count_digits(txt)

【讨论】:

    【解决方案3】:

    提前退货还不错,可以大大简化代码:

    def CountNumbers(txt):
        for n in txt:
            if not n.isdigit():
                print ("Text does not contain digits")
                return
    
        print("Text has", len(txt), "digit(s)")
    
    txt = str(input("Write some text: "))
    (CountNumbers(txt))
    

    此函数在出现非数字字符时立即返回,或打印输入字符串的长度(由 个数字组成)。

    你也可以用这样的“生成表达式”来写:

    def CountNumbers(txt):
        if all(char.isdigit() for char in txt):
            print("Text has", len(txt), "digit(s)")
        else:
            print ("Text does not contain digits")
    
    txt = str(input("Write some text: "))
    (CountNumbers(txt))
    

    现在,Python 函数更典型地返回值并让调用代码对其进行操作。此版本返回字符串并让程序的“主要”部分打印结果。它还将函数重命名为全小写(Python 通常使用大写的类名称):

    def countnumbers(txt):
        if all(char.isdigit() for char in txt):
            return "Text has %d digit(s)" % len(txt)
        else:
            return "Text does not contain digits"
    
    txt = str(input("Write some text: "))
    print(countnumbers(txt))
    

    嗯,不要太破旧!但是 Python 也有漂亮的条件表达式,比如:

    def countnumbers(txt):
        return ("Text has %d digit(s)" % len(txt)
            if all(char.isdigit() for char in txt)
            else "Text does not contain digits")
    
    txt = str(input("Write some text: "))
    print(countnumbers(txt))
    

    最后,也许你想把它做成一个合适的模块,以便其他代码可以使用它。像这样包装程序的交互部分,它只会在您像命令行脚本一样运行它时执行,但如果您将其作为模块导入,则不会

    def countnumbers(txt):
        return ("Text has %d digit(s)" % len(txt)
            if all(char.isdigit() for char in txt)
            else "Text does not contain digits")
    
    if __name__ == '__main__':
        txt = str(input("Write some text: "))
        print(countnumbers(txt))
    

    如果我将该函数编写为生产系统的一部分,那将非常接近它的外观。请注意,逻辑 与您的第一次尝试相同。最大的不同是这个版本让 Python 完成了大部分工作。

    【讨论】:

    • 哇这真的很有趣,我仍然不熟悉这种写作,但这确实扩大了我的理解。谢谢!
    • 检查下面的 cmets - 上面的 all(char.isdigit() for char in txt) 不能按预期工作 - 应该是 all([char.isdigit() for char in txt])。除此之外,原始问题指出:'"It is 2012" ,应该返回 "Text has 4 digits"'。在这种情况下,短路不会给出错误的答案吗?
    【解决方案4】:

    对原版进行了稍微 Pythonic 的改造。就个人而言,我发现“列表理解”形式更容易阅读(除非它是嵌套的):

    def count_digits(txt):
        count = len([c for c in txt if c.isdigit()])
    
        if count > 0:
            print ("Text has", count, "digit(s)")
        else:
            print ("Text does not contain digits")
    

    【讨论】:

    • 在 Python 2.4+ 中,您可以将其写为 count = len(c for c in txt if c.isdigit())。那是一个“生成器表达式”。
    • 我之前尝试过,得到了'object of type 'generator' has no len()'。在 IPython 中运行 2.7.3。
    • 忽略我。我的下午咖啡还没有开始。 :-D
    猜你喜欢
    • 2019-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-21
    • 1970-01-01
    相关资源
    最近更新 更多