Rumah > pembangunan bahagian belakang > Tutorial Python > Cabaran: Alternatif untuk melaksanakan gelung dalam Python

Cabaran: Alternatif untuk melaksanakan gelung dalam Python

WBOY
Lepaskan: 2023-05-07 09:28:07
ke hadapan
1190 orang telah melayarinya

挑战不再写Python for 循环

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 menerangkan manfaat ini di bawah.

Untuk gelung biasanya digunakan dalam senario penggunaan berikut:

  • Untuk mengekstrak beberapa maklumat dalam urutan.
  • Janakan satu urutan daripada yang lain.
  • Menulis untuk sudah menjadi kebiasaan.

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:

  • Kurang jumlah kod
  • Kebolehbacaan kod yang lebih baik
  • Kurang lekukan (masih menghasilkan sense for Python)

Mari kita lihat struktur kod berikut:

# 1
with ...:
 for ...:
 if ...:
 try:
 except:
 else:
Salin selepas log masuk

Dalam contoh ini, kita berurusan dengan kod bersarang berbilang peringkat, yang sukar dibaca. 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" - The Zen of Python

Alat sedia ada yang boleh digunakan untuk menggantikan gelung

1. Senaraikan Kefahaman / Ungkapan penjana

Mari 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)
Salin selepas log masuk

Jika anda suka MapReduce, anda juga boleh menggunakan peta, atau Senarai Pemahaman dalam Python:

hasil = [do_something_with(item) untuk item dalam item_list]

Begitu juga, jika anda hanya ingin mengulangi elemen

Salin selepas log masuk

dalam tatasusunan, anda juga boleh menggunakan Ungkapan Penjana kod yang sama.

result = (do_something_with(item) for item in item_list)
Salin selepas log masuk

2. Fungsi

Jika anda ingin memetakan tatasusunan ke tatasusunan lain, panggil sahaja fungsi peta untuk menyelesaikan masalah ini dengan cara pengaturcaraan yang lebih maju dan praktikal.

doubled_list = map(lambda x: x * 2, old_list)
Salin selepas log masuk

Jika anda ingin mengurangkan jujukan kepada satu, gunakan reduce

from functools import reduce
summation = reduce(lambda x, y: x + y, numbers)
Salin selepas log masuk

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
Salin selepas log masuk

3 atau Penjana

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)
Salin selepas log masuk

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]
Salin selepas log masuk

Apakah yang berlaku jika anda menukar kepada fungsi bersarang?

results = []
for i in range(10):
 for j in range(i):
 results.append((i, j))
Salin selepas log masuk

Tukar kepada Pemahaman Senarai untuk mencapai sesuatu seperti ini:

results = [(i, j)
for i in range(10)
for j in range(i)]
Salin selepas log masuk

Jika anda kod Blok 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]
Salin selepas log masuk

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))
Salin selepas log masuk
  • Pembaca mungkin bertanya "Tunggu! Anda menggunakan gelung for dalam penjana, itu menipu. ! dalam kebanyakan senario. Anda boleh menggantikan gelung asal anda Sebagai contoh, contoh terakhir boleh ditulis semula sebagai:
  • from itertools import accumulate
    a = [3, 4, 6, 2, 1, 9, 0, 7, 5, 8]
    resutls = list(accumulate(a, max))
    Salin selepas log masuk
    Selain itu, jika anda ingin mengulangi urutan gabungan, anda perlu menggunakan product() , pilih atur(), kombinasi(). >

    Kesimpulan

    Dalam kebanyakan kes, anda tidak perlu menulis untuk gelung

    Anda harus mengelak daripada menulis untuk gelung, yang mana akan menjadikan kod lebih mudah dibaca

    Atas ialah kandungan terperinci Cabaran: Alternatif untuk melaksanakan gelung dalam Python. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:51cto.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan