Mengapa string.join(daftar) dan bukan dari daftar.bergabung(string)?
Ini selalu membuatku bingung. Sepertinya ini akan menjadi lebih baik:
my_list = ["Hello", "world"]
print(my_list.join("-"))
# Produce: "Hello-world"
Dari ini:
my_list = ["Hello", "world"]
print("-".join(my_list))
# Produce: "Hello-world"
Apakah ada alasan tertentu hal ini seperti ini?
1661
10
It's karena setiap iterable dapat bergabung, bukan hanya daftar, tapi hasil dan "joiner" selalu string.
Misalnya:
Hal ini telah dibahas dalam String metode... akhirnya thread di Python-Dev mencapai, dan diterima oleh Guido. Thread ini dimulai pada Juni 1999, dan
str.bergabung
termasuk dalam Python 1.6 yang dirilis pada September 2000 (dan didukung Unicode). Python 2.0 (didukungstr
metodebergabung
) dirilis pada bulan Oktober 2000.str.bergabung(seq)
seq.bergabung(str)
seq.mengurangi(str)
bergabung
sebagai fungsi built-indaftar ini,
tupel ini, tapi semua urutan/iterables.seq.mengurangi(str)
adalah sulit bagi pendatang baru.seq.bergabung(str)
memperkenalkan terduga ketergantungan dari urutan ke str/unicode.join()
sebagai fungsi built-in yang akan mendukung hanya data spesifik jenis. Jadi menggunakan dibangun di namespace adalah tidak baik. Jikajoin()
mendukung banyak tipe data, membuat dioptimalkan pelaksanaannya akan sulit, jika diimplementasikan dengan menggunakan__add__
metode maka's O(n²).sep
) tidak boleh dihilangkan. Eksplisit lebih baik dari yang implisit.Tidak ada alasan lain yang ditawarkan di thread ini.
Berikut ini adalah beberapa tambahan pikiran (saya sendiri, dan teman saya's):
Guido's keputusan yang tercatat dalam sejarah mail, memutuskan
str.bergabung(seq)
:Karena
join()
metode dalam class string, bukan daftar kelas?Saya setuju itu terlihat lucu.
Lihat http://www.faqs.org/docs/diveintopython/odbchelper_join.html:
Saya setuju bahwa itu's berlawanan dengan intuisi, tapi ada's sebuah alasan yang baik. Bergabung bisa't menjadi metode dari daftar karena:
Sebenarnya ada dua bergabung metode (Python 3.0):
Jika bergabung adalah metode daftar, maka akan memiliki untuk memeriksa argumen untuk memutuskan mana salah satu dari mereka untuk menelepon. Dan anda dapat't bergabung byte dan str bersama-sama, sehingga mereka itu sekarang masuk akal.
Hal ini karena
bergabung
adalah "string" metode! Ini menciptakan sebuah string dari setiap iterable. Jika kita terjebak pada metode daftar, bagaimana ketika kita memiliki iterables yang tidak't daftar?Bagaimana jika anda memiliki sebuah tuple dari string? Jika ini adalah sebuah
daftar
metode, anda akan memiliki untuk melemparkan setiap iterasi dari string sebagaidaftar
sebelum anda dapat bergabung dengan unsur-unsur dalam sebuah string tunggal! Misalnya:Let's roll kami daftar sendiri bergabung dengan metode:
Dan untuk menggunakannya, perhatikan bahwa kita harus terlebih dahulu membuat daftar dari masing-masing iterable untuk bergabung dengan string yang iterable, membuang-buang memori dan daya proses:
Jadi kita lihat kita harus menambahkan langkah tambahan untuk menggunakan metode daftar, bukan hanya menggunakan builtin string metode:
Kinerja Peringatan untuk Generator
Algoritma ini menggunakan Python untuk membuat final string dengan
str.bergabung
benar-benar telah melewati iterable dua kali, jadi jika anda memberikan sebuah generator ekspresi, itu telah terwujud menjadi daftar pertama sebelum dapat membuat akhir string.Dengan demikian, saat melintas di sekitar generator biasanya lebih baik dari daftar pemahaman,
str.bergabung
adalah pengecualian:Namun demikian,
str.bergabung dengan
operasi masih semantik "string" operasi, jadi masih masuk akal untuk memiliki itu padastr
objek dari pada lain-lain iterables.Berpikir itu sebagai alam orthogonal operasi untuk membagi.
Saya memahami mengapa hal ini berlaku untuk apa pun iterable dan agar bisa't mudah dilaksanakan hanya pada daftar.
Untuk dibaca, saya'd ingin melihat itu dalam bahasa tapi aku don't pikir itu benar-benar layak - jika iterability adalah sebuah antarmuka maka bisa ditambahkan ke antarmuka tapi itu hanya sebuah convention dan jadi ada's tidak ada cara untuk menambahkan ini ke set dari hal-hal yang iterable.
Terutama karena hasil dari
someString.join()
adalah string.Urutan (daftar atau tupel atau apapun) doesn't muncul di hasil, hanya string. Karena hasilnya adalah string, itu masuk akal sebagai metode string.
-
di "-".bergabung(my_list) menyatakan bahwa anda konversi ke string dari bergabung dengan unsur-unsur daftar.It's berorientasi hasil.(hanya untuk memudahkan ingatan dan pemahaman)Saya membuat lengkap cheatsheet dari methods_of_string untuk referensi anda.
Keduanya tidak bagus.
string.bergabung(xs, membatasi) berarti bahwa string modul menyadari keberadaan dari sebuah daftar, yang tidak memiliki bisnis yang mengetahui tentang, sejak string modul ini hanya akan bekerja dengan string.
daftar.bergabung(membatasi) adalah sedikit lebih bagus karena kita're sehingga digunakan untuk string yang mendasar jenis(dan lingual berbicara, mereka). Namun ini berarti bahwa bergabung kebutuhan akan dikirim secara dinamis karena dalam sewenang-wenang konteks
a.split("\n")
compiler python mungkin tidak tahu apa yang lebih, dan akan perlu untuk melihat itu(analog untuk vtable lookup), yang lebih mahal jika anda melakukannya banyak kali.jika python runtime compiler tahu bahwa daftar yang dibangun di modul, maka dapat melewatkan dinamis lookup dan encode maksud ke dalam bytecode langsung, sedangkan jika tidak maka kebutuhan untuk secara dinamis mengatasi "bergabung" "", yang mungkin sampai beberapa lapisan inheritence per panggilan(karena antara panggilan, makna bergabung dapat berubah, karena python merupakan bahasa dinamis).
sayangnya, ini adalah yang paling cacat abstraksi; tidak peduli apa abstraksi yang anda pilih, anda abstraksi hanya akan masuk akal dalam konteks masalah anda're mencoba untuk memecahkan, dan seperti anda tidak pernah memiliki konsisten abstraksi yang doesn't menjadi tidak konsisten dengan ideologi yang mendasari seperti yang anda mulai menempelkan mereka bersama-sama tanpa membungkus mereka dalam tampilan yang konsisten dengan ideologi anda. Mengetahui hal ini, python's pendekatan ini lebih fleksibel karena itu's lebih murah, it's terserah anda untuk membayar lebih untuk membuatnya terlihat "bagus", baik dengan membuat anda sendiri wrapper, atau anda sendiri preprocessor.
Variabel
my_list
dan"-"
apakah kedua benda. Secara khusus, mereka're contoh kelasdaftar
danstr
, masing-masing.Join
fungsi termasuk kelasstr
. Oleh karena itu, sintaks"-".bergabung(my_list)
digunakan karena objek"-"
mengambilmy_list
sebagai input.