Isto sempre me confundiu. Parece que isto seria mais agradável:
my_list = ["Hello", "world"]
print(my_list.join("-"))
# Produce: "Hello-world"
Do que isto:
my_list = ["Hello", "world"]
print("-".join(my_list))
# Produce: "Hello-world"
Há alguma razão específica para ser assim?
It's porque qualquer iterável pode ser unido, não apenas listas, mas o resultado e o "joiner" são sempre cordas.
Por exemplo:
import urllib2
print('\n############\n'.join(
urllib2.urlopen('http://data.stackexchange.com/users/7095')))
Porque o método join()
está na classe string, em vez da classe listada?
Concordo que parece engraçado.
Ver http://www.faqs.org/docs/diveintopython/odbchelper_join.html:
Nota histórica. Quando eu aprendi pela primeira vez Python, eu esperava que a adesão fosse um método de uma lista, que levaria o delimitador como argumento. Muitos as pessoas sentem o mesmo, e há uma história por detrás do método join. Anterior para Python 1.6, as cordas não tinham todos estes métodos úteis. Havia um módulo de string separado que continha todas as funções das cordas; cada a função tomou uma corda como sua primeira argumento. As funções foram consideradas suficientemente importante para colocar no as próprias cordas, que faziam sentido para funções como inferior, superior, e dividir. Mas muitos Python hard-core programadores se opuseram à nova adesão método, argumentando que deveria ser um método da lista em seu lugar, ou que ele não deve mover-se de todo, mas simplesmente ficar uma parte do antigo módulo de cordas (que ainda tem muitas coisas úteis nele). eu uso exclusivamente o novo método join, mas você vai ver o código escrito way, e se isso realmente o incomoda, você pode usar a antiga função string.join em vez disso.
--- Mark Pilgrim, Mergulhe em Python
Principalmente porque o resultado de um someString.join()
é uma string.
A sequência (lista ou tuple ou qualquer outra) não't aparece no resultado, apenas uma string. Porque o resultado é uma string, faz sentido como um método de uma string.