Python - Penyusun

Halo, para pemrogram Python yang aspiratif! Hari ini, kita akan memulakan perjalanan yang menarik ke atas dunia Penyusun Python. Sebagai guru sains komputer yang ramah di lingkungan kita, saya sangat gembira untuk menjawab anda melalui topik yang menarik ini. Jadi, ambil minuman kesukaan anda, bersantai, dan mari kita melompat masuk!

Python - Iterators

Python Penyusun

Apa itu Penyusun?

Bayangkan anda memiliki rak besar rakit Lego yang berwarna-warni. Penyusun adalah seperti tangan penyihir yang dapat menyentuh ke atas rak dan mengambil rakit Lego satu persatu, membolehkan anda untuk memeriksa setiap rakit secara individual tanpa mengeluarkan keseluruhan isi rak itu ke atas lantai. Di Python, penyusun bekerja secara serupa, membolehkan kita untuk bekerja dengan kumpulan data satu item pada satu masa.

Bagaimana Penyusun Bekerja?

Penyusun di Python adalah objek yang melaksanakan dua method khas: __iter__() dan __next__(). Jangan khawatir jika ini terdengar seperti nonsens sekarang – kita akan pecahkan ia langkah demi langkah!

  1. Method __iter__() mengembalikan objek penyusun itu sendiri. Ia seperti mengatakan, "Hai, saya sudah siap untuk memberikan rakit Lego!"
  2. Method __next__() mengembalikan item berikutnya dalam urutan. Ia seperti menyentuh ke atas rak dan mengambil rakit Lego berikutnya.

Mari kita lihat ini dalam aksi dengan contoh sederhana:

# Membuat senarai ( rak rakit Lego kita )
my_list = [1, 2, 3, 4, 5]

# Mendapatkan penyusun dari senarai
my_iterator = iter(my_list)

# Menggunakan next() untuk mendapatkan item satu persatu
print(next(my_iterator))  # Output: 1
print(next(my_iterator))  # Output: 2
print(next(my_iterator))  # Output: 3

Dalam contoh ini, iter(my_list) membuat objek penyusun untuk senarai kita. Kemudian, setiap pemanggilan ke next(my_iterator) mengambil item berikutnya dari senarai.

Kekuatan Penyusun dalam Loops

Inilah fakta yang menyenangkan: apabila anda menggunakan for loop di Python, anda sebenarnya menggunakan penyusun di belakang layar! Mari kita lihat bagaimana:

my_list = ["apel", "pisang", "ceri"]

for buah in my_list:
print(f"Saya suka {buah}!")

# Output:
# Saya suka apel!
# Saya suka pisang!
# Saya suka ceri!

Python secara automatik membuat penyusun dari my_list dan menggunakan __next__() untuk mendapatkan setiap item untuk loop. Bukan itu keren?

PengendalianRalat dalam Penyusun

Apabilaakah yang terjadi apabila tangan penyihir kita mencapai rak kosong? Dalam istilah Python, apa yang terjadi apabila tidak ada lagi item di atas penyusun? Ini adalah di mana pengendalian ralat masuk ke permainan.

Apabila penyusun kehabisan (tidak ada lagi item), ia melancarkan pengecualian StopIteration. Mari kita lihat ini dalam aksi:

my_list = [1, 2, 3]
my_iterator = iter(my_list)

print(next(my_iterator))  # Output: 1
print(next(my_iterator))  # Output: 2
print(next(my_iterator))  # Output: 3
print(next(my_iterator))  # Melancarkan pengecualian StopIteration

Untuk menangani ini dengan grace, kita dapat menggunakan blok try-except:

my_list = [1, 2, 3]
my_iterator = iter(my_list)

try:
while True:
item = next(my_iterator)
print(item)
except StopIteration:
print("Penyusun sudah mencapai akhir!")

# Output:
# 1
# 2
# 3
# Penyusun sudah mencapai akhir!

Dengan cara ini, kita dapat memproses semua item dan menangani akhir penyusun dengan lancar.

Penyusun Tersuai

Sekarang bahwa kita mengerti bagaimana penyusun bekerja, mari kita buat yang kita sendiri! Bayangkan kita ingin membuat penyusun kira-kira. Ini bagaimana kita boleh melakukan ia:

class Countdown:
def __init__(self, start):
self.start = start

def __iter__(self):
return self

def __next__(self):
if self.start <= 0:
raise StopIteration
self.start -= 1
return self.start + 1

# Menggunakan penyusun tersuai kita
countdown = Countdown(5)
for number in countdown:
print(number)

# Output:
# 5
# 4
# 3
# 2
# 1

Dalam contoh ini, kita telah membuat kelas Countdown yang bertindak sebagai kedua-duanya iterable (ia memiliki method __iter__() ) dan penyusun (ia memiliki method __next__() ). Setiap kali __next__() dipanggil, ia mengembalikan nomor berikutnya dalam urutan kira-kira.

Penyusun Asinkron

Sebagai kita menjejak ke wilayah yang lebih maju, mari kita menyentuh secara singkat penyusun asinkron. Ini digunakan dalam pemrograman asinkron, yang adalah cara untuk menulis kode konkuren.

Penyusun asinkron adalah serupa dengan penyusun reguler, tetapi ia menggunakan kata kunci async dan await. Ini adalah contoh sederhana:

import asyncio

class AsyncCountdown:
def __init__(self, start):
self.start = start

def __aiter__(self):
return self

async def __anext__(self):
await asyncio.sleep(1)  # Simulasikan beberapa operasi asinkron
if self.start <= 0:
raise StopAsyncIteration
self.start -= 1
return self.start + 1

async def main():
async for number in AsyncCountdown(5):
print(number)

asyncio.run(main())

# Output (dengan jeda 1 saat):
# 5
# 4
# 3
# 2
# 1

Penyusun asinkron ini bekerja secara serupa dengan kelas Countdown sebelumnya, tetapi membolehkan untuk operasi asinkron (disimulasikan di sini dengan asyncio.sleep(1)).

Jadual Method Penyusun

Berikut adalah jadual ringkas yang mengsuming method utama yang kita diskusikan:

Method Keterangan Digunakan Di
__iter__() Mengembalikan objek penyusun Penyusun Reguler
__next__() Mengembalikan item berikutnya dalam urutan Penyusun Reguler
__aiter__() Mengembalikan objek penyusun asinkron Penyusun Asinkron
__anext__() Mengembalikan item berikutnya dalam urutan asinkron Penyusun Asinkron

Dan itu adalah, rakyat! Kita telah melakukan perjalanan melalui negeri Penyusun Python, dari dasar-dasar ke membuat kita sendiri, dan bahkan menyentuh penyusun asinkron. Ingat, seperti belajar untuk membangun dengan Lego, menguasai penyusun memerlukan praktek. Jadi, jangan takut untuk bereksperimen dan membuat penyusun anda sendiri. Happy coding, dan mungkin penyusun itu akan dengan anda!

Credits: Image by storyset