Pet*_*ith 37 python python-3.x
我正在辅导一个邻居的孩子,我们int()在使用input()之前正在探索这个函数 - 它返回一个字符串.我们尝试了以下方法:
int(5)
int(5.5)
int('5')
int('5.5')
Run Code Online (Sandbox Code Playgroud)
前三个5按预期返回; 最后一个扔了错误
ValueError:int()的基数为10的无效文字:'5.5'
考虑到前三行的行为,我如何向14岁的人解释错误(背景=说4种语言,但数学不是那么热)?
UPDATE
C#表现出相同的行为:
Convert.ToInt32("5.5");抛出错误
输入字符串的格式不正确.
dec*_*eze 54
简而言之:因为这就是规范所说的.无论如何,这是一种有用的心态.;-)
现在,为什么规范这么说呢?函数只能接受有限数量的类型作为有效输入.该int函数试图涵盖两种不同的用例:
intfloat值转换为a int,截断它*第三个用例"将浮点数的字符串表示转换为int"未被规范涵盖,因为语言设计者决定不覆盖它.这似乎是一个合理的决定,因为他们需要在功能将会和不会接受的类型上绘制线.浮点数的字符串表示应该由float,而不是解析int.
*实际上:任何有__int__方法的对象,但让它保持简单.
作为一个反例,在PHP中你可以尝试将任何字符串转换为a int,它会尝试为你提供最佳匹配:
php > echo (int)'3.14';
3
php > echo (float)'3.14';
3.14
php > echo (int)'3 little pigs';
3
php > echo (int)'there are 3 little pigs';
0
Run Code Online (Sandbox Code Playgroud)
老实说,这是相当疯狂的行为,特别是最后一个.Python有一个严格的(呃)类型系统; 如果你试图将一个字符串解析为一个字符串int,它必须是一个完整有效的整数表示,而不仅仅是某个地方包含可以解释为数字的东西.
rod*_*igo 30
该行的问题在于涉及两个转换:
"5.5" (string) -> 5.5 (float) -> 5 (int)
Run Code Online (Sandbox Code Playgroud)
Python中的转换运算符一次只应用一个转换,而不是两个链接,因为在许多情况下这可能会变得混乱.
解决方案是应用两个嵌套转换:
int(float("5.5"))
Run Code Online (Sandbox Code Playgroud)
你可以参考文档:
Run Code Online (Sandbox Code Playgroud)class int(x=0) class int(x, base=10)返回由数字或字符串x构造的整数对象,如果没有给出参数,则返回0.如果x是数字,则返回
x.__int__().对于浮点数,这会截断为零.如果x不是数字或者给定了base,则x必须是字符串,字节或bytearray实例,表示以radix为基数的整数文字.可选地,文字可以在前面加+或 - (之间没有空格)并且用空格包围.base-n文字由数字0到n-1组成,a到z(或A到Z)的值为10到35.默认基数为10.允许的值为0和2-36.Base-2,-8和-16文字可以选择带前缀为0b/0B,0o/0O或0x/0X,与代码中的整数文字一样.基数0表示完全解释为代码文字,因此实际基数为2,8,10或16,因此int('010',0)不合法,而int('010')是,以及int('010',8).
整数类型在数值类型中描述 - int,float,complex.
(强调我的)
参考文档教导,在编程中,没有什么是真正的任意,编译器/解释器只是遵循规则.
| 归档时间: |
|
| 查看次数: |
6550 次 |
| 最近记录: |