Neden string.join(list)yerine list.join(string)?
Çünkü joinbir "dize" yöntemi! Herhangi bir yinelenebilir bir dize oluşturur. Yöntemi listelere takarsak, liste olmayan yinelemelere sahip olduğumuzda ne olur?
Bir dizi ipiniz varsa ne olur? Bu bir listyöntem olsaydı list, öğeleri tek bir dizeye birleştirmeden önce dizelerin her bir yineleyicisini bir olarak dökmeniz gerekir ! Örneğin:
some_strings = ('foo', 'bar', 'baz')
Kendi liste birleştirme yöntemimizi yuvarlayalım:
class OurList(list):
def join(self, s):
return s.join(self)
Bunu kullanmak için, önce bu yinelenebilir dizelere katılmak için her bir yinelenebilir listeden hem bellek hem de işlem gücünü boşa harcayan bir liste oluşturmamız gerektiğini unutmayın:
>>> l = OurList(some_strings) # step 1, create our list
>>> l.join(', ') # step 2, use our list join method!
'foo, bar, baz'
Bu nedenle, yalnızca yerleşik dize yöntemini kullanmak yerine liste yöntemimizi kullanmak için ek bir adım eklememiz gerektiğini görüyoruz:
>>> ' | '.join(some_strings) # a single step!
'foo | bar | baz'
Jeneratörler için Performans Uyarısı
Python'un son dizeyi oluşturmak için kullandığı algoritma, str.joingerçekten de yinelenebilir olanı iki kez geçmelidir, bu nedenle bir jeneratör ifadesi sağlarsanız, son dizeyi oluşturmadan önce bir listeye yerleştirmesi gerekir.
Bu nedenle, jeneratörleri dolaşmak genellikle liste kavrayışlarından daha iyi olsa da str.join, bir istisnadır:
>>> 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
Bununla birlikte, str.joinişlem hala anlamsal olarak bir "dize" işlemidir, bu nedenle strnesne üzerinde tekrarlanabilir olanlardan ziyade nesneye sahip olmak hala mantıklıdır .
-bir listeye katıldığınızı ve bir dizeye dönüştürdüğünüzü bildirir.