如何向初学者解释int()函数
我正在辅导一个邻居的孩子,我们在使用input()(它返回一个stringint()
之前探究了int()
函数。 我们尝试了以下内容:
int(5) int(5.5) int('5') int('5.5')
前三名按照预期返回了5
; 最后一个抛出了错误
ValueError:无效文字为int()与基地10:'5.5'
鉴于前三行的行为,我如何解释这个错误到一个14岁(背景=说4种语言,但math不是那么热)?
更新 C#展品相同的行为: Convert.ToInt32("5.5");
抛出错误
inputstring的格式不正确。
简而言之: 因为这是规范说的。 无论如何,这是一个有用的心态。 😉
现在,为什么说这个规范呢? 函数可以接受的有效inputtypes数量是有限的。 int
函数试图覆盖两种不同的用例:
- 将整数的string表示forms转换为实际的
int
- 将一个
float
值转换为一个int
,截断它*
第三个用例“将浮点数的string表示转换为int
”不在规范中讨论,因为语言devise者决定不覆盖它。 这似乎是一个合理的决定,因为他们需要在某个地方画出这个function将会和不会接受的types。 浮点数的string表示应该用float
来parsing,而不是int
。
*实际上:任何具有__int__
方法的对象,但可以让它简单。
作为一个反例,在PHP中,您可以尝试将任何string强制转换为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
老实说,这是相当疯狂的行为,特别是最后一个。 Python有一个严格的(er)types的系统; 如果你试图把一个stringparsing为一个int
,它必须是一个完整有效的整数表示,而不仅仅是某个地方包含的东西可以被解释为一个数字。
该行的问题是涉及两个转换:
"5.5" (string) -> 5.5 (float) -> 5 (int)
Python中的转换运算符一次只能应用一个转换,而不是两个链接,因为在许多情况下这可能会造成混淆。
解决scheme是应用两个嵌套转换:
int(float("5.5"))
你可以参考文档 :
class int(x=0) class int(x, base=10)
返回由数字或stringx构造的整数对象,如果没有给定参数,则返回0。 如果x是数字,则返回
x.__int__()
。 对于浮点数字,这将截断为零 。如果x不是一个数字,或者给定了基数,那么x必须是一个string,字节或者bytearray实例,代表以基数为基数的整数字面量。 可选地,文字可以在前面加上+或 – (两者之间没有空格)并用空格包围。 base-n文字由数字0到n-1组成,其中a到z(或A到Z)的值为10到35.默认的基数是10.允许的值是0和2-36。 基数2,-8和-16文字可以select以0b / 0B,0o / 0O或0x / 0X作为前缀,就像代码中的整数文字一样。 基数0意味着正确地解释为一个代码字面量,所以实际的基数是2,8,10或16,所以int('010',0)是不合法的,而int('010')是,以及int('010',8)。
整数types在数字types – int,float,complex中描述。
(重点是我的)
参考文档教导,在编程中没有任何东西是真正的任意的,编译器/解释器只是遵循规则。
我想我会说, int(5.5)
和int('5.5')
不是你应该做的。 罗德里戈的回答给出了一个解释为什么仍然有效的解释,但是当向孩子解释事情时,我会尽量保持事物的明确性,隐含的转换对此没有帮助。
所以,虽然过分明确,但为什么不教这样走:
int(floor(float('5.5')))
至less一切都是清楚明了的。
我会说,这背后的问题是运算符重载 ,因为实际上有两个int()函数:一个转换string(如果可能),另一个截断浮游物。 如果孩子了解types,我想她/她也会理解什么是超载。
尝试解释包含数字的string,就好像它被写成单词一样。
int(5) int(5.5)
因为Python的int()函数将其视为数字,并且像另一个孩子那样不知道有关浮点数/小数位的全部数字部分 – 都会被解释为5,其余的是忽略。
现在:使用string
int('5') int('5.5')
可以被解释为Python的int()函数知道如何翻译为5的“五”,但口头“五点五”不是我们的孩子听过的,不知道浮点的任何事情。 (int()函数是这里的孩子)
一个很好的问题和一个常见的挑战,试试这样解释。
你的(虚构的)函数将一张猫的图片作为参数,并且试图将它传给一只真正的猫。 在函数知道如何处理之前,需要先从猫到猫的图片进行转换。