检查输入是否是python中的字符串

检查输入是否是python中的字符串,python,function,loops,try-catch,Python,Function,Loops,Try Catch,我正在尝试检查我的输入是否是带有try-except块的字符串。函数运行时没有错误。但是,它会检查输入是否为整数,而不是字符串。我怎样才能逆转这个 def lexicon(word): while True: try: a=str(input(word)) print("Input is a string. string = ", a) except ValueError:

我正在尝试检查我的输入是否是带有try-except块的字符串。函数运行时没有错误。但是,它会检查输入是否为整数,而不是字符串。我怎样才能逆转这个

def lexicon(word):
    while True:
        try:
            a=str(input(word))
            print("Input is a string. string = ", a)
        except ValueError:
            print("Oops..Input is not supposed to be a number. Try again!")
    return a
b=lexicon("Enter the word you'd like: ")

如果您特别想检查字符串的值类型,最好使用
If/else
isinstance

if not isinstance(word, str):
    raise TypeError(f"Expecting a string as a value, not {type(word)}.")
else:
    #do something

如果您特别想检查字符串的值类型,最好使用
If/else
isinstance

if not isinstance(word, str):
    raise TypeError(f"Expecting a string as a value, not {type(word)}.")
else:
    #do something

正如用户pavel在对其答案的评论中所讨论的那样,有两种不同的风格可以为这样的问题编写代码:EAFP(“请求原谅比获得许可更容易”),这意味着您使代码在假设的基础上工作,并在失败时采取行动;和LBYL(“三思而后行”),你首先检查你的假设是否正确,然后选择适当的行动

try/except
路由是EAFP,因为它只执行
try
块中的代码,而不必首先检查它是否工作。如果希望以LYBL样式执行,则需要明确确定用户输入是否是数值的字符串表示形式,然后采取相应的行动。下面我将为这两种方法提供框架代码。然而,请注意,与其他语言相比,Python有点奇怪,因为它似乎对EAFP有某种文化偏好

另外,由于您只询问检查整数,因此我将在这里重点介绍。这意味着代码将接受浮点数作为有效输入

EAFP:
try/except
可能会让您大吃一惊的问题是,
input
总是返回一个字符串,因此测试它是否是一个字符串是毫无意义的,并且总是会产生
True
。但是,请注意,
try/except
只是可以在Python中执行的错误处理的简化版本;完整版本是
try/except/else/finally
。如果除块外没有执行任何块,则else块生效,并且始终在最后运行。因此,您可以检查输入是否为整数,如果检查成功,则使程序引发失败。然而,我承认这似乎有点倒退

try:
    a = int(input())
except ValueError:
    # do whatever
else:
    raise ValueError("Input must not be an integer")
LBYL:
if/else
str
对象有几种方法来测试其内容,而不必出错。例如,
.isalpha()
检查字母表中是否有所有字符(如果包含空格和特殊字符,则返回
False
isnumeric()
检查字符串是否表示数字;请参阅完整的列表。因此,根据您希望允许的输入类型,您需要在
if
块中使用这些方法之一或它们的组合。下面的代码与上面的
try/except/else
版本基本相同,使用
.isdigit()
,如果字符串中的所有字符都是数字,则返回
True
(即,
int(a)
将成功的相同类型的输入)

还请注意,我在这段代码中使用了新的赋值运算符
:=
,这是Python 3.8的新特性。通过这种方式,您不需要首先显式地分配变量
a
,但是要知道代码实际执行
input()
函数的位置有点困难。如果您编写代码是为了向后兼容,或者不喜欢这种外观,那么必须首先使用经典的
a=input()

if (a := input()).isdigit():
    raise ValueError("Input must not be an integer")

# do whatever

正如用户pavel在对其答案的评论中所讨论的那样,有两种不同的风格可以为这样的问题编写代码:EAFP(“请求原谅比获得许可更容易”),这意味着您使代码在假设的基础上工作,并在失败时采取行动;和LBYL(“三思而后行”),你首先检查你的假设是否正确,然后选择适当的行动

try/except
路由是EAFP,因为它只执行
try
块中的代码,而不必首先检查它是否工作。如果希望以LYBL样式执行,则需要明确确定用户输入是否是数值的字符串表示形式,然后采取相应的行动。下面我将为这两种方法提供框架代码。然而,请注意,与其他语言相比,Python有点奇怪,因为它似乎对EAFP有某种文化偏好

另外,由于您只询问检查整数,因此我将在这里重点介绍。这意味着代码将接受浮点数作为有效输入

EAFP:
try/except
可能会让您大吃一惊的问题是,
input
总是返回一个字符串,因此测试它是否是一个字符串是毫无意义的,并且总是会产生
True
。但是,请注意,
try/except
只是可以在Python中执行的错误处理的简化版本;完整版本是
try/except/else/finally
。如果除块外没有执行任何块,则else块生效,并且始终在最后运行。因此,您可以检查输入是否为整数,如果检查成功,则使程序引发失败。然而,我承认这似乎有点倒退

try:
    a = int(input())
except ValueError:
    # do whatever
else:
    raise ValueError("Input must not be an integer")
LBYL:
if/else
str
对象有几种方法来测试其内容,而不必出错。例如,
.isalpha()
检查字母表中是否有所有字符(如果包含空格和特殊字符,则返回
False
isnumeric()
检查字符串是否表示数字;请参阅完整的列表。因此,根据您希望允许的输入类型,您需要在
if
块中使用这些方法之一或它们的组合。下面的代码基本上不支持