Bạn có thể đưa ra một ví dụ và các ví dụ khác cho thấy khi nào và khi nào không sử dụng Lambda? Cuốn sách của tôi cho tôi các ví dụ, nhưng chúng gây nhầm lẫn."lambda" có nghĩa là gì trong Python, và cách đơn giản nhất để sử dụng nó là gì?
Trả lời
Lambda, có nguồn gốc từ Lambda Calculus và (AFAIK) lần đầu tiên được triển khai tại Lisp, về cơ bản là một chức năng ẩn danh - một chức năng mà không có một cái tên, và được sử dụng trong dòng, nói cách khác bạn có thể gán một định danh cho một hàm lambda trong một biểu thức đơn như vậy:
>>> addTwo = lambda x: x+2
>>> addTwo(2)
4
này gán addTwo
đến chức năng ẩn danh, mà chấp nhận 1 tham số x, và trong cơ thể chức năng nó sẽ thêm 2 đến x, nó sẽ trả về giá trị cuối cùng của biểu thức cuối cùng trong nội dung hàm do đó không có từ khóa return
.
Đoạn mã trên là tương đương với:
>>> def addTwo(x):
... return x+2
...
>>> addTwo(2)
4
Trừ bạn không sử dụng một định nghĩa hàm, bạn đang gán một định danh với lambda.
Nơi tốt nhất để sử dụng chúng là khi bạn không thực sự muốn xác định hàm có tên, có thể vì chức năng đó sẽ chỉ được sử dụng một lần và không nhiều lần, trong trường hợp này bạn sẽ tốt hơn tắt với định nghĩa hàm.
Ví dụ về một cây băm sử dụng lambdas:
>>> mapTree = {
... 'number': lambda x: x**x,
... 'string': lambda x: x[1:]
... }
>>> otype = 'number'
>>> mapTree[otype](2)
4
>>> otype = 'string'
>>> mapTree[otype]('foo')
'oo'
Trong ví dụ này, tôi thật sự không muốn xác định một tên cho một trong những chức năng bởi vì tôi sẽ chỉ sử dụng chúng trong băm, do đó tôi sẽ sử dụng lambdas.
Chỉ cần một ít nitpick nhỏ trên một câu trả lời khác tuyệt vời: lambda không ban đầu từ Lisp, mà là từ tính toán lambda. – phoebus
ah vâng, sai lầm của tôi khi sử dụng có nguồn gốc - tôi đã thực hiện một số chỉnh sửa. Bất cứ điều gì khác tôi nên thêm/sửa đổi? –
+1 Câu trả lời tuyệt vời, hãy xem xét thay đổi tên 'loại' trong ví dụ dict .. vì nó được xây dựng ... –
Tôi không biết bạn đang sử dụng cuốn sách nào, nhưng Dive into Python has a section mà tôi nghĩ là thông tin.
Trong năm 2017, không có trang web diveintopython.org bất cứ nơi nào trên World Wide Web! – Rexford
Sử dụng lambda là một loại kiểu. Khi bạn có thể lấy đi một hàm rất đơn giản, và thường là nơi bạn đang lưu trữ nó ở đâu đó (trong danh sách các chức năng có lẽ, hoặc trong cấu trúc dữ liệu bộ công cụ GUI, vv) mọi người cảm thấy lambda làm giảm sự lộn xộn trong mã của họ.
Trong Python, chỉ có thể tạo một lambda trả về một biểu thức duy nhất và lambda không thể mở rộng nhiều dòng (trừ khi bạn nối nhiều dòng bằng cách sử dụng dấu gạch chéo ngược-ở-cuối-của-dòng) lừa). Mọi người đã yêu cầu Python thêm các cải tiến cho lambda, nhưng nó đã không xảy ra. Như tôi đã hiểu, những thay đổi để làm cho lambda có thể viết bất kỳ hàm nào sẽ làm phức tạp đáng kể mã phân tích trong Python. Và, kể từ khi chúng tôi đã có def
để xác định một chức năng, lợi ích không được coi là giá trị biến chứng. Vì vậy, có một số trường hợp mà bạn có thể muốn sử dụng lambda, nơi nó không phải là có thể. Trong trường hợp đó, bạn chỉ có thể sử dụng một số điện thoại def
:
object1.register_callback_function(lambda x: x.foo() > 3)
def fn(x):
if x.foo() > 3:
x.recalibrate()
return x.value() > 9
elif x.bar() > 3:
x.do_something_else()
return x.other_value < 0
else:
x.whatever()
return True
object2.register_callback_function(fn)
del(fn)
Hàm gọi lại đầu tiên đơn giản và lambda đủ. Đối với thứ hai, nó chỉ đơn giản là không thể sử dụng một lambda. Chúng tôi đạt được hiệu quả tương tự bằng cách sử dụng def
và tạo đối tượng hàm được gắn với tên fn
và sau đó đi qua fn
đến register_callback_function()
. Sau đó, chỉ để hiển thị chúng tôi có thể, chúng tôi gọi số del()
vào tên fn
để hủy liên kết. Bây giờ tên fn
không còn bị ràng buộc với bất kỳ đối tượng nào, nhưng register_callback_function()
vẫn có tham chiếu đến đối tượng hàm để đối tượng hàm tồn tại.
- 1. Cách đơn giản nhất để SSH bằng Python là gì?
- 2. Cách đơn giản nhất để sao chép một tập lệnh python trong Linux là gì?
- 3. "Ràng buộc lambda" trong Python là gì?
- 4. Sử dụng lambda trong PHP là gì?
- 5. '~' có nghĩa là gì trong python?
- 6. Cách đơn giản nhất để giảm ngày trong Javascript là 1 ngày là gì?
- 7. Điều gì là sai với metaclass python đơn giản này?
- 8. Một đơn | hoặc & có nghĩa là gì?
- 9. Cách đơn giản nhất không tốn nhiều bộ nhớ để xuất XML từ Python là gì?
- 10. () có nghĩa là gì trong biểu thức lambda khi sử dụng Tác vụ?
- 11. Cách đơn giản nhất để thêm ảnh tiểu sử bằng Đá quý Omniauth-Facebook là gì?
- 12. Cách đơn giản nhất để xác định biến cục bộ trong Oracle là gì?
- 13. "\\. \", "\ ?? \", "\\? \", "\\" có nghĩa là gì?
- 14. Khung công tác WSGI đơn giản/nhẹ nhất là gì?
- 15. Lambda là gì?
- 16. Tuyên bố đối tượng có nghĩa là gì trong một lớp python và tôi có nên sử dụng nó không?
- 17. Cách tốt nhất để viết về cách viết một bộ x86 đơn giản là gì?
- 18. UrlReferrer có nghĩa là gì?
- 19. @AttributeOverride có nghĩa là gì?
- 20. AVMediaTypeMuxed có nghĩa là gì?
- 21. = * có nghĩa là gì?
- 22. {} có nghĩa là gì?
- 23. Cách đơn giản nhất để phân tích cú pháp JSON trong Scala là gì?
- 24. "() =>" có nghĩa là gì trong C#?
- 25. Hướng dẫn đơn giản để tạo cấu trúc gói Python và trứng là gì?
- 26. Cách đơn giản nhất để song song một tác vụ trong java là gì?
- 27. cổng zookeeper và cách sử dụng của nó là gì?
- 28. Strophe là gì và cách sử dụng nó với JQuery?
- 29. Cách đơn giản nhất cho các chương trình Clojure và Python để chia sẻ thông tin là gì?
- 30. Qt - QApplication là gì, đơn giản?
Phần nào của http://docs.python.org/tutorial/controlflow.html#lambda-forms gây nhầm lẫn hoặc không đầy đủ? Cuốn sách nào gây nhầm lẫn? Những phần nào của nó khó hiểu? –