Neden string.join(list)
yerine list.join(string)
?
Çünkü join
bir "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 list
yö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.join
gerç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.join
işlem hala anlamsal olarak bir "dize" işlemidir, bu nedenle str
nesne ü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.