Pertanyaan Mengapa Python lambdas bermanfaat? [Tutup]


Saya mencoba mencari tahu python lambdas. Apakah lambda salah satu item bahasa "menarik" yang dalam kehidupan nyata harus dilupakan?

Saya yakin ada beberapa kasus tepi di mana mungkin diperlukan, tetapi mengingat ketidakjelasan itu, potensi itu diredefinisikan dalam rilis mendatang (asumsi saya berdasarkan berbagai definisi) dan kejelasan coding yang berkurang - haruskah itu dihindari?

Ini mengingatkan saya pada overflowing (buffer overflow) dari tipe C - menunjuk ke variabel teratas dan overloading untuk mengatur nilai field lainnya. Rasanya seperti semacam pertunjukkan teknik tetapi pemeliharaan coder mimpi buruk.


813
2018-05-20 20:40


asal


Jawaban:


Apa yang kau bicarakan fungsi lambda? Seperti

lambda x: x**2 + 2*x - 5

Hal-hal itu sebenarnya cukup berguna. Python mendukung gaya pemrograman yang disebut pemrograman fungsional di mana Anda dapat meneruskan fungsi ke fungsi lain untuk melakukan sesuatu. Contoh:

mult3 = filter(lambda x: x % 3 == 0, [1, 2, 3, 4, 5, 6, 7, 8, 9])

set mult3 untuk [3, 6, 9], unsur-unsur dari daftar asli yang kelipatan 3. Ini lebih pendek (dan, orang bisa berdebat, lebih jelas) daripada

def filterfunc(x):
    return x % 3 == 0
mult3 = filter(filterfunc, [1, 2, 3, 4, 5, 6, 7, 8, 9])

Tentu saja, dalam kasus khusus ini, Anda dapat melakukan hal yang sama dengan pemahaman daftar:

mult3 = [x for x in [1, 2, 3, 4, 5, 6, 7, 8, 9] if x % 3 == 0]

(atau bahkan sebagai range(3,10,3)), tetapi ada banyak kasus penggunaan lain yang lebih canggih di mana Anda tidak dapat menggunakan pemahaman daftar dan fungsi lambda mungkin merupakan cara terpendek untuk menulis sesuatu.

  • Mengembalikan fungsi dari fungsi lain

    >>> def transform(n):
    ...     return lambda x: x + n
    ...
    >>> f = transform(3)
    >>> f(4)
    7
    

    Ini sering digunakan untuk membuat pembungkus fungsi, seperti dekorator Python.

  • Menggabungkan unsur-unsur dari rangkaian iterable dengan reduce()

    >>> reduce(lambda a, b: '{}, {}'.format(a, b), [1, 2, 3, 4, 5, 6, 7, 8, 9])
    '1, 2, 3, 4, 5, 6, 7, 8, 9'
    
  • Menyortir berdasarkan kunci alternatif

    >>> sorted([1, 2, 3, 4, 5, 6, 7, 8, 9], key=lambda x: abs(5-x))
    [5, 4, 6, 3, 7, 2, 8, 1, 9]
    

Saya menggunakan fungsi lambda secara teratur. Butuh beberapa saat bagi saya untuk terbiasa dengan mereka, tetapi akhirnya saya mengerti bahwa mereka adalah bagian yang sangat berharga dari bahasa tersebut.


892
2018-05-20 20:52



lambda hanyalah cara mewah untuk mengatakan function. Selain namanya, tidak ada yang mengaburkan, mengintimidasi atau mengoceh tentang hal itu. Saat Anda membaca baris berikut, ganti lambda oleh function di dalam pikiranmu:

>>> f = lambda x: x + 1
>>> f(3)
4

Itu hanya mendefinisikan fungsi x. Beberapa bahasa lain, seperti R, katakan secara eksplisit:

> f = function(x) { x + 1 }
> f(3)
4

Kamu melihat? Ini adalah salah satu hal paling alami yang harus dilakukan dalam pemrograman.


322
2018-01-16 15:03



Ringkasan dua baris:

  1. Penutupan: Sangat berguna. Pelajari mereka, gunakan mereka, cintai mereka.
  2. Python lambda kata kunci: tidak perlu, terkadang berguna. Jika Anda menemukan diri Anda melakukan sesuatu yang rumit dengan itu, singkirkan dan definisikan fungsi sebenarnya.

93
2018-05-20 22:37



Lambda adalah bagian dari mekanisme abstraksi yang sangat penting yang berhubungan dengan fungsi rangka yang lebih tinggi. Untuk mendapatkan pemahaman yang tepat tentang nilainya, perhatikan pelajaran berkualitas tinggi dari Abelson dan Sussman, dan baca buku itu SICP

Ini adalah masalah yang relevan dalam bisnis perangkat lunak modern, dan menjadi semakin populer.


71
2018-05-20 20:49



Saya ragu lambda akan pergi. Lihat Pos Guido tentang akhirnya menyerah mencoba untuk menghapusnya. Juga lihat garis besar konflik.

Anda mungkin melihat posting ini untuk lebih banyak sejarah tentang kesepakatan di balik fitur-fitur fungsional Python: http://python-history.blogspot.com/2009/04/origins-of-pythons-functional-features.html

Anehnya, peta, filter, dan mengurangi fungsi yang awalnya memotivasi pengenalan lambda dan fitur fungsional lainnya untuk sebagian besar telah digantikan oleh pemahaman daftar dan ekspresi generator. Bahkan, fungsi mengurangi dihapus dari daftar fungsi builtin di Python 3.0. (Namun, Anda tidak perlu mengirimkan keluhan tentang penghapusan lambda, peta, atau filter: mereka menginap. :-)

Saya sendiri dua sen: Jarang lambda yang layak untuk kejelasan. Umumnya ada solusi yang lebih jelas yang tidak termasuk lambda.


57
2018-05-20 20:46



lambdas sangat berguna dalam pemrograman GUI. Misalnya, katakanlah Anda membuat sekelompok tombol dan Anda ingin menggunakan satu panggilan balik paramaterized daripada callback per tombol unik. Lambda memungkinkan Anda melakukannya dengan mudah:

for value in ["one","two","three"]:
    b = tk.Button(label=value, command=lambda arg=value: my_callback(arg))
    b.pack()

(Catatan: meskipun pertanyaan ini secara khusus bertanya tentang lambda, Anda juga bisa menggunakan functools.partial untuk mendapatkan hasil yang sama)

Alternatifnya adalah membuat callback terpisah untuk setiap tombol yang dapat menyebabkan duplikasi kode.


56
2018-04-24 16:48



Dengan Python, lambda hanya cara mendefinisikan fungsi sebaris,

a = lambda x: x + 1
print a(1)

dan..

def a(x): return x + 1
print a(1)

..are the tepat sama.

Tidak ada yang dapat Anda lakukan dengan lambda yang tidak dapat Anda lakukan dengan fungsi biasa — dalam fungsi Python adalah objek sama seperti yang lain, dan lambdas hanya mendefinisikan fungsi:

>>> a = lambda x: x + 1
>>> type(a)
<type 'function'>

Sejujurnya aku memikirkan itu lambda kata kunci berlebihan dalam Python - saya tidak pernah perlu menggunakannya (atau terlihat digunakan di mana fungsi biasa, daftar-pemahaman atau salah satu dari banyak fungsi builtin bisa lebih baik digunakan sebagai gantinya)

Untuk contoh yang benar-benar acak, dari artikel "Lambda Python rusak!":

Untuk melihat bagaimana lambda rusak, coba buat daftar fungsi fs=[f0,...,f9] dimana fi(n)=i+n. Percobaan pertama:

>>> fs = [(lambda n: i + n) for i in range(10)]
>>> fs[3](4)
13

Saya berpendapat, bahkan jika itu berhasil, sangat mengerikan dan "tidak memalukan", fungsi yang sama dapat ditulis dalam banyak cara lain, misalnya:

>>> n = 4
>>> [i + n for i in range(10)]
[4, 5, 6, 7, 8, 9, 10, 11, 12, 13]

Ya, itu tidak sama, tapi saya punya tak pernah melihat penyebab di mana menghasilkan sekelompok fungsi lambda dalam daftar telah diperlukan. Mungkin masuk akal dalam bahasa lain, tetapi Python bukan Haskell (atau Lisp, atau ...)

Harap dicatat bahwa kita dapat menggunakan lambda dan tetap mencapai yang diinginkan   hasil dengan cara ini:

>>> fs = [(lambda n,i=i: i + n) for i in range(10)]
>>> fs[3](4)
7

Edit:

Ada beberapa kasus di mana lambda berguna, misalnya sering kali nyaman ketika menghubungkan sinyal dalam aplikasi PyQt, seperti ini:

w = PyQt4.QtGui.QLineEdit()
w.textChanged.connect(lambda event: dothing())

Baru saja melakukan w.textChanged.connect(dothing) akan memanggil dothing metode dengan tambahan event argumen dan menyebabkan kesalahan. Menggunakan lambda berarti kita dapat dengan rapi menjatuhkan argumen tanpa harus mendefinisikan fungsi pembungkusan.


31
2018-05-21 02:03



Saya menemukan lambda berguna untuk daftar fungsi yang melakukan hal yang sama, tetapi untuk situasi yang berbeda. Seperti Aturan jamak Mozilla.

plural_rules = [
    lambda n: 'all',
    lambda n: 'singular' if n == 1 else 'plural',
    lambda n: 'singular' if 0 <= n <= 1 else 'plural',
    ...
]
# Call plural rule #1 with argument 4 to find out which sentence form to use.
plural_rule[1](4) # returns 'plural'

Jika Anda harus mendefinisikan fungsi untuk semua itu, Anda akan menjadi gila pada akhirnya. Juga tidak akan menyenangkan dengan nama-nama fungsi seperti plural_rule_1, plural_rule_2, dll. Dan Anda harus melakukannya eval() ketika Anda bergantung pada id fungsi variabel.


28
2018-01-16 15:43



Cukup banyak hal yang bisa Anda lakukan lambda Anda dapat melakukan lebih baik dengan fungsi yang bernama atau daftar dan ekspresi generator.

Akibatnya, untuk sebagian besar Anda hanya harus salah satu dari mereka pada dasarnya situasi apa pun (kecuali mungkin untuk kode awal yang ditulis dalam interpreter interaktif).


26
2018-05-20 20:45



Saya telah menggunakan Python selama beberapa tahun dan saya tidak pernah masuk ke kasus di mana saya sudah dibutuhkan lambda. Sungguh, sebagai tutorial menyatakan, itu hanya untuk gula sintaksis.


19
2018-05-20 20:47