Pertimbangkan tiga fungsi:
def my_func1():
print "Hello World"
return None
def my_func2():
print "Hello World"
return
def my_func3():
print "Hello World"
Mereka semua tampaknya tidak kembali. Apakah ada perbedaan antara bagaimana nilai yang dikembalikan dari fungsi ini berperilaku? Apakah ada alasan untuk memilih yang satu dibandingkan yang lain?
return None
menyiratkan kepada saya bahwa fungsi kadang-kadang memiliki nilai non-None
kembali, tetapi di lokasireturn None
, tidak ada nilai balik tersebut. Menulis tidakreturn
sama sekali menyiratkan kepada saya tidak pernah ada nilai pengembalian yang menarik, agak seperti "prosedur" yang bertentangan dengan "fungsi".return
menyiratkan untuk ada lebih awal dari "prosedur" seperti pada poin sebelumnya.Jawaban:
Pada perilaku aktual, tidak ada perbedaan. Mereka semua kembali
None
dan hanya itu. Namun, ada waktu dan tempat untuk semua ini. Instruksi berikut pada dasarnya adalah bagaimana metode yang berbeda harus digunakan (atau setidaknya bagaimana saya diajarkan mereka harus digunakan), tetapi mereka bukan aturan mutlak sehingga Anda dapat mencampurnya jika Anda merasa perlu.Menggunakan
return None
Ini mengatakan bahwa fungsi tersebut memang dimaksudkan untuk mengembalikan nilai untuk digunakan nanti, dan dalam hal ini kembali
None
. NilaiNone
ini kemudian dapat digunakan di tempat lain.return None
tidak pernah digunakan jika tidak ada kemungkinan nilai pengembalian lain dari fungsi.Pada contoh berikut, kita kembali
person
'smother
jikaperson
diberikan adalah manusia. Jika itu bukan manusia, kita kembaliNone
karenaperson
tidak memilikimother
(misalkan hewan itu bukan hewan atau sesuatu).Menggunakan
return
Ini digunakan untuk alasan yang sama seperti
break
di loop. Nilai kembali tidak masalah dan Anda hanya ingin keluar dari seluruh fungsi. Ini sangat berguna di beberapa tempat, meskipun Anda tidak terlalu membutuhkannya.Kami punya 15
prisoners
dan kami tahu salah satu dari mereka memiliki pisau. Kami memutari masing-masingprisoner
satu per satu untuk memeriksa apakah mereka memiliki pisau. Jika kita memukul orang itu dengan pisau, kita bisa keluar dari fungsinya karena kita tahu hanya ada satu pisau dan tidak ada alasan untuk memeriksa sisa pisau ituprisoners
. Jika kami tidak menemukanprisoner
dengan pisau, kami meningkatkan peringatan. Ini bisa dilakukan dengan berbagai cara dan menggunakanreturn
mungkin bahkan bukan cara terbaik, tapi itu hanya contoh untuk menunjukkan cara menggunakanreturn
untuk keluar dari suatu fungsi.Catatan: Anda tidak boleh melakukannya
var = find_prisoner_with_knife()
, karena nilai pengembalian tidak dimaksudkan untuk ditangkap.Tidak menggunakan
return
sama sekaliIni juga akan kembali
None
, tetapi nilai itu tidak dimaksudkan untuk digunakan atau ditangkap. Ini berarti bahwa fungsi berakhir dengan sukses. Ini pada dasarnya sama denganreturn
divoid
fungsi dalam bahasa seperti C ++ atau Java.Dalam contoh berikut, kami menetapkan nama ibu seseorang dan kemudian fungsi keluar setelah selesai dengan sukses.
Catatan: Anda tidak boleh melakukannya
var = set_mother(my_person, my_mother)
, karena nilai pengembalian tidak dimaksudkan untuk ditangkap.sumber
var = get_mother()
tidak apa-apa jika Anda beralihvar
ke fungsi lain yang menerimaNone
- "tidak pernah" sedikit ekstremvar = get_mother()
tidak dapat digunakan? IMHO tidak apa-apa untuk melakukan itu. Anda hanya perlu memastikan untuk memeriksaNone
nilai yang tidak denganif var
sebelum menggunakannya.Ya, semuanya sama saja.
Kami dapat meninjau kode mesin yang ditafsirkan untuk mengkonfirmasi bahwa mereka semua melakukan hal yang sama persis.
sumber
dis.dis
pengembalianNone
: -Xdis.dis
juga melaporkan beberapa nomor baris ...Mereka masing-masing mengembalikan singleton yang sama
None
- Tidak ada perbedaan fungsional.Saya pikir itu cukup idiomatis untuk meninggalkan
return
pernyataan kecuali Anda perlu keluar dari fungsi lebih awal (dalam hal telanjangreturn
lebih umum), atau mengembalikan sesuatu selainNone
. Itu juga masuk akal dan tampaknya idiomatis untuk menulisreturn None
ketika itu dalam fungsi yang memiliki jalur lain yang mengembalikan sesuatu selainNone
. Menuliskanreturn None
secara eksplisit adalah isyarat visual kepada pembaca bahwa ada cabang lain yang mengembalikan sesuatu yang lebih menarik (dan bahwa kode panggilan mungkin perlu menangani kedua jenis nilai pengembalian).Seringkali dalam Python, fungsi yang mengembalikan
None
digunakan sepertivoid
fungsi di C - Tujuannya umumnya untuk beroperasi pada argumen input di tempat (kecuali jika Anda menggunakan data global ( gemetar )). MengembalikanNone
biasanya membuatnya lebih eksplisit bahwa argumen dimutasi. Ini membuatnya sedikit lebih jelas mengapa masuk akal untuk meninggalkanreturn
pernyataan dari sudut pandang "konvensi bahasa".Yang mengatakan, jika Anda bekerja di basis kode yang sudah memiliki konvensi yang telah ditetapkan di sekitar hal-hal ini, saya pasti akan mengikuti untuk membantu basis kode tetap seragam ...
sumber
return
pernyataan, ia kembaliNone
.Ruby
danJavascript
mengambil pendekatan yang sama dengan python. Saya yakin ada beberapa contoh bahasa tingkat tinggi yang mengatakan "batal" dalam ekspresi tetapi saya tidak dapat memikirkannya saat ini (mungkin jika Anda mempertimbangkanJava
bahasa tingkat tinggi) ... Bagaimana menambal monyet fungsi (yang berguna untuk mengejek dalam pengujian antara lain) bekerja di dunia hipotetis di mana python mendapatvoid
kata kunci yang membuatnya jadi fungsi tidak mengembalikan apa pun? (Juga, seperti yang saya katakan sebelumnya, Anda tidak perlu meyakinkan saya bahwa ini adalah desain yang buruk. Saya tidak dapat melakukan apa pun meskipun Anda benar)Seperti yang lain menjawab, hasilnya persis sama,
None
dikembalikan dalam semua kasus.Perbedaannya adalah gaya, tetapi harap dicatat bahwa PEP8 mengharuskan penggunaan agar konsisten:
https://www.python.org/dev/peps/pep-0008/#programming-recomendations
Pada dasarnya, jika Anda pernah mengembalikan
None
nilai tidak dalam suatu fungsi, itu berarti nilai kembali memiliki makna dan dimaksudkan untuk ditangkap oleh penelepon. Jadi ketika Anda kembaliNone
, itu juga harus eksplisit, untuk menyampaikanNone
dalam kasus ini memiliki makna, itu adalah salah satu nilai pengembalian yang mungkin.Jika Anda tidak perlu kembali sama sekali, fungsi Anda pada dasarnya berfungsi sebagai prosedur alih-alih fungsi, jadi jangan sertakan
return
pernyataan itu.Jika Anda menulis fungsi seperti prosedur dan ada peluang untuk kembali lebih awal (yaitu Anda sudah selesai pada saat itu dan tidak perlu menjalankan sisa fungsi) Anda dapat menggunakan kosong dan
return
s untuk memberi sinyal kepada pembaca. itu hanyalah penyelesaian awal danNone
nilai yang dikembalikan secara implisit tidak memiliki arti dan tidak dimaksudkan untuk ditangkap (fungsi seperti prosedur selalu kembaliNone
pula).sumber
Dalam hal fungsionalitas, semuanya sama, perbedaan di antara keduanya terletak pada pembacaan dan gaya kode (yang penting untuk dipertimbangkan)
sumber