Если вы похожи на меня, вы, возможно, задали себе следующий вопрос:
Почему это 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%, не так ли?
- https://stackoverflow.com/questions/493819/why-is-it-string-joinlist-instead-of-list-joinstring
- https://www.edureka.co/community/3899/python-join-why-is-string-join-list-instead-list-join-string
- https://www.edureka.co/community/12487/python-join-why-is-string-join-list-instead-list-join-string
- https://intellipaat.com/community/225/python-join-why-is-it-string-join-list-instead-of-list-join-string
- https://www.wyzant.com/resources/answers/689501/python-join-why-is-it-string-join-list-instead-of-list-join-string
- https://www.quora.com/Why-is-it-string-join-list-instead-of-list-join-string
- https://mail.python.org/pipermail/python-dev/1999-June/095366.html
Работая в качестве исследователя в распределенных системах, доктор Кристиан Майер нашел свою любовь к учению студентов компьютерных наук.
Чтобы помочь студентам достичь более высоких уровней успеха Python, он основал сайт программирования образования Finxter.com Отказ Он автор популярной книги программирования Python One-listers (Nostarch 2020), Coauthor of Кофе-брейк Python Серия самооставленных книг, энтузиаста компьютерных наук, Фрилансера и владелец одного из лучших 10 крупнейших Питон блоги по всему миру.
Его страсти пишут, чтение и кодирование. Но его величайшая страсть состоит в том, чтобы служить стремлению кодер через Finxter и помогать им повысить свои навыки. Вы можете присоединиться к его бесплатной академии электронной почты здесь.