images
21/12/2020 07:33 am

Sử dụng Python với Generator và Lambda

Dưới đây Tech Zone sẽ giới thiệu một số tips khi sử dụng Python với Generator và Lambda:

Filter


Bạn sử dụng Filter để lọc các phần tử trong một danh sách. Cần có function trả về true/false để lọc ra giá trị cần tìm.


def filter_func(item):

   return len(item) > 5

list = ["python", "java", "golang","javascript", "ruby", "scala","python", "dart","python", "java", "golang"]


filtered_list = filter(filter_func, list)


Lưu ý: Kết quả trả về là 1 filter object. Ta cần cast nếu muốn chuyển dạng list: list(filtered_list)


Sử dụng hàm filter để tìm trong danh sách các từ giống với RUBY, ruBy, RuBy… tức không phân biệt chữ hoa chữ thường.


Filter sử dụng Lambda


Một cách ngắn gọn, bạn có thể dùng hàm lambda như sau:


list = ["python", "java", "golang","javascript", "ruby", "scala","python", "dart","python", "java", "golang"]

filtered_list = filter(lambda item: len(item) > 5, list)


Generator


Generator  được tạo ra khi trong hàm, chúng ta sử dụng từ khóa yield. Hàm này sẽ chỉ chạy tiếp khi phương thức next() được gọi. Do các phần tử được tính toán tại thời điểm gọi nên sẽ không tốn bộ nhớ cho việc lưu các phần tử chưa dùng tới. Tuy nhiên bạn cũng cần lưu ý để áp dụng Generator tuỳ vào từng bài toán cụ thể.


Lọc - tạo mới phần tử


Giả sử bạn muốn lọc phần tử từ mảng hoặc tạo ra mảng mới từ mảng đang có. Bạn có thể dùng lọc với mảng để trả về một mảng hoặc trả về một Generator. Với Generator, bạn sẽ tiết kiệm được bộ nhớ.


Giả sử bạn muốn tạo ra một mảng các số mới là bình phương của các số trong mảng đã có:


x = [1,2,3,4,5]

y = [x1 * x1 for x1 in x]

print(y)


[1, 4, 9, 16, 25]


Nếu muốn, bạn có thể tạo ra list từ generator, bằng cách như sau:



x = [1,2,3,4,5]

y = [x1 * x1 for x1 in x]

 z = list(y)


Tuy nhiên sau bước này bạn sẽ không thể gọi next(y)


Nếu muốn lấy kết quả là một generator bạn làm như sau:


x = [1,2,3,4,5,6,7,8,9,10]

y = (x1 * x1 for x1 in x)

print(y)

print(next(y))

print(next(y))

Kết quả:

<generator object <genexpr> at 0x1071a9138>

1

4


Giả sử bạn muốn lấy ra phần tử chẵn của mảng thành mảng mới, bạn có 2 cách sau:


x = [1,2,3,4,5]

y = [x1 for x1 in x if x1%2==0]

print(y) // [2, 4]


x = [1,2,3,4,5]

y1 = (x1 for x1 in x if x1%2==0)

print(y1)

// <generator object <genexpr> at 0x10bdc2138>


Mời các bạn đọc thêm bài Các Tips hay trong Python - Phần 2.


- Tech Zone -


Thư giãn chút nào!!!

Bài viết liên quan