Hàm enumerate () trong Python, được giải thích với các ví dụ

Spread the love

Hướng dẫn này sẽ dạy bạn cách sử dụng hàm enumerate () trong Python.

Hàm enumerate () trong Python cung cấp một cú pháp ngắn gọn để truy cập các mục trong một tệp có thể lặp lại cùng với các chỉ số của chúng.

Chúng ta sẽ bắt đầu bằng cách xem xét cách truy cập các mục và chỉ số bằng cách sử dụng vòng lặp đơn giản và sau đó tiến hành tìm hiểu cú pháp của hàm enumerate () của Python. Chúng tôi cũng sẽ viết mã các ví dụ trong quá trình thực hiện.

Hãy bắt đầu nào.

Cách lặp lại bằng cách sử dụng vòng lặp trong Python

Bất kỳ đối tượng Python nào mà bạn có thể lặp lại và truy cập các mục riêng lẻ — từng mục một được gọi là có thể lặp lại. Do đó, danh sách Python, bộ giá trị, từ điển và chuỗi đều là các tệp lặp lại.

Hãy lấy một ví dụ về danh sách mua sắm được xác định trong ô mã bên dưới.

shopping_list = ["fruits","cookies","cereals","protein bars","post-it notes"]

Trong Python, bạn có thể sử dụng vòng lặp for để lặp qua bất kỳ vòng lặp nào có thể lặp lại. Cú pháp để thực hiện việc này như sau:

for item in <iterable>:
    # do something on item

# item: looping variable
# <iterable>: any Python iterable: list, tuple, dictionary, string, and so on.

Bây giờ, sử dụng cú pháp này, chúng ta hãy lặp lại shopping_list và truy cập từng mục riêng lẻ.

for item in shopping_list:
  print(item)

# Output
fruits
cookies
cereals
protein bars
post-it notes

Cấu trúc này giúp bạn truy cập các mục trực tiếp. Tuy nhiên, đôi khi bạn có thể cần truy cập vào chỉ mục của các mục, ngoài chính các mục đó.

Bạn có thể sử dụng một biến chỉ mục, mà bạn có thể tăng lên bên trong thân vòng lặp, như được hiển thị bên dưới:

index = 0
for item in shopping_list:
  print(f"index:{index}, {item}")
  index += 1

# Output
index:0, fruits
index:1, cookies
index:2, cereals
index:3, protein bars
index:4, post-it notes

Nhưng đây không phải là phương pháp hiệu quả nhất. Nếu bạn không nhớ tăng chỉ số, mã của bạn sẽ không hoạt động như mong đợi.

index = 0
for item in shopping_list:
  print(f"index:{index}, {item}")
  # no update of index inside loop body
  # index is never updated and is always 0

# Output
index:0, fruits
index:0, cookies
index:0, cereals
index:0, protein bars
index:0, post-it notes

Một mẫu phổ biến khác của việc sử dụng vòng lặp for là kết hợp với hàm range (). Chúng ta sẽ tìm hiểu về điều đó trong phần tiếp theo.

  Tạm dừng và tiếp tục tải lên lớn khi truyền tệp trực tuyến

Cách sử dụng hàm range () để truy cập chỉ mục

Hàm len () tích hợp sẵn của Python trả về độ dài của bất kỳ đối tượng Python nào. Vì vậy, bạn có thể gọi hàm len () với đối số shopping_list để lấy độ dài của shopping_list (trong trường hợp này là 5).

len(shopping_list)
# Output: 5

Hàm range () trả về một đối tượng dải ô mà sau đó bạn có thể sử dụng trong vòng lặp. Khi bạn lặp qua phạm vi (dừng), bạn nhận được các chỉ số 0, 1, 2,…, dừng-1.

Bằng cách đặt stop = len (list), bạn có thể nhận được danh sách các chỉ số hợp lệ. Vì vậy, bằng cách sử dụng hàm range (), bạn có thể truy cập chỉ mục cũng như mục tương ứng, như hình dưới đây.

for index in range(len(shopping_list)):
  print(f"index:{index}, item: {shopping_list[index]}")

# Output
index:0, item: fruits
index:1, item: cookies
index:2, item: cereals
index:3, item: protein bars
index:4, item: post-it notes

Tuy nhiên, đây không phải là cách Pythonic khuyến nghị để truy cập đồng thời cả chỉ số và mục.

Cú pháp của hàm enumerate () trong Python

Hàm enumerate () của Python cho phép bạn truy cập các mục cùng với các chỉ mục của chúng bằng cú pháp chung sau:

enumerate(<iterable>, start = 0)

Trong cú pháp trên:

  • là một tham số bắt buộc và nó có thể là bất kỳ tham số Python nào có thể lặp lại, chẳng hạn như danh sách hoặc tuple.
  • start là một tham số tùy chọn kiểm soát chỉ số bắt đầu đếm. Nếu bạn không chỉ định giá trị của start, nó sẽ mặc định là 0.

Bây giờ bạn có thể gọi hàm enumerate () với shopping_list và nó trả về một đối tượng liệt kê, như được hiển thị trong ô mã bên dưới.

enumerate(shopping_list)
<enumerate at 0x7f91b4240410>

Bạn không thể lặp qua đối tượng liệt kê. Vì vậy, hãy chuyển đổi đối tượng liệt kê thành một danh sách Python.

list(enumerate(shopping_list))

# Output
[(0, 'fruits'),
 (1, 'cookies'),
 (2, 'cereals'),
 (3, 'protein bars'),
 (4, 'post-it notes')]

Một phương pháp khác để truy cập các mục của đối tượng liệt kê là gọi hàm next () với đối tượng liệt kê làm đối số. Trong Python, hàm next () trả về mục tiếp theo từ một trình vòng lặp.

Bên trong, hàm next () hoạt động bằng cách gọi phương thức __next__ trên đối tượng vòng lặp để truy xuất các mục kế tiếp.

Hãy gán đối tượng liệt kê cho biến shopping_list_enum.

shopping_list_enum = enumerate(shopping_list)

Khi bạn lần đầu tiên gọi next () với shopping_list_enum, bạn sẽ nhận được chỉ mục 0 và mục ở chỉ mục 0: tuple (0, ‘fruit’).

Khi bạn tiếp tục thực hiện thêm các lệnh gọi tới hàm next (), bạn sẽ nhận được các mục kế tiếp cùng với các chỉ số của chúng, như được mô tả bên dưới.

next(shopping_list_enum)
# (0, 'fruits')
next(shopping_list_enum)
# (1, 'cookies')
next(shopping_list_enum)
# (2, 'cereals')
next(shopping_list_enum)
# (3, 'protein bars')
next(shopping_list_enum)
# (4, 'post-it notes')

Điều gì xảy ra nếu bạn gọi hàm next () sau khi bạn đã truy cập tất cả các mục và đã đến cuối danh sách? Bạn gặp lỗi StopIteration.

next(shopping_list_enum)
# ---------------------------------------------------------------------------
StopIteration                             Traceback (most recent call last)
<ipython-input-16-4220f68f6c7e> in <module>()
----> 1 next(shopping_list_enum)

StopIteration:

Hàm enumerate () chỉ trả về các chỉ số và mục kế tiếp khi cần thiết và không được tính toán trước. Trong các dự án Python mà bạn cần tính đến hiệu suất bộ nhớ, bạn có thể thử sử dụng hàm enumerate () khi bạn cần lặp qua các tệp lặp lớn.

Ví dụ về hàm enumerate () trong Python

Bây giờ chúng ta đã học cú pháp để sử dụng hàm enumerate (), chúng ta hãy sửa đổi vòng lặp for mà chúng ta đã có trước đó.

Từ phần trước, chúng ta đã biết rằng việc lặp qua đối tượng liệt kê sẽ trả về một bộ giá trị với chỉ mục và mục. Chúng ta có thể giải nén bộ này thành hai biến: chỉ mục và mục.

for index, item in enumerate(shopping_list):
  print(f"index:{index}, item:{item}")

# Output
index:0, item:fruits
index:1, item:cookies
index:2, item:cereals
index:3, item:protein bars
index:4, item:post-it notes

Tiếp theo, hãy xem cách chỉ định giá trị bắt đầu tùy chỉnh.

Cách liệt kê () với Giá trị Bắt đầu Tùy chỉnh

Python tuân theo lập chỉ mục bằng 0, vì vậy giá trị bắt đầu là 0 theo mặc định. Tuy nhiên, nếu bạn cần các chỉ mục ở dạng con người có thể đọc được — bắt đầu từ 1 hoặc bất kỳ chỉ mục nào khác mà bạn chọn, bạn có thể chỉ định giá trị bắt đầu tùy chỉnh.

Trong ví dụ về shopping_list, nếu bạn muốn bắt đầu đếm từ 1, hãy đặt start = 1.

for index, item in enumerate(shopping_list,1):
  print(f"index:{index}, item:{item}")

# Output
index:1, item:fruits
index:2, item:cookies
index:3, item:cereals
index:4, item:protein bars
index:5, item:post-it notes

Tuy nhiên, khi chỉ định giá trị bắt đầu tùy chỉnh, bạn nên chắc chắn chỉ định nó làm đối số vị trí thứ hai.

Nếu bạn trao đổi nhầm thứ tự của giá trị có thể lặp lại và giá trị bắt đầu, bạn sẽ gặp phải lỗi, như được giải thích trong ô mã bên dưới.

for index, item in enumerate(1,shopping_list):
  print(f"index:{index}, item:{item}")

# Output
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-12-5dbf7e2749aa> in <module>()
----> 1 for index, item in enumerate(1,shopping_list):
      2   print(f"index:{index}, item:{item}")

TypeError: 'list' object cannot be interpreted as an integer

Để tránh những lỗi như vậy, bạn có thể chỉ định bắt đầu làm đối số từ khóa, như được hiển thị bên dưới.

for index, item in enumerate(shopping_list, start = 1):
  print(f"index:{index}, item:{item}")

# Output
index:1, item:fruits
index:2, item:cookies
index:3, item:cereals
index:4, item:protein bars
index:5, item:post-it notes

Cho đến nay, bạn đã học cách sử dụng hàm enumerate () với danh sách Python. Bạn cũng có thể sử dụng hàm liệt kê để lặp qua các chuỗi, từ điển và bộ giá trị trong Python.

Cách sử dụng hàm enumerate () với Python Tuples

Giả sử danh sách mua sắm là một bộ giá trị. Trong Python, các bộ giá trị cũng là các tập hợp — tương tự như danh sách Python, nhưng chúng là bất biến. Do đó, bạn không thể sửa đổi chúng và cố gắng làm như vậy sẽ dẫn đến lỗi.

Đoạn mã sau khởi tạo shopping_list dưới dạng một bộ.

shopping_list = ("fruits","cookies","cereals","protein bars","post-it notes")
type(shopping_list)
# Tuple

Nếu bạn cố gắng sửa đổi mục đầu tiên trong tuple, bạn sẽ gặp lỗi vì tuple Python là một tập hợp bất biến.

shopping_list[0] = 'vegetables'

# Output
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-2-ffdafa961600> in <module>()
----> 1 shopping_list[0] = 'vegetables'

TypeError: 'tuple' object does not support item assignment

▶ Bây giờ, hãy chạy đoạn mã sau để xác minh rằng hàm enumerate () hoạt động như mong đợi với các bộ giá trị.

shopping_list = ("fruits","cookies","cereals","protein bars","post-it notes")
for index, item in enumerate(shopping_list):
    print(f"index:{index}, item:{item}")

Cách sử dụng hàm enumerate () với chuỗi Python

Bạn cũng có thể sử dụng hàm enumerate () trong Python để lặp qua các chuỗi và truy cập đồng thời các ký tự và chỉ số.

Đây là một ví dụ.

py_str="Butterfly"
for index, char in enumerate(py_str):
  print(f"index {index}: {char}")

# Output
index 0: B
index 1: u
index 2: t
index 3: t
index 4: e
index 5: r
index 6: f
index 7: l
index 8: y

Từ đầu ra ở trên, chúng ta thấy rằng các ký tự cùng với các chỉ số (0-8) của chúng đã được in ra.

Kết luận👩🏽‍💻

Đây là bản tóm tắt những gì bạn đã học được.

  • Bạn có thể sử dụng vòng lặp for để truy cập các mục và duy trì một bộ đếm hoặc biến chỉ mục riêng biệt.
  • Nếu muốn, bạn có thể sử dụng hàm range () để lấy các chỉ số hợp lệ và truy cập các mục bằng cách lập chỉ mục vào danh sách.
  • Theo cách Pythonic đề xuất, bạn có thể sử dụng hàm enumerate () của Python với cú pháp: enumerate (có thể lặp lại). Theo mặc định, số lượng hoặc chỉ số bắt đầu từ 0.
  • Bạn có thể chỉ định giá trị bắt đầu tùy chỉnh bằng kiểu liệt kê cú pháp (có thể lặp lại, bắt đầu) để lấy chỉ mục bắt đầu từ giá trị bắt đầu và các mục tương ứng.
  • Bạn có thể sử dụng hàm liệt kê khi làm việc với bộ dữ liệu, chuỗi, từ điển và nói chung, bất kỳ Python nào có thể lặp lại.

Tôi hy vọng bạn thấy hướng dẫn này về hàm enumerate () hữu ích. Tiếp theo, hãy tìm hiểu cách tìm chỉ mục của một mục trong danh sách Python. Tiếp tục viết mã!

x