如何向初学者解释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函数试图覆盖两种不同的用例:

  1. 将整数的string表示forms转换为实际的int
  2. 将一个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()函数是这里的孩子)

一个很好的问题和一个常见的挑战,试试这样解释。

你的(虚构的)函数将一张猫的图片作为参数,并且试图将它传给一只真正的猫。 在函数知道如何处理之前,需要先从猫到猫的图片进行转换。