Anda dapat menggunakan return
sekali di generator; itu menghentikan iterasi tanpa menghasilkan apa pun, dan dengan demikian memberikan alternatif eksplisit untuk membiarkan fungsi kehabisan ruang lingkup. Jadi gunakan yield
untuk mengubah fungsi menjadi generator, tetapi awali dengan return
menghentikan generator sebelum menghasilkan apa pun.
>>> def f():
... return
... yield
...
>>> list(f())
[]
Saya tidak yakin itu jauh lebih baik dari yang Anda miliki - itu hanya menggantikan if
pernyataan tidak ada operasi dengan pernyataan tidak ada operasi yield
. Tapi itu lebih idiomatis. Perhatikan bahwa hanya menggunakan yield
tidak berhasil.
>>> def f():
... yield
...
>>> list(f())
[None]
Mengapa tidak digunakan saja iter(())
?
Pertanyaan ini menanyakan secara khusus tentang fungsi generator yang kosong . Untuk alasan itu, saya menganggapnya sebagai pertanyaan tentang konsistensi internal sintaksis Python, daripada pertanyaan tentang cara terbaik untuk membuat iterator kosong secara umum.
Jika pertanyaan sebenarnya tentang cara terbaik untuk membuat iterator kosong, maka Anda mungkin setuju dengan Zectbumo tentang penggunaan iter(())
. Namun, penting untuk diperhatikaniter(())
tidak mengembalikan fungsi! Ini secara langsung mengembalikan iterable kosong. Misalkan Anda bekerja dengan API yang mengharapkan callable yang mengembalikan iterable. Anda harus melakukan sesuatu seperti ini:
def empty():
return iter(())
( Penghargaan harus diberikan kepada Unutbu karena memberikan versi pertama yang benar dari jawaban ini.)
Sekarang, Anda mungkin menemukan penjelasan di atas lebih jelas, tetapi saya bisa membayangkan situasi di mana itu menjadi kurang jelas. Pertimbangkan contoh daftar panjang definisi fungsi generator (dibuat-buat) ini:
def zeros():
while True:
yield 0
def ones():
while True:
yield 1
...
Di akhir daftar panjang itu, saya lebih suka melihat sesuatu yang mengandung a yield
, seperti ini:
def empty():
return
yield
atau, dengan Python 3.3 dan yang lebih baru (seperti yang disarankan oleh DSM ), ini:
def empty():
yield from ()
Kehadiran yield
kata kunci membuatnya jelas sekilas bahwa ini hanyalah fungsi generator, persis seperti yang lainnya. Perlu waktu lebih lama untuk melihat bahwa iter(())
versi tersebut melakukan hal yang sama.
Ini perbedaan yang halus, tapi sejujurnya menurut saya yield
fungsi berbasis lebih mudah dibaca dan dipelihara.
if False: yield
tetapi masih agak membingungkan bagi orang-orang yang tidak mengetahui pola ini