Mengapa anda perlu mencabar diri anda untuk tidak menulis gelung for dalam kod anda? Kerana ini memaksa anda untuk belajar menggunakan sintaks atau perpustakaan yang lebih maju dan lebih idiomatik. Artikel itu menggunakan python sebagai contoh untuk bercakap tentang banyak sintaks yang semua orang telah lihat dalam kod orang lain tetapi jarang menggunakannya sendiri.
Sudah agak lama saya mula menerokai ciri bahasa yang menakjubkan dalam Python. Pada mulanya, saya memberi cabaran kepada diri saya sendiri dengan matlamat membenarkan saya mempraktikkan lebih banyak ciri bahasa Python daripada pengalaman pengaturcaraan dengan bahasa pengaturcaraan lain. Ini menjadikan perkara lebih dan lebih menarik! Kod menjadi lebih dan lebih ringkas, dan kod kelihatan lebih berstruktur dan piawai. Saya akan memperkenalkan faedah ini di bawah.
Untuk gelung biasanya digunakan dalam senario penggunaan berikut:
Nasib baik, Python sudah mempunyai banyak alatan untuk membantu anda melakukan ini, anda hanya perlu mengalihkan fikiran anda dan memikirkannya dari perspektif yang berbeza.
Apakah faedah yang anda perolehi dengan mengelak daripada menulis untuk gelung:
Mari kita lihat struktur kod berikut:
# 1 with ...: for ...: if ...: try: except: else:
Dalam contoh ini, kita berurusan dengan Berbilang lapisan kod bersarang, yang sukar untuk membaca. Contoh ini menggunakan berbilang peringkat kod bersarang. Apa yang saya temui dalam kod ini ialah penggunaan lekukan secara sembarangan untuk mencampurkan logik pengurusan (dengan, cuba-kecuali) dan logik perniagaan (untuk, jika). Jika anda mematuhi konvensyen hanya menggunakan lekukan untuk logik pentadbiran, maka logik perniagaan teras harus dikeluarkan dengan segera.
"Struktur rata lebih baik daripada struktur bersarang" - Zen of Python
Alat sedia ada yang boleh digunakan untuk menggantikan gelung
Mari kita lihat contoh mudah. Jika anda ingin menukar satu tatasusunan kepada tatasusunan yang lain:
result = [] for item in item_list: new_item = do_something_with(item) result.append(item)
Jika anda suka MapReduce, anda juga boleh menggunakan peta, atau Senarai Pemahaman dalam Python:
result = [do_something_with(item) for item in item_list]
Begitu juga, Jika anda hanya ingin mengulangi elemen dalam tatasusunan, anda juga boleh menggunakan kod yang sama Ungkapan Penjana. result = (do_something_with(item) for item in item_list)
Jika anda ingin memetakan satu tatasusunan ke tatasusunan lain, panggil sahaja fungsi peta dan anda boleh menggunakan yang dikemas kini. Pendekatan pengaturcaraan lanjutan dan lebih praktikal menyelesaikan masalah ini.
doubled_list = map(lambda x: x * 2, old_list)
Jika anda ingin mengurangkan jujukan kepada satu, gunakan reduce
Selain itu, banyak fungsi terbina dalam Python menggunakan iterables:
>>> a = list(range(10)) >>> a [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> all(a) False >>> any(a) True >>> max(a) 9 >>> min(a) 0 >>> list(filter(bool, a)) [1, 2, 3, 4, 5, 6, 7, 8, 9] >>> set(a) {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} >>> dict(zip(a,a)) {0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9} >>> sorted(a, reverse=True) [9, 8, 7, 6, 5, 4, 3, 2, 1, 0] >>> str(a) '[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]' >>> sum(a) 45
Dua kaedah di atas adalah baik untuk mengendalikan logik yang lebih mudah. Bagaimana pula dengan logik yang lebih kompleks? Sebagai pengaturcara, kami menulis fungsi untuk mengasingkan perniagaan yang kompleks. Idea yang sama berlaku di sini. Jika anda menulis seperti ini:
results = [] for item in item_list: # setups # condition # processing # calculation results.append(result)
Jelas sekali anda menambah terlalu banyak tanggungjawab pada blok kod. Sebaliknya, saya cadangkan anda lakukan:
def process_item(item): # setups # condition # processing # calculation return result results = [process_item(item) for item in item_list]
Apa yang akan berlaku jika anda menukar kepada fungsi bersarang:
results = [] for i in range(10): for j in range(i): results.append((i, j))
Tukar kepada Pemahaman Senarai untuk mencapai ini:
results = [(i, j) for i in range(10) for j in range(i)]
Jika blok kod anda perlu merekodkan beberapa keadaan dalaman:
# finding the max prior to the current item a = [3, 4, 6, 2, 1, 9, 0, 7, 5, 8] results = [] current_max = 0 for i in a: current_max = max(i, current_max) results.append(current_max) # results = [3, 4, 6, 6, 6, 9, 9, 9, 9, 9]
Kami menggunakan penjana untuk mencapai ini:
def max_generator(numbers): current_max = 0 for i in numbers: current_max = max(i, current_max) yield current_max a = [3, 4, 6, 2, 1, 9, 0, 7, 5, 8] results = list(max_generator(a))
Pembaca mungkin bertanya "Tunggu! Anda di sini The for gelung digunakan dalam penjana Jangan risau, lihat kod di bawah
Jangan tulis sendiri itertools akan membantu anda melaksanakannya mudah. Modul boleh menggantikan gelung asal anda dalam kebanyakan senario Sebagai contoh, contoh terakhir boleh ditulis semula sebagai:
Selain itu, jika anda ingin mengulangi urutan gabungan, anda perlu gunakan produk(), pilih atur( ), kombinasi(). Anda harus mengelak daripada menulis gelung for seperti ini. Akan ada kebolehbacaan kod yang lebih baikfrom itertools import accumulate a = [3, 4, 6, 2, 1, 9, 0, 7, 5, 8] resutls = list(accumulate(a, max))
.
Atas ialah kandungan terperinci Tiga pilihan |. Abaikan gelung for dan jadikan kod Python lebih pythonic!. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!