2013-04-30 2 views
5

Многие языки программирования, включая Python, поддерживают операцию, как это:Семантика поворота списка в строку

", ".join(["1","2","3"]) 

, который возвращает строку

"1, 2, 3" 

Я понимаю, что это так, но я не понимают конструктивного решения, стоящего за ним - наверняка было бы более семантически корректно выполнять операцию join в списке, например:

["1","2","3"].join(", ") 

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

Редактировать: похоже, что у Javascript есть метод join в списке; если у кого есть примеры, за которыми следуют определенные языки, не стесняйтесь комментировать/отвечать на выбор на этом конкретном языке.

+0

Обратите внимание, что ваш пример * не работает * в python. Список должен содержать только строки. – mgilson

+0

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

+0

Я отредактировал синтаксис, чтобы отразить это - вопрос был скорее об общей семантике, чем о конкретной операции, хотя :) – jackweirdy

ответ

3

Для python есть несколько аргументов против него. Во-первых, если это строковый метод, который принимает произвольный итерируемый, то вам нужно только поддерживать метод join на строковых объектах, и он автоматически работает с чем-либо итерируемым. В противном случае, пользовательские Iterable объекты также должны поддерживать join метод, и т.д. и т.п.

считает:

", ".join(["1","2","3"]) 
", ".join(("1","2","3")) 
", ".join(str(x) for x in xrange(1,4)) 
", ".join({'1':None,'2':None,'3':None}) 
", ".join({'1','2','3'}) #set literal syntax -- python2.7+ 
", ".join("123") 

6 различных типов все поддерживаемый очень просто с помощью одного метода (и я только коснулся встроенным типов).

Во-вторых, вы можете только join список, если все в нем basestring. Кажется глупым предоставить метод в списке, который вызвал бы исключение, если бы вы использовали его в списке с неправильным содержимым. По крайней мере, API здесь кажется несколько сложным (для меня). Конечно, можно утверждать, что list.remove может вызвать исключение, если вызвано с неправильными аргументами. И это правда. Но в целом вы удаляете только один элемент. Он работает на более низком уровне, чем join. Конечно, этот аргумент слабее, чем первый, который я предложил, поэтому, если вам это не нравится, просто вернитесь к аргументу 1.

Смежные вопросы