Python Academy · Pelajaran

yield from dan Delegasi

Gabungkan penjana

Pelajaran 4 daripada 413 langkah

yield from dan Delegasi ialah pelajaran Python Academy percuma di CoddyKit. Ini ialah pelajaran 4 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.

Masalah yang Diselesaikan oleh yield from

Apabila satu penjana mahu menghasilkan setiap nilai daripada objek boleh lelar yang lain, Anda boleh menulis gelung manual. yield from melakukan perkara yang sama dalam satu baris.

def manual():
    for x in [1, 2, 3]:
        yield x

print(list(manual()))

Memperkenalkan yield from

yield from iterable menyerahkan tugas kepada objek boleh lelar tersebut dan menghasilkan setiap nilainya mengikut turutan. Cara ini lebih ringkas dan jelas berbanding gelung penerusan.

def delegate():
    yield from [1, 2, 3]

print(list(delegate()))

Menggabungkan Pelbagai Sumber

Anda boleh merantai beberapa pernyataan yield from untuk menggabungkan jujukan secara malas.

def chained():
    yield from 'ab'
    yield from [1, 2]
    yield from range(2)

print(list(chained()))

Menyerahkan Tugas kepada Penjana Lain

Objek boleh lelar yang menerima tugas tersebut juga boleh berupa penjana, lalu membolehkan Anda menggabungkan penjana menjadi penjana yang lebih besar.

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

def report(n):
    print('evens:')
    yield from evens(n)

print(list(report(6)))

Meratakan Senarai Bersarang

Salah satu kegunaan klasik yield from ialah perataan rekursif: penjana yang menyerahkan tugas kepada dirinya sendiri untuk memproses subsenarai.

def flatten(items):
    for item in items:
        if isinstance(item, list):
            yield from flatten(item)
        else:
            yield item

print(list(flatten([1, [2, [3, 4]], 5])))

yield from berbanding Gelung

Kedua-dua versi di bawah menghasilkan output yang sama. yield from lebih disukai kerana mudah dibaca dan turut meneruskan ciri lanjutan seperti penghantaran nilai serta hasil pulangan.

def with_loop(src):
    for x in src:
        yield x

def with_yield_from(src):
    yield from src

print(list(with_loop(range(3))))
print(list(with_yield_from(range(3))))

Mendapatkan Nilai Pulangan Subpenjana

Apabila penjana yang menerima tugas melakukan return dengan suatu nilai, yield from dinilai sebagai nilai tersebut. Ini membolehkan subpenjana melaporkan hasil.

def counter(n):
    count = 0
    for i in range(n):
        yield i
        count += 1
    return count

def driver():
    total = yield from counter(3)
    print('subgen yielded', total, 'items')

list(driver())

Membina Alur Pemprosesan

Penyerahan tugas memudahkan pembahagian alur pemprosesan kepada peringkat bernama dan penggabungannya.

def source():
    yield from range(5)

def only_odd(src):
    for x in src:
        if x % 2 == 1:
            yield x

def pipeline():
    yield from only_odd(source())

print(list(pipeline()))

Menyerahkan Tugas kepada Sebarang Objek Boleh Lelар

yield from berfungsi dengan sebarang objek boleh lelar, bukan penjana sahaja: senarai, tupel, set, rentetan, kunci kamus dan banyak lagi.

def mixed():
    yield from {1, 2, 3}
    yield from ('a', 'b')

result = list(mixed())
print(sorted(str(x) for x in result))

Menggabungkan Penjana Mengikut Turutan

Anda boleh membina penjana yang melawati beberapa sumber secara berturutan, yang berguna untuk menggabungkan aliran.

def concat(*iterables):
    for it in iterables:
        yield from it

print(list(concat([1, 2], [3], [4, 5])))

Kelebihan Kebolehbacaan

Untuk data yang sangat bersarang atau berbentuk pepohon, yield from memastikan penjana rekursif kekal ringkas dan menjelaskan maksudnya.

def walk(tree):
    yield tree['name']
    for child in tree.get('children', []):
        yield from walk(child)

tree = {'name': 'root', 'children': [
    {'name': 'a'},
    {'name': 'b', 'children': [{'name': 'c'}]}
]}
print(list(walk(tree)))

Semakan Ringkas

Uji pemahaman Anda tentang yield from.

Imbas Kembali

Anda telah mempelajari yield from dan penyerahan tugas:

  • Ia meneruskan setiap nilai daripada objek boleh lelar dalaman.
  • Ia menggabungkan penjana dan menyokong perataan rekursif.
  • Ia mendapatkan nilai pulangan subpenjana.
  • Ia lebih jelas berbanding gelung penerusan manual.

Kursus seterusnya: keserentakan dengan utas dan pemprosesan berbilang proses.

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 “yield from dan Delegasi” percuma?

Ya — teks penuh “yield from dan Delegasi” 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 “yield from dan Delegasi”?

Gabungkan penjana 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 4 daripada 4.

Berapa lamakah pelajaran “yield from dan Delegasi” 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