【问题标题】:Creating a function to do what the builtin function "isdigit" does [closed]创建一个函数来完成内置函数“isdigit”所做的事情[关闭]
【发布时间】:2013-10-13 23:04:00
【问题描述】:
def my_isdigit(str):
    if digit in str >0 and str is int:
        print "True"
    else:
        print "False"

我正在尝试创建一个函数来执行 isdigit 所做的事情,即如果字符串中的所有字符都是数字并且至少有一个字符,则返回 true,否则返回 false。每次我尝试使用它时,它都会告诉我“数字”没有定义。我对它要求我改变什么感到困惑......我们将不胜感激!

【问题讨论】:

    标签: python string function python-2.7 if-statement


    【解决方案1】:

    该函数查看每个字符,如果都是数字,则只返回True

    digits = '0123456789'
    
    def isdigit(inputstring):
        if not inputstring: return False
        for char in inputstring:
            if char not in digits:
                return False
        return True
    

    或者使用字符串比较:

    def isdigit(inputstring):
        if not inputstring: return False
        for char in inputstring:
            if not '0' <= char <= '9':
                return False
        return True
    

    很遗憾,您的功能已经过时了。你没有定义digit,也没有循环str的字符。 int 是一个类型;字符串(甚至单个字符)是 not 整数;像-42 这样的字符串可以转换为整数,但'-42'.isdigit() 返回False,因为'-' 不是数字。

    【讨论】:

    • 感谢您的帮助!我必须定义数字吗? 'int' 行不通吗?我正在尝试创建一个与现有函数 isdigit 完全相同的函数...
    • @user2784808: str is int 将检查 str 是否是对 int 类型的引用,这与它是否是仅包含数字的字符串无关。
    • @user2784808:您可以从string 模块导入它们,而不是自己定义数字:from string import digits 如果您担心性能,在set 中测试会员资格可能会有点麻烦更快(但可能不会太多,因为只有 10 个值)。
    • @Blckknght:这里故意不从string 导入。我怀疑 OP 是否关心这里的速度。我会先了解会发生什么。
    【解决方案2】:

    @Martijn Pieters 建议如何修复您的版本;为了完整起见,这里是一种更“pythonic”(和有效)的解决问题的方法。

    def my_isdigit(str):
        return all('0'<=c<='9' for c in str)
    

    【讨论】:

    • 我认为您不需要 all 内部的 []。生成器表达式与列表推导式一样有效,并且可能不会使用太多内存(在这种情况下不太可能出现问题,但总的来说是个好主意)。
    • @Blckknght:已修复,谢谢。
    • pythonic 的解决方案是使用.isdigit() :-P 我省略了这个版本,因为我不认为 OP 能够学习生成器表达式的工作原理。
    【解决方案3】:

    你可以使用正则表达式

    def my_isdigit(str):
        return re.search("[^\d]", str) is None
    

    由于有一些问题,这里做一些简单的测试:

    print my_isdigit("02211")
    > True
    print my_isdigit("022x01")
    > False
    print my_isdigit("a02201")
    > False
    

    【讨论】:

    • 感觉有点像用大炮打苍蝇:)
    • 我认为这不会捕捉到“至少有一个字符”的条件。
    • 一个有效的正则表达式是^\d+$。这匹配至少有一个数字字符,在文本的开头和结尾之间只有数字。
    • 它需要更改为return bool(re.search("^\d+$", str)) 才能真正匹配内置的isdigit
    • @SethMMorton 没有必要做 bool(),但我同意用 "\d" 而不是 0-9 会更好
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-22
    • 2021-07-15
    • 2021-06-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多