Lợi thế của biểu thức lambda trong python là gì?

Biểu thức lambda này xác định một hàm không tên, hàm này chấp nhận hai đối số và trả về tổng của hai đối số. Nhưng làm thế nào để chúng ta gọi một chức năng chưa được đặt tên? .   

Show
    (lambda x, y: x + y)(1, 2)

    mã 1.  

    Python3




    (lambda x, y: x + y)(1, 2)
    9

    9
    2
    0

     

    9
    2
    1

    9
    2
    2_______2_______3
    9
    2
    4
    9
    2
    5
    9
    2
    6
    9
    2
    7
    9
    2
    8
    9
    2
    9
    11
    0
    11
    1
    11
    2
    11
    3
    11
    2
    11
    5
    11
    6

    11
    7_______12_______8

     

    11
    9

    [0, 2, 4, 6, 8, 1, 3, 5, 7, 9]
    0_______2_______3
    9
    2
    4
    9
    2
    5
    9
    2
    6
    9
    2
    7
    9
    2
    8
    [0, 2, 4, 6, 8, 1, 3, 5, 7, 9]
    7
    [0, 2, 4, 6, 8, 1, 3, 5, 7, 9]
    8
    9
    2
    3
    9
    2
    3
    [0, 2, 4, 6, 8, 1, 3, 5, 7, 9]
    1
    11
    6
    [0, 2, 4, 6, 8, 1, 3, 5, 7, 9]
    3
    [0, 2, 4, 6, 8, 1, 3, 5, 7, 9]
    4
    9
    2
    9
    [0, 2, 4, 6, 8, 1, 3, 5, 7, 9]
    6_______12_______1_______12_______2_______2_______2_______2_______12_______2_______12_______2_______12_______2_______1

    11
    7_______46_______4

    đầu ra.  

    9
    2

    Mặc dù điều này không được khuyến khích nhưng đối tượng hàm được trả về bởi biểu thức lambda có thể được gán cho một biến. Xem ví dụ bên dưới trong đó một biến sum được gán cho một đối tượng hàm được trả về bởi một biểu thức lambda.  
     

    Python3




    5
    5

    5
    6

    5
    7

     

    5
    8

    5
    9
    9
    2
    3
    9
    2
    5
    5
    2
    9
    2
    7
    5
    4

    11
    7_______2_______4
    5
    7
    9
    2
    4
    5
    9
    three
    0

     

    9
    2
    2
    9
    2
    3
    5
    9
    9
    2
    4_______63_______5
    11
    2
    three
    7
    11
    6

    11
    7_______12_______8

    đầu ra.   

    11

    Cách sử dụng phổ biến của biểu thức lambda.  

    • Vì các hàm lambda là ẩn danh và không yêu cầu gán tên nên chúng thường được sử dụng để gọi các hàm (hoặc lớp) yêu cầu một đối tượng hàm làm đối số. Việc định nghĩa các hàm riêng biệt cho các đối số hàm như vậy là vô ích vì định nghĩa hàm thường ngắn và chúng chỉ được yêu cầu một hoặc hai lần trong mã. Ví dụ: đối số chính của hàm sẵn có, sorted().  
       

    Python3




    5
    5

    three
    2

    three
    3
    three
    4

    three
    5
    three
    6
    three
    7
    three
    8
    11
    3

    (lambda x, y: x + y)(1, 2)
    00
    9
    2
    3
    (lambda x, y: x + y)(1, 2)
    02
    [0, 2, 4, 6, 8, 1, 3, 5, 7, 9]
    1
    11
    2
    11
    1
    11
    2
    11
    3
    11
    2
    11
    5
    11
    2
    three
    5
    11
    2
    (lambda x, y: x + y)(1, 2)
    13
    11
    2
    (lambda x, y: x + y)(1, 2)
    15
    11
    2
    three
    7
    11
    2
    (lambda x, y: x + y)(1, 2)
    19
    11
    2
    (lambda x, y: x + y)(1, 2)
    21
    (lambda x, y: x + y)(1, 2)
    22

    (lambda x, y: x + y)(1, 2)
    23
    9
    2
    3
    (lambda x, y: x + y)(1, 2)
    25
    (lambda x, y: x + y)(1, 2)
    26
    9
    2
    3
    (lambda x, y: x + y)(1, 2)
    28

    11
    7_______0_______30

    • đầu ra
    [0, 2, 4, 6, 8, 1, 3, 5, 7, 9]

    Python3




    (lambda x, y: x + y)(1, 2)
    31

    (lambda x, y: x + y)(1, 2)
    32

     

    (lambda x, y: x + y)(1, 2)
    00
    9
    2
    3
    (lambda x, y: x + y)(1, 2)
    02
    [0, 2, 4, 6, 8, 1, 3, 5, 7, 9]
    1
    11
    2
    11
    1
    11
    2
    11
    3
    11
    2
    11
    5
    11
    2
    three
    5
    11
    2
    (lambda x, y: x + y)(1, 2)
    13
    11
    2
    (lambda x, y: x + y)(1, 2)
    15
    11
    2
    three
    7
    11
    2
    (lambda x, y: x + y)(1, 2)
    19
    11
    2
    (lambda x, y: x + y)(1, 2)
    21
    (lambda x, y: x + y)(1, 2)
    22

    (lambda x, y: x + y)(1, 2)
    56
    9
    2
    3
    (lambda x, y: x + y)(1, 2)
    25_______0_______26_______2_______3
    9
    2
    5
    (lambda x, y: x + y)(1, 2)
    62
    three
    8
    11
    3
    11
    6

    11
    7____0_______67

    • đầu ra
    [0, 2, 4, 6, 8, 1, 3, 5, 7, 9]
    • Các hàm lambda là các hàm nội tuyến và do đó chúng được sử dụng bất cứ khi nào có nhu cầu gọi hàm lặp lại để giảm thời gian thực hiện. Một số ví dụ về các tình huống như vậy là các chức năng. bản đồ (), bộ lọc () và sắp xếp (). Ví dụ,
       

    Python3




    (lambda x, y: x + y)(1, 2)
    9

    (lambda x, y: x + y)(1, 2)
    32

     

    (lambda x, y: x + y)(1, 2)
    00
    9
    2
    3
    (lambda x, y: x + y)(1, 2)
    02
    11
    1
    11
    2
    11
    3
    11
    2
    11
    5
    11
    2
    three
    5
    11
    2
    (lambda x, y: x + y)(1, 2)
    13
    11
    2
    (lambda x, y: x + y)(1, 2)
    15
    11
    2
    three
    7
    11
    2
    (lambda x, y: x + y)(1, 2)
    19
    11
    2
    (lambda x, y: x + y)(1, 2)
    21
    11
    2
    [0, 2, 4, 6, 8, 1, 3, 5, 7, 9]
    1
    (lambda x, y: x + y)(1, 2)
    22

     

    (lambda x, y: x + y)(1, 2)
    93

    (lambda x, y: x + y)(1, 2)
    94_______2_______3
    (lambda x, y: x + y)(1, 2)
    96
    9
    2
    4
    9
    2
    5
    (lambda x, y: x + y)(1, 2)
    62
    9
    2
    9
    9
    2
    01

    11
    7_______2_______4
    9
    2
    04
    9
    2
    05

     

    9
    2
    06

    9
    2
    07
    9
    2
    3
    9
    2
    09
    9
    2
    4_______2_______5
    9
    2
    12
    9
    2
    13
    [0, 2, 4, 6, 8, 1, 3, 5, 7, 9]
    7
    [0, 2, 4, 6, 8, 1, 3, 5, 7, 9]
    4
    three
    8
    11
    3
    9
    2
    3
    9
    2
    3
    [0, 2, 4, 6, 8, 1, 3, 5, 7, 9]
    1
    11
    6

    9
    2
    22_______22_______3
    9
    2
    24
    9
    2
    25

    11
    7_______2_______4
    9
    2
    04
    9
    2
    29

      
    Ưu và nhược điểm của hàm lambda.  
    Ưu điểm của hàm lambda.  
     

    • Là ẩn danh, các hàm lambda có thể dễ dàng được chuyển mà không cần gán cho một biến
    • Các hàm lambda là các hàm nội tuyến và do đó thực thi tương đối nhanh hơn
    • Nhiều khi các hàm lambda làm cho mã dễ đọc hơn nhiều bằng cách tránh các bước nhảy logic do các lệnh gọi hàm gây ra. Ví dụ: đọc các khối mã sau.  
       

    Python3




    9
    2
    30

    9
    2
    31

    three
    3
    9
    2
    33

    three
    5
    three
    6
    three
    7
    9
    2
    9_______46_______4
    9
    2
    7
    9
    2
    40

    9
    2
    41_______2_______3
    11
    1

    9
    2
    44
    9
    2
    3
    11
    3

    9
    2
    47_______2_______3
    11
    5

     

    9
    2
    50

    9
    2
    51_______2_______3
    9
    2
    53

    11
    7_______2_______55

    • đầu ra
    5

    Python3




    9
    2
    30

    9
    2
    57

     

    9
    2
    51
    9
    2
    3
    9
    2
    4
    9
    2
    5
    9
    2
    62
    9
    2
    9
    5
    4
    9
    2
    7
    11
    0
    11
    1
    11
    2
    11
    3
    11
    2
    11
    5
    11
    6

    11
    7_______2_______74

    • đầu ra
    5

    Nhược điểm về chức năng lambda.  

    • Các hàm lambda chỉ có thể có một biểu thức
    • Hàm lambda không thể có chuỗi tài liệu
    • Nhiều lần các hàm lambda làm cho mã khó đọc. Ví dụ: xem các khối mã được cung cấp bên dưới.  
       

    Python3




    three
    3
    9
    2
    76

    three
    5
    [0, 2, 4, 6, 8, 1, 3, 5, 7, 9]
    7
    three
    7_______2_______3_______2_______3
    11
    1
    9
    2
    83

    9
    2
    84
    three
    6
    9
    2
    86

    three
    5
    [0, 2, 4, 6, 8, 1, 3, 5, 7, 9]
    3
    [0, 2, 4, 6, 8, 1, 3, 5, 7, 9]
    7
    three
    7
    9
    2
    3
    9
    2
    3
    11
    3
    9
    2
    83

    9
    2
    84
    three
    6
    9
    2
    97

    three
    5
    [0, 2, 4, 6, 8, 1, 3, 5, 7, 9]
    3
    [0, 2, 4, 6, 8, 1, 3, 5, 7, 9]
    7
    three
    7
    9
    2
    3
    9
    2
    3
    11
    5
    9
    2
    83

    9
    2
    84
    three
    6
    11
    08

    three
    5
    [0, 2, 4, 6, 8, 1, 3, 5, 7, 9]
    3
    9
    2
    83

    9
    2
    84
    three
    6
    11
    14

    11
    15_______2_______3
    11
    17
    11
    5_______12_______6

    11
    7_______12_______21

    • đầu ra
    three

    Python3




    (lambda x, y: x + y)(1, 2)
    31

    (lambda x, y: x + y)(1, 2)
    32

    11
    15_______2_______3
    9
    2
    4
    9
    2
    5
    9
    2
    12
    9
    2
    86
    [0, 2, 4, 6, 8, 1, 3, 5, 7, 9]
    7
    three
    7
    9
    2
    3
    9
    2
    3
    11
    1
    [0, 2, 4, 6, 8, 1, 3, 5, 7, 9]
    3
    9
    2
    4
    9
    2
    97
    [0, 2, 4, 6, 8, 1, 3, 5, 7, 9]
    7
    three
    7
    9
    2
    3_______2_______3
    11
    3

    11
    43
    [0, 2, 4, 6, 8, 1, 3, 5, 7, 9]
    3
    9
    2
    4
    11
    08
    [0, 2, 4, 6, 8, 1, 3, 5, 7, 9]
    7
    three
    7
    9
    2
    3
    9
    2
    3
    11
    5
    [0, 2, 4, 6, 8, 1, 3, 5, 7, 9]
    3
    11
    14
    11
    54
    11
    5
    11
    6

    11
    7_______12_______21

    • đầu ra
    three

      
    Lạm dụng biểu thức Lambda.  

    • Gán các biểu thức lambda. Hướng dẫn kiểu python chính thức PEP8, không khuyến khích mạnh mẽ việc gán các biểu thức lambda như trong ví dụ bên dưới
    (lambda x, y: x + y)(1, 2)
    0
    • Thay vào đó, nên viết một hàm một lớp như,
    (lambda x, y: x + y)(1, 2)
    1
    • Mặc dù phương pháp thứ hai khuyến khích thực tế là các hàm lambda là ẩn danh, nhưng nó cũng hữu ích cho việc truy nguyên trong quá trình gỡ lỗi. Chạy mã bên dưới để xem cách def làm cho truy nguyên trở nên hữu ích.  
       

    Python3




    11
    59
    9
    2
    3
    9
    2
    5
    9
    2
    62_______2_______9
    5
    4
    9
    2
    7
    9
    2
    40

    11
    7_______12_______68

    three
    3
    11
    70
    three
    6
    three
    7
    9
    2
    9
    5
    4
    9
    2
    7
    9
    2
    40

    11
    7_______12_______68

    • Gói các biểu thức lambda xung quanh các chức năng. Nhiều lần, các biểu thức lambda không cần thiết bao quanh các chức năng như hình bên dưới
    (lambda x, y: x + y)(1, 2)
    2
    • Mặc dù cú pháp trên là hoàn toàn chính xác, nhưng các lập trình viên phải hiểu rằng tất cả các hàm trong python đều có thể được truyền dưới dạng các đối tượng hàm. Do đó, cùng một mã có thể (và nên) được viết là,
    (lambda x, y: x + y)(1, 2)
    3
    • Truyền chức năng không cần thiết. Nhiều lần, người lập trình chuyển các hàm chỉ thực hiện một thao tác duy nhất. Xem đoạn mã sau
    (lambda x, y: x + y)(1, 2)
    4
    • Hàm lambda được truyền ở trên chỉ thực hiện một thao tác duy nhất, thêm hai đối số. Có thể thu được kết quả tương tự bằng cách sử dụng hàm tích hợp sẵn sum, như minh họa bên dưới.  
       
    (lambda x, y: x + y)(1, 2)
    5
    • Các lập trình viên nên tránh sử dụng các biểu thức lambda cho các hoạt động phổ biến, bởi vì rất có thể có một hàm tích hợp cung cấp kết quả tương tự

      
    Lạm dụng các biểu thức lambda.  

    • Sử dụng lambda cho các chức năng không tầm thường. Đôi khi, các chức năng đơn giản có thể không tầm thường. Xem mã dưới đây

    Python3




    11
    79_______2_______3
    11
    81
    11
    82
    9
    2
    83
    11
    84
    11
    2
    11
    86
    9
    2
    83
    11
    88
    11
    2
    11
    90
    9
    2
    83
    11
    3
    11
    2_______12_______94__
    9
    2
    83_______6

    11
    98
    11
    99
    11
    82
    9
    2
    83
    [0, 2, 4, 6, 8, 1, 3, 5, 7, 9]
    02
    11
    2
    11
    86
    9
    2
    83
    [0, 2, 4, 6, 8, 1, 3, 5, 7, 9]
    06
    11
    2
    11
    90
    9
    2
    83
    11
    1
    11
    2
    11
    94_____2_______83_______1_______ 7

    11
    98
    11
    99
    11
    82_______2_______83
    [0, 2, 4, 6, 8, 1, 3, 5, 7, 9]
    20
    11
    2
    11
    86
    9
    2
    83
    [0, 2, 4, 6, 8, 1, 3, 5, 7, 9]
    24
    11
    2
    11
    90
    9
    2
    83
    (lambda x, y: x + y)(1, 2)
    13
    11
    2
    11
    94_____2_
    11
    3

    [0, 2, 4, 6, 8, 1, 3, 5, 7, 9]
    34
    9
    2
    3
    (lambda x, y: x + y)(1, 2)
    25
    [0, 2, 4, 6, 8, 1, 3, 5, 7, 9]
    37

    [0, 2, 4, 6, 8, 1, 3, 5, 7, 9]
    38_______22_______39
    9
    2
    3
    9
    2
    5
    [0, 2, 4, 6, 8, 1, 3, 5, 7, 9]
    42
    11
    82
    (lambda x, y: x + y)(1, 2)
    22
    9
    2
    9
    [0, 2, 4, 6, 8, 1, 3, 5, 7, 9]
    46
    11
    1
    9
    2
    7
    [0, 2, 4, 6, 8, 1, 3, 5, 7, 9]
    49
    11
    86
    (lambda x, y: x + y)(1, 2)
    22
    [0, 2, 4, 6, 8, 1, 3, 5, 7, 9]
    52

    [0, 2, 4, 6, 8, 1, 3, 5, 7, 9]
    53_______22_______49
    11
    90
    [0, 2, 4, 6, 8, 1, 3, 5, 7, 9]
    56
    9
    2
    9
    9
    2
    9
    [0, 2, 4, 6, 8, 1, 3, 5, 7, 9]
    59
    11
    90
    (lambda x, y: x + y)(1, 2)
    22
    9
    2
    9
    [0, 2, 4, 6, 8, 1, 3, 5, 7, 9]
    49
    11
    94
    [0, 2, 4, 6, 8, 1, 3, 5, 7, 9]
    65

    11
    7_______22_______67

    • đầu ra

    [{'N'. 2, 'r'. 0. 01, ‘t’. 4, 'p'. 100}, {‘n’. 5, 'r'. 0. 05, ‘t’. 2, 'p'. 120}, {‘n’. 1, 'r'. 0. 04, ‘t’. 5, 'p'. 150}]
     

    • Ở đây, chúng tôi đang sắp xếp các từ điển trên cơ sở lãi kép. Bây giờ, hãy xem mã được viết bên dưới, sử dụng def

    Python3




    11
    79_______2_______3
    11
    81
    11
    82
    9
    2
    83
    11
    84
    11
    2
    11
    86
    9
    2
    83
    11
    88
    11
    2
    11
    90
    9
    2
    83
    11
    3
    11
    2_______12_______94__
    9
    2
    83_______6

    11
    98
    11
    99
    11
    82
    9
    2
    83
    [0, 2, 4, 6, 8, 1, 3, 5, 7, 9]
    02
    11
    2
    11
    86
    9
    2
    83
    [0, 2, 4, 6, 8, 1, 3, 5, 7, 9]
    06
    11
    2
    11
    90
    9
    2
    83
    11
    1
    11
    2
    11
    94_____2_______83_______1_______ 7

    11
    98
    11
    99
    11
    82_______2_______83
    [0, 2, 4, 6, 8, 1, 3, 5, 7, 9]
    20
    11
    2
    11
    86
    9
    2
    83
    [0, 2, 4, 6, 8, 1, 3, 5, 7, 9]
    24
    11
    2
    11
    90
    9
    2
    83
    (lambda x, y: x + y)(1, 2)
    13
    11
    2
    11
    94_____2_
    11
    3

    three
    3
    [0, 2, 4, 6, 8, 1, 3, 5, 7, 9]
    24

    three
    5
    [0, 2, 4, 6, 8, 1, 3, 5, 7, 9]
    26

    three
    5
    three
    6
    [0, 2, 4, 6, 8, 1, 3, 5, 7, 9]
    29
    11
    82
    (lambda x, y: x + y)(1, 2)
    22
    9
    2
    9
    [0, 2, 4, 6, 8, 1, 3, 5, 7, 9]
    46
    11
    1
    9
    2
    7
    [0, 2, 4, 6, 8, 1, 3, 5, 7, 9]
    29
    11
    86
    (lambda x, y: x + y)(1, 2)
    22
    [0, 2, 4, 6, 8, 1, 3, 5, 7, 9]
    52
    [0, 2, 4, 6, 8, 1, 3, 5, 7, 9]
    29
    11
    90
    [0, 2, 4, 6, 8, 1, 3, 5, 7, 9]
    56
    9
    2
    9
    9
    2
    9
    [0, 2, 4, 6, 8, 1, 3, 5, 7, 9]
    45
    11
    90
    (lambda x, y: x + y)(1, 2)
    22
    9
    2
    9
    [0, 2, 4, 6, 8, 1, 3, 5, 7, 9]
    29
    11
    94
    [0, 2, 4, 6, 8, 1, 3, 5, 7, 9]
    51

    [0, 2, 4, 6, 8, 1, 3, 5, 7, 9]
    34
    9
    2
    3
    (lambda x, y: x + y)(1, 2)
    25
    [0, 2, 4, 6, 8, 1, 3, 5, 7, 9]
    55
    9
    2
    3
    [0, 2, 4, 6, 8, 1, 3, 5, 7, 9]
    57

    11
    7_______22_______67

    • đầu ra

    [{'N'. 2, 'r'. 0. 01, ‘t’. 4, 'p'. 100}, {‘n’. 5, 'r'. 0. 05, ‘t’. 2, 'p'. 120}, {‘n’. 1, 'r'. 0. 04, ‘t’. 5, 'p'. 150}]
     

    • Mặc dù cả hai mã đều làm giống nhau, mã thứ hai sử dụng def dễ đọc hơn nhiều. Biểu thức được viết ở đây dưới lambda có thể đơn giản, nhưng nó có ý nghĩa (công thức tính lãi kép). Do đó, biểu thức là không tầm thường và xứng đáng được đặt tên. Sử dụng các biểu thức lambda cho các chức năng không tầm thường làm giảm khả năng đọc mã
    • Sử dụng lambdas khi nhiều dòng sẽ hữu ích. Nếu sử dụng hàm nhiều dòng giúp mã dễ đọc hơn, thì việc sử dụng biểu thức lambda để giảm bớt một số dòng mã là không đáng. Ví dụ, xem đoạn mã dưới đây

    người = [('sam', 'M', 18), ('susan', 'F', 22), ('joy', 'M', 21), ('lucy', 'F', 12)
    sorted_people = đã sắp xếp (mọi người, key=lambda x. x[1])
     

    • Cũng xem đoạn mã sau sử dụng def
    (lambda x, y: x + y)(1, 2)
    6
    • Xem cách giải nén bộ dữ liệu trong khối mã thứ hai giúp nó dễ đọc và hợp lý hơn nhiều. Khả năng đọc mã phải là ưu tiên hàng đầu của lập trình viên, làm việc trong môi trường hợp tác
    • Sử dụng biểu thức lambda cho bản đồ và bộ lọc. Lambdas thường được sử dụng với map() và filter() như hình minh họa

    Python3




    (lambda x, y: x + y)(1, 2)
    00
    9
    2
    3
    (lambda x, y: x + y)(1, 2)
    02
    [0, 2, 4, 6, 8, 1, 3, 5, 7, 9]
    1
    11
    2
    11
    1
    11
    2
    11
    3
    11
    2
    11
    5
    11
    2
    three
    5
    11
    2
    (lambda x, y: x + y)(1, 2)
    13
    (lambda x, y: x + y)(1, 2)
    22

    [0, 2, 4, 6, 8, 1, 3, 5, 7, 9]
    75
    9
    2
    3
    (lambda x, y: x + y)(1, 2)
    96
    9
    2
    4
    9
    2
    5
    (lambda x, y: x + y)(1, 2)
    62
    9
    2
    9
    9
    2
    01

    [0, 2, 4, 6, 8, 1, 3, 5, 7, 9]
    83_______2_______3
    [0, 2, 4, 6, 8, 1, 3, 5, 7, 9]
    4
    5
    20
    three
    7
    5
    22
    (lambda x, y: x + y)(1, 2)
    00
    [0, 2, 4, 6, 8, 1, 3, 5, 7, 9]
    7
    three
    7
    three
    8
    11
    3
    9
    2
    3
    9
    2
    3
    11
    1
    11
    6