Apa manfaat lambda di python?
Python dan bahasa lain seperti Java, C#, dan bahkan C++ memiliki fungsi lambda yang ditambahkan ke sintaksnya, sedangkan bahasa seperti LISP atau keluarga bahasa ML, Haskell, OCaml, dan F#, menggunakan lambdas sebagai konsep inti Show
Lambda Python kecil, fungsi anonim, tunduk pada sintaks yang lebih ketat tetapi lebih ringkas daripada fungsi Python biasa Di akhir artikel ini, Anda akan mengetahuinya
Catatan. Anda akan melihat beberapa contoh kode menggunakan 2 yang tampaknya secara terang-terangan mengabaikan praktik terbaik gaya Python. Ini hanya dimaksudkan untuk mengilustrasikan konsep kalkulus lambda atau untuk menyoroti kemampuan Python 2Contoh-contoh yang dipertanyakan itu akan dikontraskan dengan pendekatan atau alternatif yang lebih baik saat Anda melanjutkan artikel Tutorial ini terutama untuk pemrogram Python tingkat menengah hingga berpengalaman, tetapi dapat diakses oleh semua orang yang penasaran dengan minat dalam pemrograman dan kalkulus lambda Semua contoh yang disertakan dalam tutorial ini telah diuji dengan Python 3. 7 Ikuti Kuis. Uji pengetahuan Anda dengan kuis "Fungsi Python Lambda" interaktif kami. Setelah selesai Anda akan menerima skor sehingga Anda dapat melacak kemajuan belajar Anda dari waktu ke waktu Ikuti Kuis » Download Gratis. Dapatkan contoh bab dari Trik Python. Buku yang menunjukkan kepada Anda praktik terbaik Python dengan contoh sederhana yang dapat Anda terapkan secara instan untuk menulis kode + Pythonic yang lebih indah Kalkulus LambdaEkspresi Lambda dalam Python dan bahasa pemrograman lainnya berakar pada kalkulus lambda, model komputasi yang ditemukan oleh Alonzo Church. Anda akan mengetahui kapan kalkulus lambda diperkenalkan dan mengapa ini merupakan konsep dasar yang berakhir di ekosistem Python Hilangkan iklanSejarahGereja Alonzo memformalkan kalkulus lambda, sebuah bahasa yang didasarkan pada abstraksi murni, pada tahun 1930-an. Fungsi Lambda juga disebut sebagai abstraksi lambda, referensi langsung ke model abstraksi ciptaan asli Gereja Alonzo Kalkulus Lambda dapat menyandikan perhitungan apa pun. Ini Turing lengkap, tetapi bertentangan dengan konsep mesin Turing, itu murni dan tidak mempertahankan keadaan apa pun Bahasa fungsional berasal dari logika matematika dan kalkulus lambda, sedangkan bahasa pemrograman imperatif merangkul model perhitungan berbasis negara yang ditemukan oleh Alan Turing. Dua model komputasi, kalkulus lambda dan mesin Turing, dapat diterjemahkan satu sama lain. Persamaan ini dikenal sebagai hipotesis Church-Turing Bahasa fungsional secara langsung mewarisi filosofi kalkulus lambda, mengadopsi pendekatan deklaratif pemrograman yang menekankan abstraksi, transformasi data, komposisi, dan kemurnian (tanpa keadaan dan tanpa efek samping). Contoh bahasa fungsional termasuk Haskell, Lisp, atau Erlang Sebaliknya, Mesin Turing menghasilkan pemrograman imperatif yang ditemukan dalam bahasa seperti Fortran, C, atau Python Gaya imperatif terdiri dari pemrograman dengan pernyataan, menggerakkan aliran program langkah demi langkah dengan instruksi terperinci. Pendekatan ini mempromosikan mutasi dan membutuhkan status pengelolaan Pemisahan dalam kedua keluarga menghadirkan beberapa nuansa, karena beberapa bahasa fungsional memasukkan fitur imperatif, seperti OCaml, sementara fitur fungsional telah menembus keluarga bahasa imperatif khususnya dengan pengenalan fungsi lambda di Java, atau Python Python pada dasarnya bukanlah bahasa fungsional, tetapi ia mengadopsi beberapa konsep fungsional sejak awal. Pada bulan Januari 1994, _4, 5, 6, dan operator 2 ditambahkan ke bahasaContoh PertamaBerikut adalah beberapa contoh untuk memberi Anda selera untuk beberapa kode Python, gaya fungsional Fungsi identitas, fungsi yang mengembalikan argumennya, diekspresikan dengan definisi fungsi Python standar menggunakan kata kunci 8 sebagai berikut>>> _ _9 mengambil argumen 0 dan mengembalikannya saat berdoaSebaliknya, jika Anda menggunakan konstruksi lambda Python, Anda akan mendapatkan yang berikut >>> _Dalam contoh di atas, ekspresi terdiri dari
Catatan. Dalam konteks artikel ini, variabel terikat adalah argumen untuk fungsi lambda Sebaliknya, variabel bebas tidak terikat dan dapat direferensikan dalam isi ekspresi. Variabel bebas dapat berupa konstanta atau variabel yang didefinisikan dalam cakupan fungsi yang terlampir Anda dapat menulis contoh yang sedikit lebih rumit, sebuah fungsi yang menambahkan 4 ke argumen, sebagai berikut>>> _Anda dapat menerapkan fungsi di atas ke argumen dengan mengapit fungsi dan argumennya dengan tanda kurung >>> _Pengurangan adalah strategi kalkulus lambda untuk menghitung nilai ekspresi. Dalam contoh saat ini, terdiri dari mengganti variabel terikat 0 dengan argumen 6
Karena fungsi lambda adalah sebuah ekspresi, ia dapat diberi nama. Oleh karena itu Anda dapat menulis kode sebelumnya sebagai berikut >>> _Fungsi lambda di atas sama dengan menulis ini
Semua fungsi ini mengambil satu argumen. Anda mungkin telah memperhatikan bahwa, dalam definisi lambda, argumen tidak memiliki tanda kurung di sekitarnya. Fungsi multi-argumen (fungsi yang mengambil lebih dari satu argumen) diekspresikan dalam Python lambdas dengan mencantumkan argumen dan memisahkannya dengan koma ( 7) tetapi tanpa mengelilinginya dengan tanda kurung>>> _Fungsi lambda yang ditugaskan ke _8 mengambil dua argumen dan mengembalikan string yang menginterpolasi dua parameter 9 dan 0. Seperti yang diharapkan, definisi lambda mencantumkan argumen tanpa tanda kurung, sedangkan pemanggilan fungsi dilakukan persis seperti fungsi Python normal, dengan tanda kurung mengelilingi argumenHilangkan iklanFungsi AnonimIstilah berikut dapat digunakan secara bergantian tergantung pada jenis dan budaya bahasa pemrograman
Untuk sisa artikel ini setelah bagian ini, sebagian besar Anda akan melihat istilah fungsi lambda Secara harfiah, fungsi anonim adalah fungsi tanpa nama. Dengan Python, fungsi anonim dibuat dengan kata kunci 2. Lebih longgar, itu mungkin diberi nama atau tidak. Pertimbangkan fungsi anonim dua argumen yang didefinisikan dengan 2 tetapi tidak terikat pada variabel. Lambda tidak diberi nama>>> _Fungsi di atas mendefinisikan ekspresi lambda yang mengambil dua argumen dan mengembalikan jumlahnya Selain memberi Anda umpan balik bahwa Python baik-baik saja dengan formulir ini, itu tidak mengarah pada penggunaan praktis apa pun. Anda bisa menjalankan fungsi di juru bahasa Python >>> _Contoh di atas memanfaatkan fitur khusus juru bahasa interaktif yang disediakan melalui garis bawah ( 3). Lihat catatan di bawah untuk detail lebih lanjutAnda tidak dapat menulis kode serupa di modul Python. Pertimbangkan _3 dalam juru bahasa sebagai efek samping yang Anda manfaatkan. Dalam modul Python, Anda akan memberikan nama ke lambda, atau Anda akan meneruskan lambda ke suatu fungsi. Anda akan menggunakan kedua pendekatan tersebut nanti di artikel iniCatatan. Dalam interpreter interaktif, garis bawah tunggal ( 3) terikat pada ekspresi terakhir yang dievaluasiPada contoh di atas, _3 menunjuk ke fungsi lambda. Untuk detail lebih lanjut tentang penggunaan karakter khusus ini di Python, lihat Arti Garis Bawah di PythonPola lain yang digunakan dalam bahasa lain seperti JavaScript adalah dengan segera mengeksekusi fungsi lambda Python. Ini dikenal sebagai Ekspresi Fungsi yang Segera Dipanggil (IIFE, lafalkan "rapuh"). Ini sebuah contoh >>> 0Fungsi lambda di atas didefinisikan dan kemudian langsung dipanggil dengan dua argumen ( 6 dan 8). Itu mengembalikan nilai _9, yang merupakan jumlah dari argumenBeberapa contoh dalam tutorial ini menggunakan format ini untuk menyorot aspek anonim dari fungsi lambda dan menghindari fokus pada 2 dengan Python sebagai cara yang lebih singkat untuk mendefinisikan fungsiPython tidak menganjurkan penggunaan ekspresi lambda yang langsung dipanggil. Itu hanya hasil dari ekspresi lambda yang bisa dipanggil, tidak seperti badan fungsi normal Fungsi Lambda sering digunakan dengan fungsi tingkat tinggi, yang menggunakan satu atau beberapa fungsi sebagai argumen atau mengembalikan satu atau beberapa fungsi Fungsi lambda bisa menjadi fungsi tingkat tinggi dengan mengambil fungsi (normal atau lambda) sebagai argumen seperti pada contoh buatan berikut >>> 1Python memaparkan fungsi tingkat tinggi sebagai fungsi bawaan atau di pustaka standar. Contohnya termasuk 4, 5, 3, serta fungsi utama seperti 4, 5, 6, dan 7. Anda akan menggunakan fungsi lambda bersama dengan fungsi tingkat tinggi Python diHilangkan iklanPython Lambda dan Fungsi RegulerKutipan dari FAQ Desain dan Sejarah Python ini tampaknya mengatur nada tentang ekspektasi keseluruhan terkait penggunaan fungsi lambda di Python
Namun demikian, jangan biarkan pernyataan ini menghalangi Anda menggunakan 2 Python. Sekilas, Anda mungkin menerima bahwa fungsi lambda adalah fungsi dengan beberapa gula sintaksis yang memperpendek kode untuk mendefinisikan atau memanggil fungsi. Bagian berikut menyoroti kesamaan dan perbedaan kecil antara fungsi Python normal dan fungsi lambdaFungsiPada titik ini, Anda mungkin bertanya-tanya apa yang secara mendasar membedakan fungsi lambda yang terikat pada variabel dari fungsi biasa dengan satu baris 9. di bawah permukaan, hampir tidak ada. Mari kita verifikasi bagaimana Python melihat fungsi yang dibuat dengan pernyataan pengembalian tunggal versus fungsi yang dibuat sebagai ekspresi ( 2)Modul _01 memperlihatkan fungsi untuk menganalisis kode byte Python yang dihasilkan oleh kompiler Python>>> 2Anda dapat melihat bahwa _02 memaparkan versi bytecode Python yang dapat dibaca yang memungkinkan pemeriksaan instruksi tingkat rendah yang akan digunakan juru bahasa Python saat menjalankan programSekarang lihat dengan objek fungsi biasa >>> 3Bytecode yang ditafsirkan oleh Python sama untuk kedua fungsi. Tetapi Anda mungkin memperhatikan bahwa penamaannya berbeda. nama fungsi adalah _03 untuk fungsi yang didefinisikan dengan 8, sedangkan fungsi lambda Python dilihat sebagai 2Melacak kembaliAnda melihat di bagian sebelumnya bahwa, dalam konteks fungsi lambda, Python tidak memberikan nama fungsi, tetapi hanya 06. Ini bisa menjadi batasan untuk dipertimbangkan saat terjadi pengecualian, dan traceback hanya menampilkan 06>>> 4Pelacakan balik pengecualian yang muncul saat fungsi lambda dijalankan hanya mengidentifikasi fungsi yang menyebabkan pengecualian sebagai 06Berikut pengecualian yang sama yang diajukan oleh fungsi normal >>> 5Fungsi normal menyebabkan kesalahan serupa tetapi menghasilkan traceback yang lebih tepat karena memberikan nama fungsi, 09SintaksisSeperti yang Anda lihat di bagian sebelumnya, bentuk lambda menghadirkan perbedaan sintaksis dari fungsi normal. Secara khusus, fungsi lambda memiliki karakteristik sebagai berikut
Tidak Ada Pernyataan Fungsi lambda tidak dapat berisi pernyataan apa pun. Dalam fungsi lambda, pernyataan seperti _9, 11, 12, atau 13 akan memunculkan pengecualian 14. Berikut adalah contoh menambahkan _12 ke badan lambda>>> 6Contoh yang dibuat-buat ini dimaksudkan untuk _12 bahwa parameter 0 memiliki nilai 6. Namun, penerjemah mengidentifikasi _14 saat mengurai kode yang melibatkan pernyataan 12 di badan 2Ekspresi Tunggal Berbeda dengan fungsi normal, fungsi lambda Python adalah ekspresi tunggal. Meskipun, dalam isi _2, Anda dapat menyebarkan ekspresi ke beberapa baris menggunakan tanda kurung atau string multibaris, ekspresi tetap menjadi ekspresi tunggal>>> 7Contoh di atas mengembalikan string _23 saat argumen lambda ganjil, dan 24 saat argumen genap. Itu menyebar di dua baris karena terkandung dalam satu set tanda kurung, tetapi tetap satu ekspresiKetik Anotasi Jika Anda sudah mulai mengadopsi petunjuk tipe, yang sekarang tersedia di Python, maka Anda memiliki alasan bagus lainnya untuk memilih fungsi normal daripada fungsi lambda Python. Lihat untuk mempelajari lebih lanjut tentang petunjuk tipe Python dan pengecekan tipe. Dalam fungsi lambda, tidak ada padanan untuk yang berikut ini _8Kesalahan jenis apa pun dengan _25 dapat ditangkap oleh alat seperti 26 atau 27, sedangkan 14 dengan fungsi lambda yang setara dimunculkan saat runtime>>> 9Seperti mencoba memasukkan pernyataan dalam lambda, menambahkan anotasi jenis segera menghasilkan 14 saat runtimeIIFE Anda telah melihat beberapa contoh eksekusi fungsi yang langsung dipanggil >>> 0Di luar juru bahasa Python, fitur ini mungkin tidak digunakan dalam praktik. Ini adalah konsekuensi langsung dari fungsi lambda yang dapat dipanggil seperti yang didefinisikan. Misalnya, ini memungkinkan Anda meneruskan definisi ekspresi lambda Python ke fungsi tingkat tinggi seperti 4, 5, atau 3, atau ke fungsi kunciHilangkan iklanArgumenSeperti objek fungsi normal yang didefinisikan dengan _8, ekspresi lambda Python mendukung semua cara berbeda untuk menyampaikan argumen. Ini termasuk
Contoh berikut mengilustrasikan opsi yang terbuka untuk Anda guna meneruskan argumen ke ekspresi lambda >>> 1DekoratorDi Python, dekorator adalah implementasi dari pola yang memungkinkan penambahan perilaku ke fungsi atau kelas. Biasanya diekspresikan dengan sintaks _34 yang mengawali sebuah fungsi. Ini contoh yang dibuat-buat 2Pada contoh di atas, 35 adalah fungsi yang menambahkan perilaku ke 36, sehingga memanggil 37 menghasilkan keluaran berikut _3 _36 hanya mencetak 39, tetapi dekorator menambahkan perilaku tambahan yang juga mencetak 40Dekorator dapat diterapkan ke lambda. Meskipun tidak mungkin untuk menghias lambda dengan sintaks 34, dekorator hanyalah sebuah fungsi, sehingga dapat memanggil fungsi lambda 4 _42, dihiasi dengan 43 pada baris 11, dipanggil dengan argumen 8 pada baris 15. Sebaliknya, pada baris 18, fungsi lambda segera dilibatkan dan disematkan dalam panggilan ke 45, dekorator. Ketika Anda menjalankan kode di atas, Anda mendapatkan yang berikut ini 5Lihat bagaimana, seperti yang telah Anda lihat, nama fungsi lambda muncul sebagai 06, sedangkan 47 diidentifikasi dengan jelas untuk fungsi normalMendekorasi fungsi lambda dengan cara ini dapat berguna untuk tujuan debug, mungkin untuk men-debug perilaku fungsi lambda yang digunakan dalam konteks fungsi tingkat tinggi atau fungsi kunci. Mari kita lihat contoh dengan 4 6Argumen pertama dari 4 adalah lambda yang mengalikan argumennya dengan 6. Lambda ini dihiasi dengan _45. Saat dieksekusi, contoh di atas menghasilkan yang berikut ini 7Hasilnya _52 adalah daftar yang diperoleh dari mengalikan setiap elemen dari 53. Untuk saat ini, pertimbangkan _53 setara dengan daftar 55Anda akan melihat _4 secara lebih rinci diLambda juga bisa menjadi dekorator, tetapi tidak disarankan. Jika Anda merasa perlu melakukan ini, konsultasikan Untuk informasi lebih lanjut tentang dekorator Python, lihat Primer tentang Dekorator Python Hilangkan iklanPenutupPenutupan adalah fungsi di mana setiap variabel bebas, semuanya kecuali parameter, yang digunakan dalam fungsi itu terikat pada nilai tertentu yang ditentukan dalam lingkup terlampir dari fungsi itu. Akibatnya, penutupan menentukan lingkungan di mana mereka berjalan, dan dapat dipanggil dari mana saja Konsep lambda dan closure tidak harus terkait, meskipun fungsi lambda bisa menjadi closure dengan cara yang sama seperti fungsi normal juga bisa menjadi closure. Beberapa bahasa memiliki konstruksi khusus untuk penutupan atau lambda (misalnya, Groovy dengan blok kode anonim sebagai objek Penutupan), atau ekspresi lambda (misalnya, ekspresi Java Lambda dengan opsi terbatas untuk penutupan) Inilah penutupan yang dibangun dengan fungsi Python normal 8 _57 mengembalikan 58, fungsi bersarang yang menghitung jumlah dari tiga argumen
Untuk menguji perilaku _57 dan 58, 57 dipanggil tiga kali dalam 68 loop yang mencetak berikut ini _9Pada baris 9 kode, _58 dikembalikan dengan permintaan 57 terikat dengan nama 71. Pada baris 5, _58 menangkap 0 dan 61 karena ia memiliki akses ke lingkungan embeddingnya, sedemikian rupa sehingga setelah pemanggilan penutupan, ia dapat beroperasi pada dua variabel bebas 0 dan 61Demikian pula, 2 juga bisa menjadi penutup. Ini contoh yang sama dengan fungsi lambda Python _0Ketika Anda mengeksekusi kode di atas, Anda mendapatkan output berikut _1Pada baris 6, _57 mengembalikan lambda dan menugaskannya ke variabel 71. Pada baris 3, isi fungsi lambda mereferensikan 0 dan 61. Variabel _61 tersedia pada waktu definisi, sedangkan 0 didefinisikan pada waktu proses ketika 57 dipanggilDalam situasi ini, baik fungsi normal maupun lambda berperilaku serupa. Di bagian selanjutnya, Anda akan melihat situasi di mana perilaku lambda dapat menipu karena waktu evaluasinya (waktu definisi vs waktu proses) Waktu EvaluasiDalam beberapa situasi yang melibatkan perulangan, perilaku fungsi lambda Python sebagai penutup mungkin berlawanan dengan intuisi. Ini membutuhkan pemahaman ketika variabel bebas terikat dalam konteks lambda. Contoh berikut menunjukkan perbedaan saat menggunakan fungsi biasa vs menggunakan lambda Python Uji skenario terlebih dahulu menggunakan fungsi reguler >>> 2Dalam fungsi normal, 85 dievaluasi pada waktu definisi, pada baris 9, saat fungsi ditambahkan ke daftar. _86Sekarang, dengan penerapan logika yang sama dengan fungsi lambda, amati perilaku yang tidak terduga >>> 3Hasil tak terduga terjadi karena variabel bebas 85, seperti yang diterapkan, terikat pada waktu eksekusi ekspresi lambda. Fungsi lambda Python pada baris 4 adalah penutupan yang menangkap 85, variabel bebas terikat saat runtime. Saat runtime, saat menjalankan fungsi 89 pada baris 7, nilai 85 adalah 91Untuk mengatasi masalah ini, Anda dapat menetapkan variabel bebas pada waktu definisi sebagai berikut >>> 4Fungsi lambda Python berperilaku seperti fungsi normal sehubungan dengan argumen. Oleh karena itu, parameter lambda dapat diinisialisasi dengan nilai default. parameter _85 mengambil 85 luar sebagai nilai default. Fungsi lambda Python dapat ditulis sebagai 94 dan memiliki hasil yang samaFungsi lambda Python dipanggil tanpa argumen apa pun pada baris 7, dan menggunakan nilai default 85 yang ditetapkan pada waktu definisiHilangkan iklanMenguji LambdaPython lambda dapat diuji dengan cara yang mirip dengan fungsi biasa. Anda dapat menggunakan _96 dan 97 _96Modul _96 menangani fungsi lambda Python mirip dengan fungsi biasa _5 00 mendefinisikan kasus pengujian dengan tiga metode pengujian, masing-masing menggunakan skenario pengujian untuk 01 diimplementasikan sebagai fungsi lambda. Eksekusi file Python _02 yang berisi 00 menghasilkan yang berikut _6Seperti yang diharapkan, kami memiliki dua kasus uji yang berhasil dan satu kegagalan untuk 04. hasilnya adalah _9, tetapi hasil yang diharapkan adalah 06. Kegagalan ini disebabkan oleh kesalahan yang disengaja dalam kasus uji. Mengubah hasil yang diharapkan dari _06 menjadi 9 akan memenuhi semua tes untuk 00 _97Modul _97 mengekstraksi kode Python interaktif dari 12 untuk menjalankan tes. Meskipun sintaks fungsi lambda Python tidak mendukung 12 tipikal, dimungkinkan untuk menetapkan string ke elemen 14 dari lambda bernama _7 _97 dalam komentar dokumen lambda 01 menjelaskan kasus uji yang sama seperti di bagian sebelumnyaSaat Anda menjalankan tes melalui _17, Anda mendapatkan yang berikut ini _8Hasil pengujian yang gagal dari kegagalan yang sama dijelaskan dalam pelaksanaan pengujian unit di bagian sebelumnya Anda dapat menambahkan _12 ke lambda Python melalui penugasan ke 14 untuk mendokumentasikan fungsi lambda. Meskipun memungkinkan, sintaks Python lebih baik mengakomodasi 12 untuk fungsi normal daripada fungsi lambdaUntuk ikhtisar komprehensif pengujian unit dengan Python, Anda mungkin ingin merujuk ke Memulai Pengujian dengan Python Penyalahgunaan Ekspresi LambdaBeberapa contoh dalam artikel ini, jika ditulis dalam konteks kode Python profesional, akan memenuhi syarat sebagai penyalahgunaan Jika Anda menemukan diri Anda mencoba mengatasi sesuatu yang tidak didukung oleh ekspresi lambda, ini mungkin merupakan tanda bahwa fungsi normal akan lebih cocok. _12 untuk ekspresi lambda di bagian sebelumnya adalah contoh yang bagus. Mencoba mengatasi fakta bahwa fungsi lambda Python tidak mendukung pernyataan adalah tanda bahaya lainnyaBagian selanjutnya mengilustrasikan beberapa contoh penggunaan lambda yang harus dihindari. Contoh-contoh itu mungkin situasi di mana, dalam konteks Python lambda, kode menunjukkan pola berikut
Meningkatkan PengecualianMencoba memunculkan pengecualian dalam Python lambda seharusnya membuat Anda berpikir dua kali. Ada beberapa cara cerdas untuk melakukannya, tetapi bahkan hal seperti berikut ini sebaiknya dihindari >>> 9Karena sebuah pernyataan tidak benar secara sintaksis dalam tubuh lambda Python, solusi pada contoh di atas terdiri dari mengabstraksi panggilan pernyataan dengan fungsi khusus 22. Menggunakan jenis solusi ini harus dihindari. Jika Anda menemukan jenis kode ini, Anda harus mempertimbangkan untuk memfaktorkan ulang kode untuk menggunakan fungsi biasaGaya samarSeperti dalam bahasa pemrograman apa pun, Anda akan menemukan kode Python yang sulit dibaca karena gaya yang digunakan. Fungsi Lambda, karena keringkasannya, dapat mendukung penulisan kode yang sulit dibaca Contoh lambda berikut berisi beberapa pilihan gaya yang buruk >>> 0Garis bawah ( 3) mengacu pada variabel yang tidak perlu Anda rujuk secara eksplisit. Namun dalam contoh ini, tiga _3 mengacu pada variabel yang berbeda. Pembaruan awal untuk kode lambda ini bisa berupa nama variabel>>> 1Memang, masih sulit untuk dibaca. Dengan tetap memanfaatkan _2, fungsi reguler akan membuat kode ini lebih mudah dibaca, menyebarkan logika ke beberapa baris dan pemanggilan fungsi>>> 2Ini masih belum optimal tetapi menunjukkan kepada Anda kemungkinan jalur untuk membuat kode, dan fungsi lambda Python khususnya, lebih mudah dibaca. Di , Anda akan belajar mengganti 4 dan 2 dengan pemahaman daftar atau ekspresi generator. Ini secara drastis akan meningkatkan keterbacaan kodeKelas PythonAnda bisa tetapi tidak boleh menulis metode kelas sebagai fungsi lambda Python. Contoh berikut adalah kode Python yang benar-benar legal tetapi memperlihatkan kode Python yang tidak konvensional yang mengandalkan 2. Misalnya, alih-alih mengimplementasikan _29 sebagai fungsi biasa, ia menggunakan 2. Demikian pula, 31 dan 32 juga diimplementasikan dengan fungsi lambda, bukan fungsi biasa atau dekorator _3Menjalankan alat seperti 33, alat penerapan panduan gaya, akan menampilkan kesalahan berikut untuk 29 dan 35 _4Meskipun _33 tidak menunjukkan masalah penggunaan fungsi lambda Python di properti, mereka sulit dibaca dan rentan terhadap kesalahan karena penggunaan banyak string seperti 37 dan 38Implementasi yang tepat dari _29 diharapkan sebagai berikut _5 31 akan ditulis sebagai berikut _6Sebagai aturan umum, dalam konteks kode yang ditulis dengan Python, lebih suka fungsi reguler daripada ekspresi lambda. Meskipun demikian, ada beberapa kasus yang mendapat manfaat dari sintaks lambda, seperti yang akan Anda lihat di bagian selanjutnya Hilangkan iklanPenggunaan Ekspresi Lambda yang TepatLambdas dengan Python cenderung menjadi subyek kontroversi. Beberapa argumen yang menentang lambda di Python adalah
Terlepas dari perdebatan sengit yang mempertanyakan keberadaan fitur ini di Python, fungsi lambda memiliki properti yang terkadang memberikan nilai pada bahasa Python dan pengembang Contoh berikut mengilustrasikan skenario di mana penggunaan fungsi lambda tidak hanya cocok tetapi juga dianjurkan dalam kode Python Konstruksi Fungsional KlasikFungsi Lambda biasanya digunakan dengan fungsi bawaan dan , serta , diekspos dalam modul 45. Tiga contoh berikut adalah masing-masing ilustrasi penggunaan fungsi tersebut dengan ekspresi lambda sebagai pengiring>>> 7Anda mungkin harus membaca kode yang mirip dengan contoh di atas, meskipun dengan data yang lebih relevan. Oleh karena itu, penting untuk mengenali konstruksi tersebut. Namun demikian, konstruksi tersebut memiliki alternatif setara yang dianggap lebih Pythonic. Di , Anda akan mempelajari cara mengonversi fungsi tingkat tinggi dan lambda yang menyertainya ke dalam bentuk lain yang lebih idiomatis Fungsi utamaFungsi kunci di Python adalah fungsi tingkat tinggi yang menggunakan parameter 46 sebagai argumen bernama. 46 menerima fungsi yang dapat berupa 2. Fungsi ini secara langsung memengaruhi algoritme yang didorong oleh fungsi kunci itu sendiri. Berikut adalah beberapa fungsi utama
Bayangkan Anda ingin mengurutkan daftar ID yang direpresentasikan sebagai string. Setiap ID adalah gabungan dari string 56 dan nomor. Menyortir daftar ini dengan fungsi bawaan 5, secara default, menggunakan urutan leksikografis karena elemen dalam daftar adalah stringUntuk memengaruhi eksekusi pengurutan, Anda dapat menetapkan lambda ke argumen bernama 46, sehingga pengurutan akan menggunakan nomor yang terkait dengan ID>>> ________19______8 Kerangka UIKerangka kerja UI seperti Tkinter, wxPython, atau. .NET Windows Forms dengan IronPython memanfaatkan fungsi lambda untuk tindakan pemetaan sebagai respons terhadap peristiwa UI Program Tkinter yang naif di bawah ini menunjukkan penggunaan 2 yang ditugaskan ke perintah tombol Reverse _9Mengklik tombol Membalikkan mengaktifkan peristiwa yang memicu fungsi lambda, mengubah label dari Kalkulus Lambda menjadi suluclaC adbmaL* Baik wxPython dan IronPython di. Platform .NET berbagi pendekatan serupa untuk menangani acara. Perhatikan bahwa _2 adalah salah satu cara untuk menangani peristiwa pengaktifan, tetapi suatu fungsi dapat digunakan untuk tujuan yang sama. Itu akhirnya menjadi mandiri dan kurang bertele-tele untuk menggunakan 2 ketika jumlah kode yang dibutuhkan sangat singkatUntuk menjelajahi wxPython, lihat Cara Membangun Aplikasi GUI Python Dengan wxPython Hilangkan iklanPenerjemah PythonSaat Anda bermain dengan kode Python di interpreter interaktif, fungsi lambda Python seringkali merupakan berkah. Sangat mudah untuk membuat fungsi one-liner cepat untuk menjelajahi beberapa potongan kode yang tidak akan pernah terungkap di luar penerjemah. Lambda yang tertulis di penerjemah, demi penemuan yang cepat, seperti kertas bekas yang dapat Anda buang setelah digunakan >>> lambda x: x + 1 _62Dalam semangat yang sama seperti percobaan dalam juru bahasa Python, modul 62 menyediakan fungsi untuk mengatur waktu fragmen kode kecil. 64 khususnya dapat dipanggil secara langsung, meneruskan beberapa kode Python dalam sebuah string. Ini sebuah contoh>>> 0Saat pernyataan diteruskan sebagai string, 65 membutuhkan konteks lengkap. Dalam contoh di atas, ini disediakan oleh argumen kedua yang mengatur lingkungan yang dibutuhkan oleh fungsi utama untuk diatur waktunya. Tidak melakukannya akan memunculkan pengecualian _66Pendekatan lain adalah dengan menggunakan 2>>> 1Solusi ini lebih bersih, lebih mudah dibaca, dan lebih cepat mengetikkan juru bahasa. Meskipun waktu eksekusi sedikit lebih singkat untuk versi 2, menjalankan kembali fungsi mungkin menunjukkan sedikit keuntungan untuk versi 69. Waktu eksekusi _70 dikecualikan dari keseluruhan waktu eksekusi dan tidak akan berdampak pada hasilMenambal MonyetUntuk pengujian, terkadang perlu bergantung pada hasil yang dapat diulang, meskipun selama eksekusi normal perangkat lunak tertentu, hasil yang sesuai diharapkan berbeda, atau bahkan benar-benar acak Katakanlah Anda ingin menguji fungsi yang, saat runtime, menangani nilai acak. Namun, selama eksekusi pengujian, Anda perlu menegaskan terhadap nilai yang dapat diprediksi secara berulang. Contoh berikut menunjukkan bagaimana, dengan fungsi 2, patch monyet dapat membantu Anda 2Manajer konteks membantu mengisolasi operasi monyet menambal fungsi dari perpustakaan standar (, dalam contoh ini). Fungsi lambda yang ditetapkan ke _73 menggantikan perilaku default dengan mengembalikan nilai statisIni memungkinkan pengujian fungsi apa pun yang bergantung pada _74 dengan cara yang dapat diprediksi. Sebelum keluar dari manajer konteks, perilaku default 74 dibangun kembali untuk menghilangkan efek samping tak terduga yang akan memengaruhi area pengujian lainnya yang mungkin bergantung pada perilaku default 74Kerangka pengujian unit seperti _96 dan 78 membawa konsep ini ke tingkat kecanggihan yang lebih tinggiDengan _78, masih menggunakan fungsi 2, contoh yang sama menjadi lebih elegan dan ringkas 3Dengan perlengkapan _81 pytest, 73 ditimpa dengan lambda yang akan mengembalikan nilai deterministik, 83, memungkinkan untuk memvalidasi tes. Fixture 81 pytest memungkinkan Anda untuk mengontrol ruang lingkup penggantian. Dalam contoh di atas, memanggil 73 dalam pengujian berikutnya, tanpa menggunakan patching monyet, akan menjalankan implementasi normal dari fungsi iniMenjalankan tes _78 memberikan hasil sebagai berikut 4Tes lulus saat kami memvalidasi bahwa 87 dilakukan, dan hasilnya adalah yang diharapkan dalam konteks tesHilangkan iklanAlternatif untuk LambdasMeskipun ada alasan bagus untuk menggunakan 2, ada beberapa kasus di mana penggunaannya tidak disukai. Jadi apa saja alternatifnya?Fungsi tingkat tinggi seperti 4, 5, dan 3 dapat diubah menjadi bentuk yang lebih elegan dengan sedikit sentuhan kreativitas, khususnya dengan pemahaman daftar atau ekspresi generatorUntuk mempelajari lebih lanjut tentang pemahaman daftar, lihat Kapan Menggunakan Pemahaman Daftar dengan Python. Untuk mempelajari lebih lanjut tentang ekspresi generator, lihat Cara Menggunakan Generator dan menghasilkan dengan Python PetaFungsi bawaan 4 mengambil fungsi sebagai argumen pertama dan menerapkannya ke setiap elemen argumen kedua, sebuah iterable. Contoh iterables adalah string, list, dan tuple. Untuk informasi lebih lanjut tentang iterables dan iterator, lihat Iterables dan Iterators 4 mengembalikan iterator yang sesuai dengan koleksi yang diubah. Sebagai contoh, jika Anda ingin mengubah daftar string menjadi daftar baru dengan setiap string dikapitalisasi, Anda dapat menggunakan 4, sebagai berikut>>> 5Anda perlu memanggil _95 untuk mengonversi iterator yang dikembalikan oleh 4 menjadi daftar yang diperluas yang dapat ditampilkan di juru bahasa Shell PythonMenggunakan pemahaman daftar menghilangkan kebutuhan untuk mendefinisikan dan menjalankan fungsi lambda >>> 6SaringFungsi bawaan 5, konstruksi fungsional klasik lainnya, dapat diubah menjadi pemahaman daftar. Dibutuhkan predikat sebagai argumen pertama dan iterable sebagai argumen kedua. Itu membangun iterator yang berisi semua elemen koleksi awal yang memenuhi fungsi predikat. Berikut adalah contoh yang memfilter semua bilangan genap dalam daftar bilangan bulat tertentu>>> ________20______7 Perhatikan bahwa _5 mengembalikan iterator, oleh karena itu kebutuhan untuk memanggil tipe bawaan 99 yang membuat daftar dengan iteratorImplementasi yang memanfaatkan konstruksi pemahaman daftar memberikan yang berikut ini >>> ________20______8 MengurangiSejak Python 3, _6 telah berubah dari fungsi bawaan menjadi fungsi modul 45. Sebagai 4 dan 5, dua argumen pertamanya masing-masing adalah fungsi dan iterable. Ini juga dapat mengambil penginisialisasi sebagai argumen ketiga yang digunakan sebagai nilai awal dari akumulator yang dihasilkan. Untuk setiap elemen iterable, 6 menerapkan fungsi dan mengakumulasi hasil yang dikembalikan saat iterable habisUntuk menerapkan _6 ke daftar pasangan dan menghitung jumlah item pertama dari setiap pasangan, Anda dapat menulis ini>>> ________20______9 Pendekatan yang lebih idiomatis menggunakan ekspresi generator, sebagai argumen untuk 06 dalam contoh, adalah sebagai berikut>>> 0Solusi yang sedikit berbeda dan mungkin lebih bersih menghilangkan kebutuhan untuk mengakses elemen pertama dari pasangan secara eksplisit dan sebagai gantinya menggunakan pembongkaran >>> 1Penggunaan garis bawah ( _3) adalah konvensi Python yang menunjukkan bahwa Anda dapat mengabaikan nilai kedua dari pasangan _06 mengambil argumen unik, sehingga ekspresi generator tidak perlu dalam tanda kurungApakah Lambdas Pythonic atau Tidak?PEP 8, yang merupakan panduan gaya untuk kode Python, berbunyi
Ini sangat tidak menyarankan penggunaan lambda yang terikat pada pengenal, terutama di mana fungsi harus digunakan dan memiliki lebih banyak manfaat. PEP 8 tidak menyebutkan penggunaan lain dari 2. Seperti yang telah Anda lihat di bagian sebelumnya, fungsi lambda mungkin memiliki kegunaan yang baik, meskipun terbatasCara yang mungkin untuk menjawab pertanyaan adalah bahwa fungsi lambda sempurna Pythonic jika tidak ada lagi Pythonic yang tersedia. Saya menghindari mendefinisikan apa arti "Pythonic", memberi Anda definisi yang paling sesuai dengan pola pikir Anda, serta gaya pengkodean pribadi atau tim Anda Di luar cakupan sempit Python _2, Cara Menulis Kode Python yang Indah Dengan PEP 8 adalah sumber yang bagus yang mungkin ingin Anda periksa mengenai gaya kode di PythonKesimpulanAnda sekarang tahu cara menggunakan fungsi 2 Python dan bisa
Jika Anda menyukai matematika, Anda mungkin bersenang-senang menjelajahi dunia kalkulus lambda yang menakjubkan Lambda python seperti garam. Sedikit spam, ham, dan telur Anda akan meningkatkan rasa, tetapi terlalu banyak akan merusak hidangan Ikuti Kuis. Uji pengetahuan Anda dengan kuis "Fungsi Python Lambda" interaktif kami. Setelah selesai Anda akan menerima skor sehingga Anda dapat melacak kemajuan belajar Anda dari waktu ke waktu Ikuti Kuis » Catatan. Bahasa pemrograman Python, dinamai Monty Python, lebih suka menggunakan 12, 13, dan 14 sebagai variabel metasyntactic, bukan 15 tradisional, 16, dan 17Tandai sebagai Selesai Tonton Sekarang Tutorial ini memiliki kursus video terkait yang dibuat oleh tim Real Python. Tonton bersama dengan tutorial tertulis untuk memperdalam pemahaman Anda. Cara Menggunakan Fungsi Python Lambda 🐍 Trik Python 💌 Dapatkan Trik Python singkat & manis yang dikirim ke kotak masuk Anda setiap beberapa hari. Tidak pernah ada spam. Berhenti berlangganan kapan saja. Dikuratori oleh tim Real Python Kirimi Saya Trik Python » Tentang Andre Burgaud Andre adalah seorang insinyur perangkat lunak berpengalaman yang bersemangat tentang teknologi dan bahasa pemrograman, khususnya, Python » Lebih lanjut tentang AndreSetiap tutorial di Real Python dibuat oleh tim pengembang sehingga memenuhi standar kualitas tinggi kami. Anggota tim yang mengerjakan tutorial ini adalah Aldren Jon Joanna Master Keterampilan Python Dunia Nyata Dengan Akses Tanpa Batas ke Python Nyata Bergabunglah dengan kami dan dapatkan akses ke ribuan tutorial, kursus video langsung, dan komunitas pakar Pythonista Tingkatkan Keterampilan Python Anda » Guru Keterampilan Python Dunia Nyata Bergabunglah dengan kami dan dapatkan akses ke ribuan tutorial, kursus video langsung, dan komunitas ahli Pythonista Tingkatkan Keterampilan Python Anda » Bagaimana menurutmu? Nilai artikel ini Tweet Bagikan Bagikan EmailApa takeaway # 1 Anda atau hal favorit yang Anda pelajari? Kiat Berkomentar. Komentar yang paling berguna adalah yang ditulis dengan tujuan belajar dari atau membantu siswa lain. dan dapatkan jawaban atas pertanyaan umum di portal dukungan kami |