Hướng dẫn call lambda function python - gọi hàm lambda python
Tìm hiểu cách sử dụng Lambda Function trong PythonLambda trong python là anonymous function, cú pháp chặt chẽ và ngắn gọn hơn so với hàm thông thường. Show Với bài viết này, chúng ta sẽ biết được:
Phép Tính Lambda (Lambda Calculus)Biểu thức Lambda trong python hay các ngôn ngữ khác có nguồn gốc từ phép tính lambda, một phương pháp tính toán do Alozo Church tìm ra. Ở mục này, bạn sẽ biết phép tính lambda được giới thiệu khi nào và lý do tại sao nó là concept cơ bản lại xuất hiện trong hệ sinh thái Python. Lịch SửAlozo Church đã đề xuất phép tính lambda, một ngôn ngữ dựa trên sự trừu tượng năm 1930. Phép tính lambda có thể mã hóa bất kỳ phép tính nào. Nó là Turing complete nhưng trái với khái niệm Turing machine, nó ở dạng thuần khiết và không giữ bất kỳ trạng thái nào (Dịch tới đây cũng chưa hiểu gì) Ngôn ngữ hàm số có nguồn gốc như logic toán học và phép tính lambda, các ngôn ngữ lập tình hàm dựa trên các mô hình tính toán trạng thái do Alan Turning phát minh. Hai mô hình tính toán là phép tính lambda và Turning machine có thể được dịch qua lại nhau. Sự tương đường này được gọi là gỉa thuyết Church-Turing. Ngôn ngữ hàm số kế thừa trực tiếp triết lý phép itnhs lambda, áp dụng cách tiếp cận của lập trình nhấn mạnh vào tính trừu tượng, chuyển đổi dữ liệu, tính composition, và pureity (không có trạng thái và không có side effect). Ví dụ của ngôn ngữ hàm số là Haskell, Lisp, Erlang Ngược lại, Turning Machine dẫn tới lập trình bằng ngỗn ngữ như Fortan, C, Python Phong cách lập trình với câu lệnh (statements), điều khiển dòng chương trình từng bước từng với một. Cách tiếp cận này thức đẩy sự mutaion và yêu cầu quản lý trạng thái. Python vôn dĩ không kết thừa ngôn ngữ hàm, nhưng nó đã áp dụng một số functional concept từ khá sớm. Tháng 1 năm 1994, 5, 6, 7 và toán tử lambda được được thêm vào ngôn ngữ này.Ví dụ đầu tiênĐây là một vài ví dụ về style functional trong Python: Một function được định nghĩa sử dụng keyword 8:
9 nhận một tham số x và trả về tính nómặc khác, nếu sử dụng Lambda Python, bạn sẽ viết như sau:
Trong ví dụ trên, biểu thức được tạo thành tuwf:
Note: Trong nội dung bài viết này, một biến rạng buộc (bound variable) là một đối số tới lambda function Mặc kahcs, một free variable không ràng buộc có thể được tham chiếu trong thân của biểu thức. Free variable có thể là một hàng số hoặc biết được định nghĩa bên trong phạm vi hàm. Bạn có thể viết phưc tạp thêm một chú, một hàm mà trả về giá trị được cộng thêm một:
Bạn có thể dùng hàm trên với một đối số bằng cách bao quanh hàm và đối số của nó bằng dấu ngoặc đơn:
Dưới đây là cách giải thích chi tiết của lambda.
Bởi vì lambda function là một biểu thức nên có đặt tên cho nó.
Biểu thức trên tương ứng với cách viết như này:
Tất cả các hàm này đều nhận một đối số duy nhất. Bạn có thể nhận thấy rằng, trong định nghĩa của lambdas, các đối số không có dấu ngoặc đơn xung quanh chúng. Các hàm đa đối số được biểu diễn bằng lambdas Python bằng cách liệt kê các đối số và phân tách chúng bằng dấu phẩy (,) nhưng không bao quanh chúng bằng dấu ngoặc đơn:
Lambda function được gán cho 0 nhận 2 đối số và trả về 1 string chứa last name và first name. Như ở phía trên, lambda function không cần dấu ngoặc đơn và việc gọi hàm đơn giản như cách gọi thông thường.Anonymous Function (hàm ẩn danh)Các từ sau có thể được sử dụng để thay thế cho nhau phụ thuộc vào ngôn ngữ:
Nhưng về cơ bản nó chỉ ám chỉ hàm ẩn danh. Một hàm ẩn danh là một hàm không có tên. Trong Python, anonymous function có thể được tạo với keyword 1. Mặc dụ không tên nhưng cơ bản nó có thể được gán cho một biến. Dưới đây là motọ lambda không tên nhận 2 đối số và trả về tổng
Để gọi nó, bạn sử dụng
Ví dụ trên đang tận dụng tính năng chỉ dành cho trình thông dịch tương tác được cung cấp qua dấu gạch dưới (). Bạn có thể không code tương tự trong module. Note: Trong trình biên dịch, dấu ngạch dưới được liên kết với biểu thức cuối cùng được thực hiện. Trong ví dụ trên, 2 trỏ tới lambda function. Để hiểu chi tiết thêm thì có thể tham khảo linkNgoài ra, một pattern được sự trong ngỗn ngữ khác như JS là thực thi hàm ngay lập tức cũng được áp dụng với Lambda. Đây được gọi là Immediately Invoked Function Expression (IIFE, phát âm là “iffy”). Đây là một ví dụ: 0Lambda function phái trên định nghĩa và thực khi với 2 đối số truyền vào. Nó trả lại tổng giá trị là 5. Python không khuyến khích sử dụng các biểu thức lambda dạng này. Nó chỉ đơn giản là kết quả của một biểu thức lambda có thể gọi được, không giống như phần thân của một hàm bình thường. Các lambda function thường được sử dụng với các hàm bậc cao hơn, các hàm này nhận một hoặc nhiều hàm làm đối số hoặc trả về một hoặc nhiều hàm. Một lambda function có thể là một hàm bậc cao hơn bằng cách lấy một hàm (bình thường hoặc lambda) làm đối số như trong ví dụ tiếp theo sau: 1Python có những HOF được dựng sẵn trong thư viện chuẩn như 5, 6 v.v... và bạn có thể sử dụng lambda function trong đó.Python Lambda và Function ThuầnTừ trích dẫn này Python Design and History FAQ ta có thể thấy tổng thể liên quan đến việc sử dụng các hàm lambda trong Python:
Tuy nhiên, đừng để câu nói này ngăn cản bản sử dụng lambda function. Các nội dung sau sẽ chỉ rõ những điểm chung và sự kahcs biết giưa lambda và hàm thông thường. FunctionBạn có lẽ tự hỏi điều gì để phân biệt lambda function khi gán vào một biến và một hàm thông thường, về cảm quan thì không có gì. Hãy cùng xem các Python nhìn một function được build với một câu lệnh 5 và một hàm được xây dựng dưới dạng lambda: 26 là module phân tích mã bytecode Python được tạo bởi trình biên dịch Python Bạn có thể thấy ràng 7 hiển thị ra dạng bytecode Python cho phép kiểm tra các hướng dẫn ở mức low-level mà trình thông dịch Python sẽ sử dụng trong khi thực thi chương trình.Còn bây giờ hãy giá trị trả ra với một hàm thông thường: 3Nhìn hai kết quả, ta có thể nó giống nhau. Nhưng bạn chú ý rằng về cách đặt tên thì khác nhau: với hàm thông thường, tên hàm sẽ là 8 còn với lambda function nó chỉ là 9.TracebackỞ phần trước, trong bối cảnh của lambda function, Python không cung cấp tên cho hàm đó, mà chỉ hiển thị là 9. Điều này có thể là một hạn chế mà ta cần xem xét khi một exception xảy ra và một traceback sẽ chỉ hiển thị 1: 4Phía trên là traceback của exception được raise với lambda function. Và bên dươi là ví dụ với hàm thông thường 5Hàm bình thường bắn ra lỗi tương tự nhưng chỉ dẫn đến chính xác hơn vì nó cung cấp tên hàm, div_zero. SyntaxNo StatementsMột lambda function không thể chứa bất kỳ câu lệnh nào. Trong lambda function, câu lệnh như 2, 3, 4 sẽ gây lên lỗi 5. Đây là ví dụ khi ta thêm 6 bên trong lambda: 6Ví dụ này kiểm tra x có giá trị là 2 hay không. Nhưng trình thông dịch xác định một Lỗi cú pháp trong khi phân tích cú pháp liên quan đến câu lệnh 7 trong phần thân của lambda.Single ExpressionĐối lập với hàm thông thường, lambda function chỉ là một biểu thức. Mặc dù bên trong body của một lambda, bạn có thể mở rộng biểu thức trên nhiều dòng bằng cách sử dụng dấu ngoặc đơn hoặc một chuỗi nhiều dòng, những tóm lại nó vẫn chỉ có duy nhất một biểu thức: 7Ví dụ phái trên sẽ trả về 8 nếu tham số là số chẵn và ngược lại. Nó được viết thành 2 dòng bởi vì ta đã đặt nó bên trong dấu ngoặc đơn, nhưng thật chất nó vẫn coi là một biểu thức duy nhất.Type AnnotationsNếu bạn đã quen với việc sử dụng gợi ý kiểu đã có sẵn trong Python, thì bạn đã có thêm lý do để thích cá hàm thông thường hơn làm lambda function bởi lambda function không hỗ trợ điều này. 8Bất kỳ lỗi liên quan tới type của đối số với full_name () đều có thể bị bắt bởi các tool như 9 hoặc 0, trong khi với hàm lambda banj chir nhaanj được lỗi cú pháp: 9IIFELambda function có IIFE trong khi hàm thông thường thì không. Tuy nhiên, tính năng này có thể không được sử dụng trong thực tế. Ví dụ về IIFE của lambda function. 0Đối sốGiống như function bình thường, Lambda cũng cho phép truyền đối số. Ví dụ dưới đây sẽ cho ta thấy điều đó và 1 số cách truyền đối số. 1DecoratorTrong Python, 1 decorator là một pattern cho phép thêm một hành vi tới một hàm hoặc class. Nó thường được biểu diễn với 1 trước một function. 2Trong ví dụ trên, hàm 2 là một function thêm một hành vi tới hàm 3, vì thế khi gọi 4 kết quả sẽ là: 3 5 chỉ in ra 6, nhưng với decorator, nó được add thêm hành vi khác là in thêm đoạn 7.Một decorator có thể áp dụng vào một lambda như sau: 4 8, đã được decorated với @trace. Và với lambda nó được gọi thông qua việc bọn như ví dụ bên trên. và kết quả sẽ là 5Lạm Dụng LambdaVới một vài ví dụ ở bài viết này, có thể được coi là đang lạm dung lambda. Nếu bạn thấy mình đang cố gắng khắc phục điều gì đó mà lambda không hỗ trợ, đây có thể là dấu hiệu cho thấy một hàm bình thường sẽ phù hợp hơn. Ở phần này chúng ta sẽ xem một vài ví dụ nên tránh không sử dụng lambda. Raise exceptionRaise một exception bằng lambda không phải phương án hay. 6Nên tránh sử dụng kiểu này. Nếu bạn gặp đoạn code như này, hãy xem xét sửa lại nó. Cryptic StyleNhư bất kỳ ngôn ngữ nào, bạn có thể khó tìm code mà bạn muốn nếu như style được sử dụng gây khó khăn cho việc đọc. Và lambda là một loại như vậy. 7 9 tham chieué tới một giá trị mà không cần dùng nó. Nhưng trong ví dụ này, 2 tham chiếu tới các biến khác nhau. Và chúng ta hãy đặt tên cho các biến cho dễ nhìn. 8Phải thừa nhận rằng nó vẫn còn khó đọc. Vẫn tận dụng lambda, ta sẽ chuyển nó dưới dạng một hàm thông thường để dễ đọc hơn. 9ClassBạn có thể nhưng không nên viết các phương thức lớp dưới dạng các hàm lambda của Python. Ví dụ sau hoàn toàn hợp lệ. Ví dụ: thay vì triển khai str như một hàm thông thường, ta sử dụng lambda. Tương tự, 1 và 2 là các thuộc tính cũng được triển khai với các hàm lambda, thay vì các hàm hoặc decorators:str như một hàm thông thường, ta sử dụng lambda. Tương tự, 1 và 2 là các thuộc tính cũng được triển khai với các hàm lambda, thay vì các hàm hoặc decorators: 0Khi chạy tool như 3, một tool check style, nó sẽ hiển thị 1Mặc dù 3 không chỉ ra vấn đề đối với việc sử dụng các hàm lambda của Python trong các thuộc tính, nhưng chúng rất khó đọc và dễ bị lỗi do sử dụng nhiều chuỗi như 5 và 2. Và hãy luôn dùng kiểu này để triển khai 2Theo nguyên tắc chung, hãy ưu tiên sử dụng các hàm thông thường hơn các biểu thức lambda. Khi nào nên dùng LambdaLambda luôn là chủ để để tranh cái với những vấn đề khó đọc, khó hiểu. Nhưng hãy bỏ qua nó và tìm hiểu khi nào nên dùng lambda Hàm khởi tạo classLambda thường được sử dụng với 5, 6. Dưới đây là một vài ví dụ về dùng lambda cho các hàm đó. 3Bạn có thể đã đọc code tương tự như các ví dụ trên, và nó khá phổ biến khiến cho việc sử dụng nó hiệu quả hơn. Key FunctionsCác key function trong Python là các hàm bậc cao sử dụng một 9 tham số làm đối số được đặt tên. 0 nhận một hàm có thể là lambda. Hàm này ảnh hưởng trực tiếp đến thuật toán được điều khiển bởi chính hàm chính. Dưới đây là một số chức năng chính: 4Tổng hợpSau bài viết này bạn đã biết được:
Hy vọng bài viết này giúp ích trong quá trình làm việc với python của mọi người. |