Подтвердить что ты не робот

Как объяснить функцию int() новичкам

Я обучаю дочернему соседу, и мы изучали функцию int(), прежде чем использовать его с input() - который возвращает строку. Мы попробовали следующее:

int(5)
int(5.5)
int('5')
int('5.5')

Первые три возвратили 5, как ожидалось; последний сбросил ошибку

ЗначениеError: неверный литерал для int() с базой 10: '5.5'

Учитывая поведение первых трех строк, как объяснить ошибку 14-летнему (background = говорит 4 языка, но математика не так жарко)?

UPDATE С# проявляет такое же поведение: Convert.ToInt32("5.5"); выдает ошибку

Строка ввода не была в правильном формате.

4b9b3361

Ответ 1

Вкратце: из-за того, что говорит спецификация. Такого рода полезное мышление, чтобы войти в любом случае.; -)

Теперь, почему спецификация говорит так? Существует только конечное число типов, которые функция может принимать как допустимый ввод. Функция int пытается охватить два разных варианта использования:

  • преобразовать строковое представление целого в фактический int
  • введите значение float в int, усекая его *

Третий вариант использования: "преобразовать строковое представление числа с плавающей запятой в int" не распространяется на спецификацию, потому что разработчики языка решили не покрывать его. Кажется, что это разумное решение сделать, так как им нужно было провести линию где-то, какие типы функция будет и не примет. Строковое представление числа с плавающей запятой следует анализировать с помощью float, а не int.

* На самом деле: любой объект, который имеет метод __int__, но позволяет сохранить его простым.


В качестве встречного примера в PHP вы можете попытаться передать любую строку в 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); если вы пытаетесь проанализировать строку как int, это должно быть вполне корректное представление целочисленного числа, а не просто того, что где-то содержит что-то, что может быть интерпретировано как число.

Ответ 2

Проблема с этой строкой состоит в том, что есть два преобразования:

"5.5" (string) -> 5.5 (float) -> 5 (int)

Операторы преобразования в Python будут применять только одно преобразование за раз, никогда не прикованное к двум, потому что во многих случаях это может запутать.

Решение состоит в применении двух вложенных преобразований:

int(float("5.5"))

Ответ 3

Вы можете обратиться к docs:

class int(x=0)
class int(x, base=10)

Возвращает целочисленный объект, построенный из числа или строки x, или возвращает 0, если аргументы не заданы. Если x - число, верните x.__int__(). Для чисел с плавающей запятой это обрезается до нуля.

Если x не является числом или задано базовое значение, то x должен быть строкой, байтами или экземпляром bytearray, представляющим целочисленный литерал в radix base. Дополнительно, литералу может предшествовать + или - (без пробела между ними) и окружены пробелами. Литература 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).

Integer тип описан в числовых типах - int, float, complex.

(акцент мой)

Ссылаясь на документы, учит, что в программировании ничего действительно не произвольно, а компиляторы/интерпретаторы просто следуют правилам.

Ответ 4

Я бы сказал, что проблема в этом заключается в перегрузке оператора оператора, потому что на самом деле есть две задействованные функции int(): одна, которая преобразует строку (если это возможно), другие усечки плавают. Если ребенок понимает типы, я думаю, что он/она также поймет, что такое перегрузка.

Ответ 5

Думаю, я бы сказал, что оба int(5.5) и int('5.5') - это не то, что вы должны делать. Родительский ответ дает объяснение, почему он все еще работает, но когда я объясняю вещи ребенку, я старался держать все как можно яснее, а неявные преобразования не помогают с этим.

Итак, хотя слишком явным, почему бы не научить идти так:

int(floor(float('5.5')))

По крайней мере, тогда все совершенно ясно и очевидно.

Ответ 6

Попробуйте объяснить строки, содержащие цифры, как если бы они были записаны как слова.

int(5)
int(5.5)

работает, поскольку функция Python int() "видит" его как числа и принимает целое число-часть, как и другой дочерний элемент, который ничего не знает о плавающих запятых/десятичных местах → оба будут интерпретироваться как 5, остальные игнорируются.

Теперь: используя строки

int('5')
int('5.5')

можно интерпретировать как "пятерку", которую функция Python int() знает, как перевести на 5, но словесный "пятиточник" - это не то, что наш ребенок когда-либо слышал, ничего не зная о плавающей точке. (функция int() является дочерней здесь)

Хороший вопрос и обычный вызов, чтобы попытаться объяснить его таким образом.

Ответ 7

Ваша (воображаемая) функция принимает изображение кота в качестве параметра, и вы пытались передать его фактическому коту. Там конверсия, которая должна произойти сначала от кошки до изображения кошки, прежде чем функция знает, что с ней делать.