Por que é isso em string.join(list)
vez de list.join(string)
?
Isso ocorre porque join
é um método "string"! Ele cria uma string a partir de qualquer iterável. Se colocamos o método nas listas, e quando temos iterables que não são listas?
E se você tiver uma tupla de strings? Se esse fosse um list
método, você teria que converter todos os iteradores de strings como a list
antes de poder juntar os elementos em uma única string! Por exemplo:
some_strings = ('foo', 'bar', 'baz')
Vamos lançar nosso próprio método de junção de lista:
class OurList(list):
def join(self, s):
return s.join(self)
E, para usá-lo, observe que precisamos primeiro criar uma lista de cada iterável para unir as strings nessa iterável, desperdiçando tanto a memória quanto o poder de processamento:
>>> l = OurList(some_strings) # step 1, create our list
>>> l.join(', ') # step 2, use our list join method!
'foo, bar, baz'
Então, vemos que precisamos adicionar uma etapa extra para usar nosso método de lista, em vez de apenas usar o método de string incorporado:
>>> ' | '.join(some_strings) # a single step!
'foo | bar | baz'
Advertência de desempenho para geradores
O algoritmo que o Python usa para criar a sequência final str.join
precisa passar pela iterável duas vezes; portanto, se você fornecer uma expressão de gerador, precisará materializá-la em uma lista antes de poder criar a sequência final.
Assim, embora distribuir geradores geralmente seja melhor do que a compreensão de lista, str.join
é uma exceção:
>>> import timeit
>>> min(timeit.repeat(lambda: ''.join(str(i) for i in range(10) if i)))
3.839168446022086
>>> min(timeit.repeat(lambda: ''.join([str(i) for i in range(10) if i])))
3.339879313018173
No entanto, a str.join
operação ainda é semanticamente uma operação "string", por isso ainda faz sentido tê-la no str
objeto do que em iterables diversos.
-
declara que você está ingressando em uma lista e convertendo em uma string.