Python lambda x không có trong danh sách

Nếu Guido van Rossum, tác giả của ngôn ngữ lập trình Python, đã có di chúc của mình, chương này sẽ bị thiếu trong hướng dẫn của chúng tôi. Trong bài báo của anh ấy từ tháng 5 năm 2005 "All Things Pythonic. Số phận của reduce() trong Python 3000", anh ấy đưa ra lý do bỏ lambda, map(), filter() và reduce(). Anh ấy mong đợi sự phản kháng từ Lisp và kế hoạch "mọi người". Điều anh không lường trước được là sự cứng nhắc của phe đối lập này. Đủ để Guido van Rossum viết một năm sau đó. "Sau rất nhiều nỗ lực để đưa ra giải pháp thay thế cho lambda, có lẽ chúng ta nên thừa nhận thất bại. Tôi không có thời gian để theo dõi các vòng gần đây nhất, nhưng tôi đề xuất rằng chúng ta nên giữ lambda, để ngừng lãng phí tài năng và thời gian của mọi người vào một nhiệm vụ bất khả thi. "Chúng ta có thể thấy kết quả. lambda, map() và filter() vẫn là một phần của Python cốt lõi. Chỉ giảm () phải đi;

Lý do của anh ấy để bỏ chúng là như thế này

  • Có một giải pháp thay thế mạnh mẽ không kém cho lambda, lọc, ánh xạ và thu nhỏ, tôi. e. hiểu danh sách
  • Hiểu danh sách (rõ ràng hơn và dễ hiểu hơn
  • Có cả khả năng hiểu danh sách và "Bộ lọc, bản đồ, thu nhỏ và lambda" đang vi phạm phương châm của Python "Nên có một cách rõ ràng để giải quyết vấn đề"

Python lambda x không có trong danh sách

Một số thích nó, những người khác ghét nó và nhiều người sợ toán tử lambda. Toán tử lambda hoặc hàm lambda là một cách để tạo các hàm ẩn danh nhỏ, tôi. e. chức năng không có tên. Các chức năng này là các chức năng loại bỏ, tôi. e. chúng chỉ cần thiết ở nơi chúng được tạo ra. Các hàm lambda chủ yếu được sử dụng kết hợp với các hàm filter(), map() và reduce(). Tính năng lambda đã được thêm vào Python do nhu cầu của các lập trình viên Lisp

Cú pháp chung của hàm lambda khá đơn giản

lambda đối số_list. sự biểu lộ

Danh sách đối số bao gồm một danh sách các đối số được phân tách bằng dấu phẩy và biểu thức là một biểu thức số học sử dụng các đối số này. Bạn có thể gán hàm cho một biến để đặt tên cho nó

Ví dụ sau về hàm lambda trả về tổng của hai đối số của nó

sum = lambda x, y : x + y
sum(3,4)

ĐẦU RA

7

Ví dụ trên có thể trông giống như một món đồ chơi cho một nhà toán học. Chủ nghĩa hình thức biến một vấn đề dễ hiểu thành trừu tượng, khó nắm bắt hơn. Trên hết, chúng ta có thể có tác dụng tương tự bằng cách chỉ sử dụng định nghĩa hàm thông thường sau đây

def sum(x,y):
    return x + y
sum(3,4)

ĐẦU RA

7

Chúng tôi có thể đảm bảo với bạn rằng những ưu điểm của phương pháp này sẽ rõ ràng khi bạn học cách sử dụng hàm map()

Hàm map()

Như chúng tôi đã đề cập trước đó, lợi thế của toán tử lambda có thể được nhìn thấy khi nó được sử dụng kết hợp với hàm map(). map() là một hàm nhận hai đối số

r = bản đồ (func, seq)

Đối số đầu tiên func là tên của một hàm và đối số thứ hai là một chuỗi (e. g. một danh sách) seq. map() áp dụng hàm func cho tất cả các phần tử của chuỗi seq. Trước Python3, map() được sử dụng để trả về một danh sách, trong đó mỗi phần tử của danh sách kết quả là kết quả của hàm func được áp dụng trên phần tử tương ứng của danh sách hoặc bộ "seq". Với Python 3, map() trả về một iterator

Ví dụ sau minh họa cách thức hoạt động của map()

def fahrenheit(T):
    return ((float(9)/5)*T + 32)
def celsius(T):
    return (float(5)/9)*(T-32)
temperatures = (36.5, 37, 37.5, 38, 39)
F = map(fahrenheit, temperatures)
C = map(celsius, F)
temperatures_in_Fahrenheit = list(map(fahrenheit, temperatures))
temperatures_in_Celsius = list(map(celsius, temperatures_in_Fahrenheit))
print(temperatures_in_Fahrenheit)
print(temperatures_in_Celsius)

ĐẦU RA

[97.7, 98.60000000000001, 99.5, 100.4, 102.2]
[36.5, 37.00000000000001, 37.5, 38.00000000000001, 39.0]

Trong ví dụ trên, chúng tôi chưa sử dụng lambda. Bằng cách sử dụng lambda, chúng ta sẽ không phải định nghĩa và đặt tên cho các hàm fahrenheit() và celsius(). Bạn có thể thấy điều này trong phiên tương tác sau

C = [39.2, 36.5, 37.3, 38, 37.8] 
F = list(map(lambda x: (float(9)/5)*x + 32, C))
print(F)

ĐẦU RA

[102.56, 97.7, 99.14, 100.4, 100.03999999999999]

________số 8

ĐẦU RA

[39.2, 36.5, 37.300000000000004, 38.00000000000001, 37.8]

map() có thể được áp dụng cho nhiều danh sách. Các danh sách không nhất thiết phải có cùng độ dài. map() sẽ áp dụng hàm lambda của nó cho các thành phần của danh sách đối số, tôi. e. đầu tiên nó áp dụng cho các phần tử có chỉ số thứ 0, sau đó áp dụng cho các phần tử có chỉ số thứ nhất cho đến khi đạt được chỉ số thứ n

7
0

7
1

ĐẦU RA

7
2

7
3

ĐẦU RA

7
4

7
5

ĐẦU RA

7
6

Nếu một danh sách có ít phần tử hơn các phần tử khác, bản đồ sẽ dừng khi danh sách ngắn nhất đã được sử dụng hết

7
7

ĐẦU RA

7
8

Chúng ta có thể thấy trong ví dụ trên rằng tham số x nhận các giá trị của nó từ danh sách a, trong khi y nhận các giá trị của nó từ b và z từ danh sách c

Đào tạo Python trực tiếp

Python lambda x không có trong danh sách

Thưởng thức trang này?

Nhìn thấy. Tổng quan về các khóa học Python trực tiếp

đăng ký tại đây

Ánh xạ một danh sách các chức năng

Chức năng bản đồ của chương trước đã được sử dụng để áp dụng một chức năng cho một hoặc nhiều lần lặp. Bây giờ chúng ta sẽ viết một hàm áp dụng một loạt các hàm, có thể là một hàm có thể lặp lại, chẳng hạn như một danh sách hoặc một bộ, cho một đối tượng Python

7
9

ĐẦU RA

def sum(x,y):
    return x + y
sum(3,4)
0

Hàm map_functions đã xác định trước đó có thể được đơn giản hóa bằng kỹ thuật hiểu danh sách mà chúng tôi sẽ trình bày trong chương hiểu danh sách

def sum(x,y):
    return x + y
sum(3,4)
1

lọc

Chức năng

bộ lọc (chức năng, trình tự)

cung cấp một cách tinh tế để lọc ra tất cả các phần tử của một chuỗi "trình tự", mà hàm hàm trả về True. tôi. e. một mục sẽ được tạo bởi kết quả lặp của bộ lọc (hàm, trình tự) nếu mục được bao gồm trong chuỗi "trình tự" và nếu hàm (mục) trả về True

Nói cách khác. Hàm filter(f,l) cần một hàm f làm đối số đầu tiên của nó. f phải trả về một giá trị Boolean, i. e. Đúng hoặc Sai. Hàm này sẽ được áp dụng cho mọi phần tử của danh sách l. Chỉ khi f trả về True thì phần tử mới được tạo bởi trình vòng lặp, đó là giá trị trả về của bộ lọc(hàm, trình tự)

Trong ví dụ sau, trước tiên chúng ta lọc ra các phần tử lẻ và sau đó là các phần tử chẵn của dãy 11 số Fibonacci đầu tiên

def sum(x,y):
    return x + y
sum(3,4)
2

ĐẦU RA

def sum(x,y):
    return x + y
sum(3,4)
3

def sum(x,y):
    return x + y
sum(3,4)
4

ĐẦU RA

def sum(x,y):
    return x + y
sum(3,4)
5

def sum(x,y):
    return x + y
sum(3,4)
6

ĐẦU RA

def sum(x,y):
    return x + y
sum(3,4)
5

Đào tạo Python trực tiếp

Python lambda x không có trong danh sách

Thưởng thức trang này?

Nhìn thấy. Tổng quan về các khóa học Python trực tiếp

Các khóa học trực tuyến sắp tới

Khóa học nâng cao chuyên sâu

Python dành cho kỹ sư và nhà khoa học

đăng ký tại đây

Giảm một danh sách

Như chúng tôi đã đề cập trong phần giới thiệu chương này của hướng dẫn của chúng tôi. reduce() đã bị xóa khỏi lõi của Python khi chuyển sang Python 3. Guido van Rossum ghét reduce(), như chúng ta có thể học được từ tuyên bố của anh ấy trong một bài đăng, ngày 10 tháng 3 năm 2005, trên artima. com

def sum(x,y):
    return x + y
sum(3,4)
8

Chức năng

giảm (func, seq)

liên tục áp dụng hàm func() cho chuỗi seq. Nó trả về một giá trị duy nhất

Nếu seq = [ s1, s2, s3,. , sn ], lệnh gọi reduce(func, seq) hoạt động như thế này

def sum(x,y):
    return x + y
sum(3,4)
9

Nếu n bằng 4, lời giải thích trước đó có thể được minh họa như thế này

Python lambda x không có trong danh sách

Chúng tôi muốn minh họa cách làm việc này của reduce() bằng một ví dụ đơn giản. Chúng tôi phải nhập funcools để có thể sử dụng giảm

7
0

ĐẦU RA

7
1

Sơ đồ sau đây cho thấy các bước trung gian của phép tính

Python lambda x không có trong danh sách

Ví dụ về giảm()

Xác định mức tối đa của danh sách các giá trị số bằng cách sử dụng giảm

7
2

ĐẦU RA

7
3

Tính tổng các số từ 1 đến 100

7
4

ĐẦU RA

7
5

Rất đơn giản để thay đổi ví dụ trước để tính tích (giai thừa) từ 1 thành một số, nhưng không chọn 100. Chúng ta chỉ cần biến toán tử "+" thành "*"

7
6

ĐẦU RA

7
7

Nếu bạn tham gia xổ số, đây là cơ hội để giành được 6 trên 49 bản vẽ

7
8

ĐẦU RA

7
9

Đào tạo Python trực tiếp

Python lambda x không có trong danh sách

Thưởng thức trang này?

Nhìn thấy. Tổng quan về các khóa học Python trực tiếp

đăng ký tại đây

bài tập

1) Hãy tưởng tượng một thói quen kế toán được sử dụng trong một hiệu sách. Nó hoạt động trên một danh sách với các danh sách con, giống như thế này

def fahrenheit(T):
    return ((float(9)/5)*T + 32)
def celsius(T):
    return (float(5)/9)*(T-32)
temperatures = (36.5, 37, 37.5, 38, 39)
F = map(fahrenheit, temperatures)
C = map(celsius, F)
temperatures_in_Fahrenheit = list(map(fahrenheit, temperatures))
temperatures_in_Celsius = list(map(celsius, temperatures_in_Fahrenheit))
print(temperatures_in_Fahrenheit)
print(temperatures_in_Celsius)
0

2) Cùng một hiệu sách, nhưng lần này chúng tôi làm việc trên một danh sách khác. Danh sách con của danh sách của chúng tôi trông như thế này. [số đơn đặt hàng, (số mặt hàng, số lượng, giá mỗi đơn vị),. (số mặt hàng, số lượng, giá mỗi đơn vị) ] Viết chương trình trả về danh sách hai bộ với (số đơn hàng, tổng số lượng đơn hàng)

X trong lambda Python là gì?

Hàm lambda đánh giá một biểu thức cho một đối số đã cho. Bạn cung cấp cho hàm một giá trị (đối số) và sau đó cung cấp thao tác (biểu thức). Từ khóa lambda phải đến trước. Dấu hai chấm đầy đủ (. ) ngăn cách đối số và biểu thức. Trong mã ví dụ bên dưới, x là đối số và x+x là biểu thức.

Bạn có thể sử dụng lambda để hiểu danh sách không?

Hiểu danh sách không phải là cách duy nhất để làm việc trên danh sách. Các hàm lambda và hàm tích hợp sẵn khác nhau có thể tạo và sửa đổi danh sách với ít dòng mã hơn .

Chúng ta có thể chuyển danh sách tới hàm lambda trong Python không?

Có thể chuyển danh sách vào hàm lambda , nhưng không thể sử dụng danh sách với toán tử **.

Chức năng lambda có thể lặp qua danh sách không?

Biểu thức lambda là mã nội tuyến triển khai giao diện chức năng mà không cần tạo lớp ẩn danh. Trong Java 8, câu lệnh forEach có thể được sử dụng cùng với biểu thức lambda giúp giảm vòng lặp qua Bản đồ thành một câu lệnh đơn và cũng lặp qua các phần tử của danh sách.