Python Academy · Pelajaran

Fungsi Penjana

Hasilkan nilai secara malas dengan yield

Pelajaran 2 daripada 413 langkah

Fungsi Penjana ialah pelajaran Python Academy percuma di CoddyKit. Ini ialah pelajaran 2 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Python Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Python Academy merangkumi sejumlah 4 pelajaran.

Apakah Penjana?

Fungsi penjana kelihatan seperti fungsi biasa, tetapi menggunakan yield dan bukannya, atau bersama-sama dengan, return. Memanggilnya tidak menjalankan isi fungsi; sebaliknya, ia mengembalikan objek penjana, iaitu objek lelar.

def gen():
    yield 1
    yield 2
    yield 3

g = gen()
print(type(g).__name__)
print(list(g))

yield Menjeda Pelaksanaan

Setiap kali Anda memanggil next(), fungsi berjalan sehingga menemui yield, mengembalikan nilai tersebut, kemudian membekukan keadaannya. Panggilan seterusnya menyambung semula pelaksanaan sejurus selepas yield.

def steps():
    print('start')
    yield 'a'
    print('resumed')
    yield 'b'

g = steps()
print(next(g))
print(next(g))

Melakukan Lelaran pada Penjana

Oleh sebab penjana ialah objek lelar, gelung for menggerakkannya secara automatik dan berhenti apabila fungsi berakhir, yang secara dalaman mencetuskan StopIteration.

def countdown(n):
    while n > 0:
        yield n
        n -= 1

for x in countdown(4):
    print(x)

Penilaian Malas

Penjana bersifat malas: nilai hanya dihasilkan apabila diminta. Ini bermakna Anda boleh memodelkan jujukan yang sangat besar atau tidak terhingga tanpa menggunakan banyak memori.

def naturals():
    n = 1
    while True:
        yield n
        n += 1

g = naturals()
print(next(g), next(g), next(g))

Keadaan antara yield

Pemboleh ubah setempat mengekalkan nilainya antara titik yield. Penjana mengingati tempat ia berhenti secara semula jadi, tanpa memerlukan pengurusan indeks secara manual.

def fib():
    a, b = 0, 1
    while True:
        yield a
        a, b = b, a + b

g = fib()
print([next(g) for _ in range(7)])

Penjana berbanding Pembinaan Senarai

Fungsi biasa membina dan mengembalikan seluruh senarai sekali gus. Penjana menghasilkan item apabila diminta. Gunakan penjana apabila jujukannya besar atau Anda mungkin berhenti lebih awal.

def squares_list(n):
    result = []
    for i in range(n):
        result.append(i * i)
    return result

def squares_gen(n):
    for i in range(n):
        yield i * i

print(squares_list(5))
print(list(squares_gen(5)))

Berhenti Lebih Awal

Oleh sebab penjanaan berlaku secara malas, Anda boleh keluar daripada gelung dan penjana tidak akan mengira bahagian yang selebihnya.

def naturals():
    n = 1
    while True:
        print('producing', n)
        yield n
        n += 1

for x in naturals():
    if x > 3:
        break
    print('got', x)

return dalam Penjana

return tanpa nilai dalam penjana hanya menamatkannya, lalu mencetuskan StopIteration. Sebarang nilai yang Anda kembalikan menjadi atribut value bagi pengecualian tersebut, yang biasanya diabaikan oleh kebanyakan gelung.

def up_to(stop):
    i = 0
    while True:
        if i >= stop:
            return
        yield i
        i += 1

print(list(up_to(4)))

Penjana Digunakan Sekali Sahaja

Seperti semua objek lelar, penjana digunakan sekali sahaja. Selepas habis digunakan, penjana tidak menghasilkan apa-apa. Panggil fungsi itu sekali lagi untuk mendapatkan penjana baharu.

def gen():
    yield 1
    yield 2

g = gen()
print(list(g))
print(list(g))
print(list(gen()))

Menapis dengan Penjana

Penjana menghasilkan alur pemprosesan data yang kemas. Di sini, kita menghasilkan hanya nombor genap, satu demi satu.

def evens(numbers):
    for n in numbers:
        if n % 2 == 0:
            yield n

print(list(evens(range(10))))

Merantai Penjana

Penjana boleh menggunakan penjana lain, lalu membina alur pemprosesan berbilang peringkat yang setiap peringkatnya bersifat malas.

def numbers(n):
    for i in range(n):
        yield i

def doubled(src):
    for x in src:
        yield x * 2

print(list(doubled(numbers(5))))

Semakan Ringkas

Uji pemahaman Anda tentang fungsi penjana.

Imbas Kembali

Anda telah mempelajari fungsi penjana:

  • yield menjeda dan menyambung semula pelaksanaan sambil mengekalkan keadaan setempat.
  • Memanggil fungsi tersebut mengembalikan objek penjana yang bersifat malas.
  • Penjana menjimatkan memori dan sangat sesuai untuk alur pemprosesan serta aliran tidak terhingga.
  • Penjana digunakan sekali sahaja, seperti mana-mana objek lelar.

Seterusnya: ungkapan penjana yang lebih padat.

Percuma untuk bermula

Pelajari Python dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
76
Pelajaran
320

Soalan Lazim

Adakah pelajaran “Fungsi Penjana” percuma?

Ya — teks penuh “Fungsi Penjana” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Python Academy, tingkat taraf kepada CoddyKit PRO. Kursus Python Academy merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Fungsi Penjana”?

Hasilkan nilai secara malas dengan yield Anda berlatih Python Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Python Academy?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Python Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 2 daripada 4.

Berapa lamakah pelajaran “Fungsi Penjana” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Python Academy ini?

Ya. Setiap pelajaran Python Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Protokol Lelaran
  2. Fungsi Penjana
  3. Ungkapan Penjana
  4. yield from dan Delegasi
← Kembali ke Python Academy