2

所以我有以下代码:

user_input = raw_input("Enter an integer, string or float:")
input_type = type(user_input)

if input_type == "str":
    print "Your string was %s." % user_input

elif input_type == "int":
    input_type = int(input_type)
    print "Your integer was %d." % user_input

elif input_type == "float":
    input_type = int(input_value)
    print "Your float was %d." % user_input

else:
    print "You did not enter an acceptable input."

不起作用——我相信是因为if——所以我把它改成了:

if "str" in input_type

"int"对于浮点数和整数,但得到一个错误:

Traceback (most recent call last):
File "types.py", line 4, in <module>
if "str" in input_type:
TypeError: argument of type 'type' is not iterable

为什么我会得到这个,我该如何解决?

4

5 回答 5

13

这里有很多问题。


user_input = raw_input("Enter an integer, string or float:")
input_type = type(user_input)

由于raw_input总是返回一个字符串,input_type所以总是在str这里。


if input_type == "str":
    print "Your string was %s." % user_input

input_type将是str——即表示字符串类型的实际对象——not "str",它只是一个字符串。所以,这永远不会是真的,你的任何其他测试也不会。


将其更改为:

if "str" in input_type:

......不可能有任何帮助,除非你期望input_type成为一个字符串集合,或者一个较长的字符串,"str"在它中间的某个地方。我也无法想象你为什么会期待。


这些行:

input_type = int(input_type)

......正在尝试将input_type- 记住,它是一个类型,比如stror int,而不是值 - 转换为整数。那不可能是你想要的。


这些行:

print "Your integer was %d." % user_input

正在打印您从用户那里收到的原始字符串,而不是您转换为int. 如果您使用%s而不是%d,这将起作用,但这可能不是您想要做的。


print "Your float was %d." % user_input

即使你修复了前面的问题,你也不能用它%d来打印浮点数。


接下来,通过比较类型来测试事物几乎总是一个坏主意。

如果你真的需要这样做,使用isinstance(user_input, str)not几乎总是更好type(user_input) == str

但你不需要这样做。


事实上,“请求宽恕比许可”通常更好。找出是否可以将某些内容转换为整数的正确方法是尝试将其转换为整数,如果不能,则处理异常:

try:
    int_value = int(user_input)
    print "Your integer was %d." % int_value
except ValueError:
    # it's not an int
于 2013-06-27T01:27:23.493 回答
1

首先,“不起作用”是没有用的。请在未来准确解释它是如何不起作用的,你期望什么以及你得到什么是不令人满意的。

现在解决您的问题:raw_input将始终返回一个字符串。您可以查看该字符串的内容是否符合看起来像整数或浮点数的内容,并进行相应的转换。你知道如何转换;一致性测试通常通过正则表达式完成。

于 2013-06-27T01:22:28.853 回答
0

您需要使用isinstanceinput让您的代码执行您期望的操作,如下所示:

user_input = input("Enter an integer, string or float:")

if isinstance(user_input, str):
    print "Your string was %s." % user_input
elif isinstance(user_input, int):
    print "Your integer was %d." % user_input
elif isinstance(user_input, float):
    print "Your float was %f." % user_input
else:
    print "You did not enter an acceptable input."

raw_input总是返回一个字符串。

使用时input,必须在字符串输入周围包含 ' 或 "。另外,切勿input这样使用,因为它可能非常危险。使用try exceptabarnert 建议的方法。

于 2013-06-27T01:26:28.203 回答
0

虽然我不认为这是一个真正的重复,但python 中 isinstance() 和 type() 之间的差异包含一个非常相关的答案,并且很容易阅读。

您最终会想要编写一个try/except适当地处理数据的方法。

if isinstance(user_input, str): #or basestring, if you prefer, but Python 3 apparently doesn't use it
    useThisLikeAString(user_input)
try:
    intInput = int(user_input)
    useThisLikeAnInt(user_input)
except TypeError:
    useThisLikeSomethingElse(user_input)

换句话说,公认的答案是完全正确的,但该讨论的链接是值得的。

于 2013-06-27T15:21:05.327 回答
0

将另一个变量添加到代码中,其值为字符串,并与其他变量进行类型比较。

a="test"
type(a)==type(user_input)

这会更简单。

于 2017-06-09T18:11:32.347 回答