Рубрики
Без рубрики

String.join (список) vs list.join (строка) | Почему создатели Питона выбрали бывший

Если вы, как я, возможно, вы, возможно, задали себе следующий вопрос: почему это String.join (список) вместо list.join (String) в Python? 🙄 https://youtu.be/-lqlwvpoqby Метод соединения работает с любым намерением, а не только со списками. Следовательно, вам придется реализовать его в сотни классах вместо всего одного (в строковом классе). Дополнительно соединяется () работает … String.join (список) vs list.join (строка) | Почему создатели Питона выбрали прежнее Подробнее »

Автор оригинала: Chris.

Если вы похожи на меня, вы, возможно, задали себе следующий вопрос:

Почему это String.join (список) вместо list.join (строка) в Python? 🙄.

Метод соединения работает с любыми повторяющимися, а не только с списками. Следовательно, вам придется реализовать его в сотни классах вместо всего одного (в строковом классе). Дополнительно соединяется () работает только на строковом разделитете и с счетчиком строк. Таким образом, это специфично для строк и нельзя разрешать применять, скажем, список целых чисел.

Давайте разделим мир в реальность и фантазию.

Реальность : Вы, наверное, знаете String.join (список) Способ в Python для объединения всех строк в Список Использование строка как разделитель:

# REALITY:
lst = ['a', 'b', 'c']
print('-'.join(lst))
# a-b-c

Фэнтези : Многие кодеры находят это запутанное, не будет ли это более интуитивно использовать list.join (строка) а не String.join (список) ?

# FANTASY WORLD:
lst = ['a', 'b', 'c']
print(lst.join('-'))
# a-b-c

Этот вариант присоединения списка в строку будет чувствовать себя более объектно-ориентированным: Вы хотите присоединиться к списку, а не в строке, в конце концов!

Итак, какие мыслительные процессы позади Создатели Питона ? Почему они решили создать Присоединяйтесь () метод на строке, а не Список тип?

В этой статье я собрал аргументы Pro и Con в различных источниках. Вы можете найти подробный список источников ниже.

Аргумент 1: один метод присоединиться к

Вы можете присоединиться к любому Iterable, например, список, кортеж, словарь или набор. Но разделитель должен быть строкой. Таким образом, у вас есть два варианта:

  • Требуют этого Каждый намеки реализует свое собственное присоединение Метод (например, __str____ ).
  • Реализовать только один метод объединения Это работает на каждом илетном.

Последнее гораздо меньше работы для языковых создателей, а менее запутано для программиста.

# FANTASY WORLD:
['a', 'b', 'c'].join('-')
('a', 'b', 'c').join('-')
{'a', 'b', 'c'}.join('-')
...
# a-b-c

В мире фантазии у вас много реализации в основном тот же метод.

# FANTASY WORLD:
['a', 'b', 'c'].join('-')
('a', 'b', 'c').join('-')
{'a', 'b', 'c'}.join('-')
...
# a-b-c

Это было бы сбито с толку, так как каждая единица должна реализовать тот же метод. Либо будет много избыточного кода, либо метод должен быть реализован на объекте Iterable, который приводит нас к следующему аргументу:

Аргумент 2: явное лучше, чем неявное

Если вы введете в вашу раковину Python два слова Импортировать это Это будет напечатать «дзен Питона»:

The Zen of Python, by Tim Peters
Beautiful is better than ugly.
Explicit is better than implicit.
...

Давай и попробуй сам, я подожду:

Присоединяйтесь () Метод может присоединиться только к тому, что они содержат строки:

lst = [1, 'b', 'c']
print('-'.join(lst))
# TypeError: sequence item 0: expected str instance, int found

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

Скажи, мы живем в фэнтезийном мире и ИТЕРИТЕЛЬНО Тип реализует метод соединения, который действителен (среди прочего) для всех типов контейнеров, таких как списки. Это было бы единственной альтернативой, которая имеет смысл и не добавляет много избыточных кодов в библиотеку Python.

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

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

Например : Что это делает семантически, значит присоединиться к списку целых чисел? Добавляя их? Согласив строковые представления? Усредняя их? Там нет четкого ответа, и любой неявный выбор приведет к путанице. Явнее лучше, чем неявное!

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

Аргумент 3: Неожиданная зависимость по величинам от строки и Unicode

Использование list.join () был на самом деле предложил по Пропустить Монтанаро , один из создателей Питона:

On Fri, 11 Jun 1999, Skip Montanaro wrote:

It occurred to me just a few minutes after sending my previous message that
it might make sense to make string.join a method for lists and tuples.
They'd obviously have to make the same type checks that string.join does.
as in:
['spam!', 'eggs!'].join()
'spam! eggs!'
?

Но Дэвид ответил, что ему не нравились последствия из обобщения Присоединяйтесь () : Уменьшить () Функция:

I like the notion, but I think it would naturally migrate towards
genericity, at which point it might be called "reduce", so that:

['spam!', 'eggs!'].reduce()
'spam!eggs!'

['spam!', 'eggs!'].reduce(' ')
'spam! eggs!'

[1,2,3].reduce()
6 # 1 + 2 + 3

[1,2,3].reduce(10)
26 # 1 + 10 + 2 + 10 + 3

note that string.join(foo) == foo.reduce(' ')
and string.join(foo, '') == foo.reduce()
--david

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

Гвидо, доброжелательный диктатор Python для жизни, ответил (освещения мной):

>>> On Fri, 11 Jun 1999, Skip Montanaro wrote:
>>> It occurred to me just a few minutes after sending my previous message that
>>> it might make sense to make string.join a method for lists and tuples.
>>> They'd obviously have to make the same type checks that string.join does.
>>> as in:
>>> ['spam!', 'eggs!'].join()
>>> 'spam! eggs!'

Note that this is not as powerful as string.join(); the latter works
on any sequence, not just on lists and tuples. (Though that may not
be a big deal.)

I also find it slightly objectionable that this is a general list
method but only works if the list contains only strings; Dave Ascher's
generalization to reduce() is cute but strikes me are more general
than useful, and the name will forever present a mystery to most
newcomers.

Perhaps join() ought to be a built-in function?
--Guido van Rossum (home page: http://www.python.org/~guido/)

Чтобы обобщить этот разговор, Guido имел два контрактром аргумента:

  • Присоединяйтесь () Способ работает на всех по величинам и не только в списках и кортежах.
  • Метод должен быть методом общего списка, но работает только в том случае, если список содержит строки.

Последняя нота интересна, хотя: Присоединяйтесь () мог бы быть встроенной функцией тоже!

Куда пойти отсюда?

Достаточно теории, давайте познакомимся!

Чтобы стать успешным в кодировке, вам нужно выйти туда и решать реальные проблемы для реальных людей. Вот как вы можете легко стать шестифункциональным тренером. И вот как вы польские навыки, которые вам действительно нужны на практике. В конце концов, что такое использование теории обучения, что никто никогда не нуждается?

Практические проекты – это то, как вы обостряете вашу пилу в кодировке!

Вы хотите стать мастером кода, сосредоточившись на практических кодовых проектах, которые фактически зарабатывают вам деньги и решают проблемы для людей?

Затем станьте питоном независимым разработчиком! Это лучший способ приближения к задаче улучшения ваших навыков Python – даже если вы являетесь полным новичком.

Присоединяйтесь к моему бесплатным вебинаре «Как создать свой навык высокого дохода Python» и посмотреть, как я вырос на моем кодированном бизнесе в Интернете и как вы можете, слишком от комфорта вашего собственного дома.

Присоединяйтесь к свободному вебинару сейчас!

Источники

Я объединял веб-ресурсы, электронные связи и мои собственные мысли, чтобы написать это всеобъемлющее руководство. Я уверен, что учебник охватывает реальные источники – но мы никогда не узнаем на 100%, не так ли?

  1. https://stackoverflow.com/questions/493819/why-is-it-string-joinlist-instead-of-list-joinstring
  2. https://www.edureka.co/community/3899/python-join-why-is-string-join-list-instead-list-join-string
  3. https://www.edureka.co/community/12487/python-join-why-is-string-join-list-instead-list-join-string
  4. https://intellipaat.com/community/225/python-join-why-is-it-string-join-list-instead-of-list-join-string
  5. https://www.wyzant.com/resources/answers/689501/python-join-why-is-it-string-join-list-instead-of-list-join-string
  6. https://www.quora.com/Why-is-it-string-join-list-instead-of-list-join-string
  7. https://mail.python.org/pipermail/python-dev/1999-June/095366.html

Работая в качестве исследователя в распределенных системах, доктор Кристиан Майер нашел свою любовь к учению студентов компьютерных наук.

Чтобы помочь студентам достичь более высоких уровней успеха Python, он основал сайт программирования образования Finxter.com Отказ Он автор популярной книги программирования Python One-listers (Nostarch 2020), Coauthor of Кофе-брейк Python Серия самооставленных книг, энтузиаста компьютерных наук, Фрилансера и владелец одного из лучших 10 крупнейших Питон блоги по всему миру.

Его страсти пишут, чтение и кодирование. Но его величайшая страсть состоит в том, чтобы служить стремлению кодер через Finxter и помогать им повысить свои навыки. Вы можете присоединиться к его бесплатной академии электронной почты здесь.