icantech
Lập trình Python
2950
27/12/2023

Yield Python là gì? Tất cả những gì bạn cần biết về Yield trong Python

Trong ngôn ngữ lập trình Python, yield không đơn giản chỉ là một khái niệm mà còn đóng vai trò như một công cụ quan trọng giúp tối ưu hóa xử lý dữ liệu và nâng cao hiệu suất. Trong bài viết dưới đây, hãy cùng ICANTECH tìm hiểu về yield trong Python nhé!

1. Tổng quan về yield trong Python

1.1. Giới thiệu về generator

Generator trong Python là một dạng của iterator và iterable. Có thể lặp qua các giá trị, sau khi đã duyệt qua từng phần tử thì không thể tái sử dụng lại. Generator không lưu trữ tất cả các giá trị trong bộ nhớ cùng một lúc mà nó sinh ra các giá trị khi cần thiết, giúp tiết kiệm bộ nhớ và tối ưu hóa hiệu suất.

def even_numbers(n):

    i = 0

    while i < n:

        yield 2 * i  # trả về số chẵn

        i += 1

# Khởi tạo generator

gen = even_numbers(5)

# Sử dụng vòng lặp để lấy các số chẵn từ generator

for num in gen:

    print(num)

Kết quả nhận được kết quả là các số chẵn từ 0 đến 8 (được sinh ra từ generator) in ra màn hình một cách tuần tự.

1.2. Yield trong Python 

“yield” trong Python (hay còn gọi là Python yield) là một từ khóa giống return, giúp trả về giá trị từ một hàm mà không làm mất giá trị của các biến trong hàm đó. Cho phép hàm tạm dừng tại vị trí “yield”, và khi gọi lại hàm, quá trình thực thi sẽ tiếp tục tại vị trí đó. Một hàm với yield được coi là một generator object, cho phép bạn duyệt qua nó như một iterator.

Ví dụ: 

def generate_numbers():

    yield 1

    yield 5

    yield 9

for i in generate_numbers():

    print(i)

Kết quả

1

5

9

Sau mỗi lần lặp thì hàm được gọi, lúc này câu lệnh yield tương tự return  sẽ trả về các giác trị 1, 5, 9 từ 3 lần lặp.

1.3. Tại sao nên sử dụng Yield trong Python?

Dưới đây là một số lý do bạn nên sử dụng Yield trong Python:

  • Tiết kiệm bộ nhớ: Không cần lưu trữ tất cả các giá trị trong một danh sách hoặc bộ nhớ tạm thời. Thay vào đó, bạn chỉ lưu giữ trạng thái cần thiết cho việc tính toán tiếp theo. 
  • Tối ưu hóa hiệu suất: Với việc tính toán giá trị trực tiếp mà không cần phải lưu trữ toàn bộ chuỗi giá trị, yield giúp bạn tăng cường hiệu suất và giảm thiểu thời gian xử lý. Điều này đặc biệt quan trọng khi bạn cần xử lý dữ liệu trực tiếp từ nguồn dữ liệu không giới hạn, như đọc từ tệp lớn hoặc dữ liệu trực tuyến.
  • Linh hoạt và sử dụng tài nguyên hiệu quả: Có thể tạo ra các chuỗi giá trị hoặc dữ liệu một cách linh hoạt mà không cần phải tính toán và lưu trữ toàn bộ chuỗi từ đầu đến cuối. Giúp bạn tối ưu hóa việc sử dụng tài nguyên và cung cấp một cách tiếp cận linh hoạt để xử lý dữ liệu.
  • Dễ dàng đọc và hiểu: Sử dụng yield trong Python giúp chương trình của bạn trở nên ngắn gọn và dễ đọc hơn, tập trung vào logic cụ thể của mỗi bước tính toán thay vì việc quản lý toàn bộ dữ liệu.

2. So sánh giữa return và yield

2.1. Return - Trả về giá trị và kết thúc hàm

Khi bạn sử dụng return trong một hàm, hàm sẽ trả về giá trị đã chỉ định và kết thúc thực thi ngay lập tức. Tất cả các biến cục bộ trong hàm sẽ bị xóa sau khi hàm kết thúc.

Không lưu trữ trạng thái: Một khi hàm kết thúc, bạn không thể tiếp tục từ trạng thái cuối cùng của nó.

Ví dụ với return:

def simple_return():

    print("Hàm bắt đầu.")

    return 10

    print("Dòng này sẽ không được thực thi.")

result = simple_return()

print(result)  # In ra: 10

2.2. Yield - Tạm dừng và tiếp tục

Khi bạn sử dụng yield, hàm sẽ tạm dừng và trả về giá trị được chỉ định. Khi gọi hàm lại, nó sẽ tiếp tục thực thi từ vị trí yield cuối cùng mà nó đã dừng lại, giữ trạng thái của tất cả các biến cục bộ.

Lưu trữ trạng thái: yield cho phép bạn lưu trữ trạng thái của biến và tiếp tục thực thi từ trạng thái đó.

Ví dụ với yield:

def simple_yield():

    print("Bắt đầu hàm.")

    yield 1

    print("Tiếp tục từ yield đầu tiên.")

    yield 2

    print("Tiếp tục từ yield thứ hai.")

gen = simple_yield()

print(next(gen))  # In ra: 1

print(next(gen))  # In ra: 2

  • return trả về một giá trị và kết thúc hàm, trong khi yield trả về một giá trị nhưng tạm dừng và lưu trạng thái.
  • return không lưu trạng thái của hàm, còn yield cho phép bạn lưu trữ và tiếp tục từ trạng thái cuối cùng.

3. Sử dụng iterators với yield trong Python

Bạn có thể sử dụng yield để tạo ra iterators (bộ lặp). Khi sử dụng yield trong một hàm, hàm đó trở thành một generator object, và bạn có thể sử dụng nó để lặp qua chuỗi giá trị. Ví dụ như: Tạo một iterator sử dụng yield

def fibonacci_sequence(n):

    a, b = 0, 1

    count = 0

    while count < n:

        yield a

        a, b = b, a + b

        count += 1

# Khởi tạo iterator (generator object)

fib_gen = fibonacci_sequence(10)

# Lặp qua các giá trị trong iterator

for num in fib_gen:

    print(num)

Khi chạy chương trình trên, sẽ in ra 10 số đầu tiên trong dãy Fibonacci một cách tuần tự.

Lợi ích của việc sử dụng iterators với yield:

  • Tiết kiệm bộ nhớ: Không cần lưu trữ tất cả các giá trị trong bộ nhớ cùng một lúc. Thay vào đó, bạn có thể duyệt qua từng giá trị khi cần thiết.
  • Tối ưu hóa hiệu suất: Khi xử lý dữ liệu lớn, việc sử dụng iterators giúp tối ưu hóa hiệu suất và giảm thiểu việc tiêu tốn tài nguyên.
  • Tính linh hoạt: Bạn có thể dễ dàng tạo ra các chuỗi giá trị phức tạp hoặc lặp qua dữ liệu mà không cần xử lý toàn bộ dữ liệu một lần.

4. Lời Kết

Như vậy, ICANTECH đã cùng bạn tìm hiểu tổng quan về yield trong Python cũng như tầm quan trọng và ưu điểm của nó. Hi vọng bạn sẽ áp dụng các kiến thức trên để tối ưu cho công việc của mình. 

Cảm ơn bạn đã đọc bài viết, nếu bạn đang quan tâm đến học lập trình thì hãy tham khảo ngay các khóa học lập trình dưới đây tại ICANTECH nhé

Nguồn ảnh: ICANTECH.

Share
Tags
Lập trình Python

Bài tương tự