当我输入int("1.7")
时,Python返回错误(特别是ValueError)。我知道我可以通过int(float("1.7"))
将其转换为整数。我想知道为什么第一种方法会返回错误。
答案 0 :(得分:9)
如果x不是数字或者给定了base,那么x必须是一个字符串或Unicode对象,表示以radix为基础的整数文字......
显然,linux
不代表基数的整数文字。
如果你想知道为什么 python dev决定将自己限制在基数的整数文字中,可能有无数的原因,你必须问圭多等。我肯定知道。一个猜测是易于实施+效率。您可能认为他们很容易将其实现为:
不幸的是,这在python中不起作用,因为整数可以具有任意精度,而浮点数则不能。特殊的套管大数可能会导致普通案例 1 效率低下。
此外,强制您执行"1.7"
还有明显的额外好处 - 它使输入字符串可能看起来更加明显,这有助于在其他地方进行调试。事实上,我可能会争辩说,即使int(float(...))
接受int
之类的字符串,最好还是为了提高代码清晰度而编写"1.7"
。
1 假设有一些验证。其他语言跳过此 - 例如int(float("1.7"))
将评估ruby
并为您提供'1e6'.to_i
,因为它会停止在第一个非整数字符处进行解析。似乎这可能导致有趣的错误追踪......
答案 1 :(得分:2)
我们有一个很好的,明显的想法是什么“从这个浮点数中取出一个int”意味着因为我们将浮动视为两个部分,我们可以抛弃其中一个。
当我们有一个字符串时,它不是那么明显。将这个字符串变成浮点数意味着关于字符串内容的各种微妙的事情,这不是一个理智的人想要在代码中看到的值不明显的东西。
所以简短的回答是:Python喜欢明显的东西并且不鼓励魔术。
答案 2 :(得分:1)
这里有一个很好的描述,为什么你不能在python文档中找到它。
https://docs.python.org/2/library/functions.html#int
如果x不是数字或者给定了base,则x必须是表示基数为整数的字符串或Unicode对象。可选地,文字可以在前面加+或 - (之间没有空格)并且用空格包围。 base-n文字由数字0到n-1组成,a到z(或A到Z)的值为10到35.默认基数为10.允许的值为0和2-36。 Base-2,-8和-16文字可以选择以0b / 0B,0o / 0O / 0或0x / 0X作为前缀,与代码中的整数文字一样。基数0表示将字符串完全解释为整数字面值,因此实际基数为2,8,10或16。
基本上要将字符串转换为字符串中的整数,字符串不能包含“。”
答案 3 :(得分:1)
向后兼容性。 肯定是可能的,但是这将是一个糟糕的主意,因为它会向后兼容 - 依赖于尝试的古老而成熟的Python习惯用法......除了梯形图( “更容易请求宽恕而非许可”)来确定字符串内容的类型。至少从Python 1.5,AFAIK开始使用这个成语;这里有两个引文:[1] [2]
s = "foo12.7"
#s = "-12.7"
#s = -12
try:
n = int(s) # or else throw an exception if non-integer...
print "Do integer stuff with", n
except ValueError:
try:
f = float(s) # or else throw an exception if non-float...
print "Do float stuff with", f
except ValueError:
print "Handle case for when s is neither float nor integer"
raise # if you want to reraise the exception
另一个小问题:这不仅仅是数字是否包含'。'科学记数法或任意字母也可以打破字符串的内涵。
示例:int("6e7")
不是整数(基数为10)。但是int("6e7",16)
=
1767是基数为16的整数(或任何基数> = 15)。但int("6e-7")
永远不是一个整体。
(如果你将基数扩展到base-36,任何合法的字母数字字符串(或Unicode)都可以被解释为表示一个整数,但默认情况下这样做通常是一种可怕的行为,因为“dog”或“cat” “不太可能是对整数的引用。”