Python 如何检查字符串是否有没有try/except或str.isdigit的数字?

Python 如何检查字符串是否有没有try/except或str.isdigit的数字?,python,string,validation,input,Python,String,Validation,Input,正如标题所述,我如何在不使用str.isdigit或try/except的情况下查找字符串是否包含所有数字。代码不断检查第一个字符,而不是全部字符。如何修复此问题?实际上,它看起来像是在检查每个字符,但因为它为每个字符设置了y,所以最后一个字符的编号决定了返回的值,而不管其他字符是什么 相反,您应该将y初始化为True,并且只有在找到非数字时才将其设置为False。事实上,当这种情况发生时,您可以立即返回。实际上,它看起来像是在检查每个字符,但因为它为每个字符设置了y,所以最后一个字符的编号决定

正如标题所述,我如何在不使用str.isdigit或try/except的情况下查找字符串是否包含所有数字。代码不断检查第一个字符,而不是全部字符。如何修复此问题?

实际上,它看起来像是在检查每个字符,但因为它为每个字符设置了y,所以最后一个字符的编号决定了返回的值,而不管其他字符是什么


相反,您应该将y初始化为True,并且只有在找到非数字时才将其设置为False。事实上,当这种情况发生时,您可以立即返回。

实际上,它看起来像是在检查每个字符,但因为它为每个字符设置了y,所以最后一个字符的编号决定了返回的值,而不管其他字符是什么

NUMBERS = "123456789"

def digit_checker(x):

    for t in  x:
        if t  in NUMBERS:
           y = True
        else:
           y = False
    return y



 sentence = input("Enter a string to check if its all digits: ")
 checker = digit_checker(sentence)
 print(checker)
相反,您应该将y初始化为True,并且只有在找到非数字时才将其设置为False。事实上,当这种情况发生时,您可以立即返回。

您可以使用和:

NUMBERS = "123456789"

def digit_checker(x):

    for t in  x:
        if t  in NUMBERS:
           y = True
        else:
           y = False
    return y



 sentence = input("Enter a string to check if its all digits: ")
 checker = digit_checker(sentence)
 print(checker)
这将遍历x中的每个字符,并查看它是否为数字。如果没有,所有人将立即停止检查并返回False。否则,它将在确认每个字符都是数字后返回True。下面是一个演示:

NUMBERS = "1234567890"

def digit_checker(x):
    return all(t in NUMBERS for t in x)
还要注意,如果将数字设置为一组,则效率会更高:

这样,t in数字将执行O1常量哈希查找,而不是通过字符串进行线性搜索。诚然,在如此小的字符串上,线性搜索的性能影响并不太令人担忧。但是,当您使用较大的字符串时,这种情况会很快发生变化。

您可以使用和:

这将遍历x中的每个字符,并查看它是否为数字。如果没有,所有人将立即停止检查并返回False。否则,它将在确认每个字符都是数字后返回True。下面是一个演示:

NUMBERS = "1234567890"

def digit_checker(x):
    return all(t in NUMBERS for t in x)
还要注意,如果将数字设置为一组,则效率会更高:


这样,t in数字将执行O1常量哈希查找,而不是通过字符串进行线性搜索。诚然,在如此小的字符串上,线性搜索的性能影响并不太令人担忧。但是,当您使用较大的字符串时,这种情况会很快改变。

如果您清除变量名,问题可能会更清楚:

NUMBERS = set("1234567890")
如您所见,您正在评估它是否是每个字符的一个数字,并且每次都更改is_number变量。因此,只有最后一个字符将导致正确的评估


当第一次检测到非数字时,您可能只想返回False。如果未在数字中设置字符,请尝试将数字设置为False并中断循环。

如果清除变量名,问题可能会更清楚:

NUMBERS = set("1234567890")
如您所见,您正在评估它是否是每个字符的一个数字,并且每次都更改is_number变量。因此,只有最后一个字符将导致正确的评估


当第一次检测到非数字时,您可能只想返回False。如果字符不在数字中,请尝试将数字设置为False并中断循环。

有一些很好的答案可以做到这一点。这里有另一种方法。您可以计算非数字字符的数量,通过将它们存储在列表中,此列表的长度应为零

def digit_checker(sentence):
    is_number = True
    for character in sentence:
        if character in NUMBERS:
           is_number = True
        else:
           is_number = False
    return is_number 

这有一些很好的答案。这里有另一种方法。您可以计算非数字字符的数量,通过将它们存储在列表中,此列表的长度应为零

def digit_checker(sentence):
    is_number = True
    for character in sentence:
        if character in NUMBERS:
           is_number = True
        else:
           is_number = False
    return is_number 
另一种方法是将它们作为集合进行检查:

NUMBERS = "1234567890" # Did you miss the 0?

def digit_checker(x):
    all_digits = True
    for t in  x:
        if t not in NUMBERS:
           all_digits = False
           break
    return all_digits
另一种方法是将它们作为集合进行检查:

NUMBERS = "1234567890" # Did you miss the 0?

def digit_checker(x):
    all_digits = True
    for t in  x:
        if t not in NUMBERS:
           all_digits = False
           break
    return all_digits

如果要检查所有字母都是数字,可以尝试以下表达式:

def digit_checker(x):
    return True if set(x).difference(set(NUMBERS)) == set() else False

它与代码完全相同,只是它还会检查x中的所有字符是否都是数字。这就是您的代码中缺少的内容。返回值总是被最后一次检查覆盖。当然,使用循环和中断可能更有效,除非对生成器表达式都在内部这样做,在这种情况下,两者完全等效。

如果您正在检查所有字母都是数字的事实,您可以尝试以下表达式:

def digit_checker(x):
    return True if set(x).difference(set(NUMBERS)) == set() else False

它与代码完全相同,只是它还会检查x中的所有字符是否都是数字。这就是您的代码中缺少的内容。返回值总是被最后一次检查覆盖。当然,使用循环和中断可能更有效,除非所有操作都在生成器表达式内部执行,在这种情况下,这两个操作完全等效。

应该只检查给定句子中的最后一个字符,因为您正在循环每个字符。您需要在第一次遇到错误时退出,否则,您可能会在以后将变量重新调整为true。一次假

在本例中为false。它应该只检查给定句子中的最后一个字符,因为您正在循环每个字符。您需要在第一次遇到false时退出,否则您可能会在以后将变量重新映射为true。在这种情况下,一次错误是绝对错误的。这是对他的代码的最小更改,这很好…但是解释一下为什么不同会有很大帮助。除了这个答案是不正确的-它对数字10不起作用。他在数字中缺少0,但是因为你检查的字符串是数字,所以只检查0-9。这是对他代码的最小改动,这很好……但是解释一下为什么它不同会有很大帮助。除了这个答案不正确之外——它对数字10不起作用。他在数字中缺少0,但是因为你检查的字符串是数字,所以只检查0-9。为什么要将它设为False和break?如果要返回False,只需返回False即可。如果你这么做了,你根本不需要这个号码。是的,你可以这么做。这只是风格偏好的问题。因为函数很小,所以这里没什么大不了的,但是对于较大的函数,我更喜欢使用一个返回值。编写5行代码表示返回值为False,就像您在解释中直接描述的那样,只是为了避免实际编写返回值为False是愚蠢的。这在C89等其他语言中可能有意义,但从其他语言带来偏见并不是编写可读Python代码的好方法。当您得到答案后可以简单地返回布尔值时,初始化额外变量就没有意义了。如果字符串“9 askjdhaskjdbaskjdsa…”被传递,那么在找到数字的第一个实例后,为什么还要继续?这只是样式首选项的问题。为什么要将其设置为False和break?如果要返回False,只需返回False即可。如果你这么做了,你根本不需要这个号码。是的,你可以这么做。这只是风格偏好的问题。因为函数很小,所以这里没什么大不了的,但是对于较大的函数,我更喜欢使用一个返回值。编写5行代码表示返回值为False,就像您在解释中直接描述的那样,只是为了避免实际编写返回值为False是愚蠢的。这在C89等其他语言中可能有意义,但从其他语言带来偏见并不是编写可读Python代码的好方法。当您得到答案后可以简单地返回布尔值时,初始化额外变量就没有意义了。如果字符串'9 askjdhaskjdbaskjdsa…'被传递,那么在找到数字的第一个实例后,为什么还要继续?只是样式首选项的问题。+1用于使用集合。请注意,您可以更简洁地将其编写为:return setx.differenceNUMBERS==set.+1用于使用集合。请注意,您可以更简洁地将其写成:return setx.differenceNUMBERS==set。