Kenapa string.join(list)bukan list.join(string)?
Ini karena joinmetode "string"! Ini menciptakan string dari setiap iterable. Jika kita terjebak metode pada daftar, bagaimana ketika kita memiliki iterables yang bukan daftar?
Bagaimana jika Anda memiliki tuple string? Jika ini adalah listmetode, Anda harus melemparkan setiap iterator string seperti listsebelum Anda dapat bergabung dengan elemen menjadi satu string! Sebagai contoh:
some_strings = ('foo', 'bar', 'baz')
Mari kita roll metode daftar bergabung kita sendiri:
class OurList(list):
def join(self, s):
return s.join(self)
Dan untuk menggunakannya, perhatikan bahwa kita harus terlebih dahulu membuat daftar dari setiap iterable untuk bergabung dengan string di iterable, membuang-buang memori dan kekuatan pemrosesan:
>>> l = OurList(some_strings) # step 1, create our list
>>> l.join(', ') # step 2, use our list join method!
'foo, bar, baz'
Jadi kami melihat kami harus menambahkan langkah ekstra untuk menggunakan metode daftar kami, daripada hanya menggunakan metode string bawaan:
>>> ' | '.join(some_strings) # a single step!
'foo | bar | baz'
Peringatan Kinerja untuk Generator
Algoritma yang digunakan Python untuk membuat string terakhir dengan str.joinbenar - benar harus melewati iterable dua kali, jadi jika Anda memberikannya ekspresi generator, itu harus terwujud menjadi daftar terlebih dahulu sebelum dapat membuat string terakhir.
Dengan demikian, sementara membagikan generator biasanya lebih baik daripada daftar pemahaman, str.joinadalah pengecualian:
>>> 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
Namun demikian, str.joinoperasi ini masih semantik operasi "string", sehingga masih masuk akal untuk memilikinya pada strobjek daripada pada iterables lain-lain.
-nyatakan bahwa Anda bergabung dengan daftar dan mengonversi ke string. Berorientasi pada hasil.