len(x) превосходит x.len(), рассматривая идеи дизайна Python из встроенных функций

Python

Встроенные функции являются основной особенностью Python, и многие часто используемые операции реализованы с помощью минималистского синтаксиса.

Они предопределены во встроенном пространстве имен и работают «из коробки», что вы видите, то и получаете. Python признан удобным для новичков языком, и это утверждение может быть правдой, и встроенные функции играют в нем решающую роль.

Например, чтобы найти длину строки x, в Python используется метод записи len(x), и этот метод записи также применим к таким объектам, как списки, кортежи и словари, если передаются соответствующие параметры. Функция len() является общей.

Это минималистская философия отражает:Простое лучше сложного.

Однако в некоторых языках это не так, например, в Java в классе string есть метод нахождения длины, а в других классах тоже есть свои методы нахождения длины, которые нельзя использовать совместно. Каждый раз, когда он используется, он вызывается классом или экземпляром.

То же самое, чтобы найти длину строки, метод записи Python:

saying = "Hello world!"
print(len(saying))

# 结果:12

На Java это может быть записано следующим образом (для простоты):

String saying = "Hello world!";
System.out.println(saying.length());

// 结果:12

Python используетпрефиксное выражение, в то время как Java используетпостфиксное выражение.

Помимо нахождения длины, некоторые встроенные функции Python также могут находить соответствующие выражения в Java. Например, чтобы преобразовать числовую строку s в целое число, Python может использоватьint(s)функция, в то время как Java может использоватьInteger.parseInt(s);Целые числа преобразуются в строки, Python может использоватьstr(i), а в Java тоже естьString.valueOf(i).

Встроенные функции Python не привязаны к определенному классу, они являются объектами первого класса. А «функции» Java не могут существовать без классов, они просто придатки.

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

Например, из-за того, что штрихи латинского алфавита просты, нельзя сказать, что он превосходит китайские иероглифы, потому что по идеограммам буквы (фонетические знаки) значительно уступают китайским иероглифам (идеографическим знакам). Точно так же Япония заимствовала радикалы китайских иероглифов для создания иероглифов.Хотя это сэкономило больше кисти и чернил, оно также полностью потеряло свое значение.

В этой аналогии встроенные функции Python обладают красотой простоты, но теряют некоторую идеографическую мощь. Некоторые люди также любят говорить об этом, когда задают вопросы/критикуют Python, думая, что это недостаток дизайна Python.

Это приводит к одному из вопросов, которые больше всего хотелось бы обсудить в этой статье:Почему Python создает префиксное выражение, такое как len(x), а не постфиксное выражение, такое как x.len()?

На самом деле, дизайн суффиксов также возможен, в качестве примера возьмем два метода списков в Python:

mylist = [2, 1, 3, 5, 4]

mylist.sort()
print(mylist)   # [1, 2, 3, 4, 5]

mylist.reverse()
print(mylist)   # [5, 4, 3, 2, 1]

Все они вызываются из объекта списка, а не из встроенного пространства имен из воздуха. Семантика также очень понятна, то есть сортировка и обращение mylist.

По совпадению, у них также есть два сводных брата sorted() и reversed(), которые являются префиксными выражениями.

mylist = [2, 1, 3, 5, 4]

sort_list = sorted(mylist)
print(sort_list)   # [1, 2, 3, 4, 5]

reverse_list = reversed(mylist)
print(list(reverse_list))   # [4, 5, 3, 1, 2]

Различные способы написания делают одно и то же (независимо от их побочных эффектов). Следовательно, синтаксис суффикса не является невозможным, и причина, по которой он не используется, должна быть преднамеренной конструкцией.

Вернемся к предыдущему вопросу: почему len(x) вместо x.len(x), какова идея дизайна Python?

Отец ПитонаGuido van RossumЭта проблема была объяснена (ссылка в конце статьи) по двум причинам:

  • Для некоторых операций префиксы более удобочитаемы, чем суффиксы — префиксная (и инфиксная) нотация имеет долгую историю в математике, а ее визуальные эффекты помогают математикам думать над задачами. Мы можем просто записать формулуx*(a + b)переписать какx*a + x*b, но то же самое, реализованное нативным объектно-ориентированным способом, коряво.
  • Читая len(x), я простознаниеЭто запрашивает длину объекта. Это говорит мне о двух вещах: возвращаемое значение является целым числом, а параметр — своего рода контейнером. Но при чтении x.len() я должен заранее знать какой-то контейнер x, который реализует интерфейс или наследует класс, имеющий стандартный метод len(). Мы часто наблюдаем эту путаницу: класс, который не реализует интерфейс сопоставления, имеет метод get() или keys(), или некоторый нефайловый объект имеет метод write().

Объяснив эти две причины, Гвидо также заключил одним предложением: «Я вижу «лен» как встроенныйoperationЭто не только говорит о том, что len() стала более читабельной и понятной, но и полностью повышает статус len().

Это все равно, что сказать, что тире в дроби ½ — это «встроенное» выражение в математике, и ему не нужно реализовывать какой-то интерфейс или тому подобное, он уже указывает, что «Разделить число на число" означает. Различные типы чисел (целые числа, числа с плавающей запятой, рациональные числа, иррациональные числа ...) используют один и тот же оператор, и нет необходимости реализовывать дробную операцию для каждого типа данных.

Элегантность и простота понимания — вот философия дизайна, которой придерживается Python., префиксное выражение функции len() является лучшим воплощением. Я помню в "Супер резюме: изучение списков Python, достаточно только этой статьи«В этой статье цитируется Гвидо, который сказал, что»почему индекс начинается с 0". Самая важная причина заключается в том, что индексы, основанные на 0, являются наиболее элегантными и простыми для понимания.

Давайте сначала посмотрим на использование срезов. Вероятно, наиболее распространенным использованием является «взять первые n элементов» или «начать с i-го индекса, взять последние n элементов» (предыдущее использование на самом деле является специальным использованием i == стартовый бит). Было бы очень элегантно, если бы оба варианта использования могли быть реализованы без уродливых +1 или -1 в выражениях.

С индексацией на основе 0, полуоткрытым интервалом и интервалами сопоставления по умолчанию (которые Python в конечном итоге принял) синтаксис среза для двух вышеупомянутых случаев становится очень красивым: a[:n] и a[i: i+n], первое сокращение от a[0:n].

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

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

Класс таблицы имеет метод для нахождения длины класса стола, а класс стула имеет метод для нахождения длины класса стула. Разве метод нахождения длины не может быть самостоятельным объектом? Он существует потому, что есть «объекты», а не потому, что есть определенный класс.

Итак, я бы сказал, что len(x) превосходит x.len(), что также отражаетВзгляд Python на природу мира.

Спросите длину объекта, эта операция не зависит от объекта, не является объектом или функцией внутри объекта. С этой точки зрения мы можем понять, чтоПочему Python разработал встроенные функции?Встроенные функции на самом деле являются захватом сущности мира.

Этих тривиальных открытий достаточно, чтобы мы влюбились в язык. Жизнь коротка, я использую Python.

Связанное чтение:

Гвидо объясняет происхождение len:suo.im/4ImAEo

Гвидо объясняет происхождение индекса 0:suo.im/5cr12S

Эта статья является оригинальной и впервые опубликована в публичном аккаунте【Питон кот], пожалуйста, не перепечатывайте без разрешения.

Оригинальный адрес:Tickets.WeChat.QQ.com/Yes/PK QT50,000v…

Нет публики【Питон кот], в этом выпуске публикуются высококачественные серии статей, в том числе серия Meow Star Philosophy Cat, расширенная серия Python, серия рекомендаций по хорошим книгам, техническое письмо, высококачественные рекомендации и перевод на английский язык и т. д. Добро пожаловать на внимание. Закулисный ответ"люблю учиться” и получите бесплатный обучающий пакет.