Range Python: Vượt Mọi Giới Hạn, Đếm Không Giới Hạn!
Python

Range Python: Vượt Mọi Giới Hạn, Đếm Không Giới Hạn!

Author

Admin System

@root

Ngày xuất bản

19 Mar, 2026

Lượt xem

3 Lượt

range

Chào các "coder nhí" tương lai và những "dev gạo cội" đang tìm kiếm kiến thức mới! Giảng viên Creyt đây, hôm nay chúng ta sẽ cùng "mổ xẻ" một khái niệm "nhỏ mà có võ" trong Python, đó là range. Nghe có vẻ đơn giản, nhưng nếu không hiểu rõ, bạn sẽ dễ biến code của mình thành "cục tạ" đấy!

1. range là gì mà "hot" thế?

Nếu phải dùng một phép ẩn dụ cho Gen Z, thì range trong Python giống như một "playlist cá nhân thông minh" trên Spotify vậy. Nó biết được tất cả các bài hát bạn muốn nghe (chuỗi số), biết thứ tự phát, nhưng nó KHÔNG TẢI TẤT CẢ bài hát về máy bạn cùng một lúc. Thay vào đó, nó chỉ "stream" từng bài một khi bạn yêu cầu. "Xịn" chưa?

Nói một cách hàn lâm hơn (kiểu Harvard nhưng dễ hiểu thôi), range là một đối tượng bất biến (immutable sequence) đại diện cho một chuỗi số. Nó không thực sự tạo ra và lưu trữ tất cả các số trong bộ nhớ ngay lập tức. Thay vào đó, nó chỉ tạo ra các số khi bạn cần đến chúng, từng số một. Đây chính là chìa khóa của sự hiệu quả về bộ nhớtốc độ của range.

Để làm gì? Đơn giản là để bạn "đếm số auto" mà không cần phải "suy" nhiều. Thường dùng nhất là trong các vòng lặp for khi bạn muốn lặp lại một hành động một số lần nhất định, hoặc khi bạn cần các chỉ số (index) để truy cập các phần tử trong danh sách.

2. "Công Thức" của range (Code Ví Dụ)

range có ba "công thức" chính, dễ nhớ lắm:

a. range(stop): Đếm từ 0 đến "gần chạm" stop

Đây là cách dùng cơ bản nhất. Nó sẽ tạo ra một chuỗi số bắt đầu từ 0 và kết thúc ở stop - 1.

# Ví dụ 1: Đếm từ 0 đến 4
print(list(range(5))) # Output: [0, 1, 2, 3, 4]

print("--- Đếm xuôi từ 0 ---")
for i in range(5):
    print(f"Đang ở số: {i}")
# Output:
# Đang ở số: 0
# Đang ở số: 1
# Đang ở số: 2
# Đang ở số: 3
# Đang ở số: 4

b. range(start, stop): Đếm từ start đến "gần chạm" stop

Bạn muốn bắt đầu đếm từ một số khác 0? Dùng cách này. Chuỗi số sẽ bắt đầu từ start và kết thúc ở stop - 1.

# Ví dụ 2: Đếm từ 2 đến 5
print(list(range(2, 6))) # Output: [2, 3, 4, 5]

print("--- Đếm xuôi từ 2 ---")
for i in range(2, 6):
    print(f"Đang ở số: {i}")

c. range(start, stop, step): Đếm từ start đến "gần chạm" stop, nhảy step một

Đây là "phiên bản nâng cấp", cho phép bạn điều khiển cả bước nhảy. step có thể là số dương (đếm tiến) hoặc số âm (đếm lùi).

# Ví dụ 3: Đếm từ 0 đến 9, bước nhảy 2
print(list(range(0, 10, 2))) # Output: [0, 2, 4, 6, 8]

print("--- Đếm bước 2 ---")
for i in range(0, 10, 2):
    print(f"Đang ở số: {i}")

# Ví dụ 4: Đếm ngược từ 5 về 1 (step âm)
# Lưu ý: Với step âm, stop phải NHỎ HƠN start
print(list(range(5, 0, -1))) # Output: [5, 4, 3, 2, 1]

print("--- Đếm ngược ---")
for i in range(5, 0, -1):
    print(f"Đang ở số: {i}")
Illustration

3. Mẹo "hack não" và Best Practices từ Giảng viên Creyt

  • "Luật Biên Giới": Hãy nhớ kỹ, tham số stop luôn độc quyền (exclusive). Nó giống như một cái hàng rào biên giới, bạn có thể đi đến gần sát nó, nhưng không bao giờ được phép đặt chân vào nó. Luôn là stop - 1 nhé!

  • "Bộ Nhớ Vô Hình": range là một "quái vật" tiết kiệm bộ nhớ. Nó không tạo ra một danh sách (list) khổng lồ các số. Vì vậy, đừng dại dột mà "ép" nó thành list (như list(range(1000000000))) nếu bạn không thực sự cần lưu trữ tất cả các số đó. Dùng trực tiếp trong for loop là cách "xịn" nhất.

  • "Đi Đúng Đường": Dùng range khi bạn cần lặp lại một số lần cố định, hoặc khi bạn cần các chỉ số (index) để làm việc với các phần tử trong một cấu trúc dữ liệu khác (ví dụ: for i in range(len(my_list)): print(my_list[i])).

  • "Đếm Ngược Style": Khi muốn đếm ngược, hãy nhớ step phải là số âm và stop phải nhỏ hơn start (để chiều đếm có thể tiến tới stop).

4. Góc Harvard: range và "Lazy Evaluation"

Ở cấp độ cao hơn một chút, range thực chất là một dạng iterable nhưng không phải là một iterator hoàn chỉnh. Nó là một đối tượng có khả năng sinh ra các giá trị một cách tuần tự khi được yêu cầu, chứ không phải một bộ sưu tập (collection) dữ liệu.

Điểm then chốt ở đây là "lazy evaluation" hay "đánh giá lười biếng". Thay vì tính toán và lưu trữ tất cả các giá trị ngay từ đầu, range chỉ tính toán giá trị tiếp theo khi và chỉ khi nó được yêu cầu. Điều này cực kỳ quan trọng đối với hiệu suất khi bạn làm việc với các chuỗi số khổng lồ, bởi vì nó giúp tiết kiệm RAM một cách đáng kinh ngạc. Bạn có thể tạo ra một range đến hàng tỷ mà không làm "nghẽn" bộ nhớ máy tính của bạn!

5. Ứng Dụng Thực Tế: range "phủ sóng" ở đâu?

range không chỉ là lý thuyết suông, nó hiện diện khắp nơi trong các ứng dụng thực tế:

  • Website/App (Ví dụ: Trang phân trang - Pagination): Khi bạn lướt TikTok, Shopee hay Facebook, bạn thấy có các trang 1, 2, 3... hoặc các danh sách cuộn vô tận. range có thể được dùng để quản lý việc này. Ví dụ, để hiển thị 10 sản phẩm trên mỗi trang, bạn có thể dùng range(0, total_items, items_per_page) để xác định các khoảng chỉ mục cho từng trang.

  • Game Development (Ví dụ: Game Loop): Trong một game, có một vòng lặp chính chạy liên tục để cập nhật trạng thái game, xử lý input, và vẽ lại màn hình. for frame in range(60): # Cập nhật 60 khung hình mỗi giây là một ví dụ điển hình.

  • Data Science & Machine Learning: Khi bạn xử lý các tập dữ liệu lớn, bạn có thể muốn chia nhỏ chúng thành các "batch" (lô) nhỏ hơn để huấn luyện mô hình. range giúp bạn tạo ra các chỉ số để lấy các batch này một cách hiệu quả.

  • Automation/Scripting: Bất cứ khi nào bạn cần lặp lại một tác vụ nào đó N lần, range là lựa chọn hàng đầu.

6. Thử Nghiệm và Khi Nào Nên Dùng?

Thử nghiệm "nhẹ đô": Hãy thử điều này trong console Python của bạn:

# range là một đối tượng, không phải list
print(type(range(10))) # Output: <class 'range'>

# So sánh hiệu năng (không chạy cái list(range(...)) nếu bạn không muốn treo máy!)
import time

start_time = time.time()
for i in range(100_000_000):
    pass
end_time = time.time()
print(f"Thời gian dùng range: {end_time - start_time:.4f} giây")

# CẢNH BÁO: Đoạn code này có thể làm tốn rất nhiều RAM nếu số lớn
# start_time = time.time()
# large_list = list(range(100_000_000))
# for i in large_list:
#     pass
# end_time = time.time()
# print(f"Thời gian dùng list(range): {end_time - start_time:.4f} giây")
# print(f"Kích thước list: {len(large_list) * 4 / (1024**2):.2f} MB (ước tính)")

Bạn sẽ thấy range nhanh hơn và tiết kiệm bộ nhớ hơn rất nhiều so với việc tạo ra một list chứa tất cả các số.

Khi nào nên dùng range?

  • Khi bạn cần lặp lại một hành động một số lần cố định và bạn không quan tâm đến các giá trị cụ thể của các phần tử trong một tập hợp.
  • Khi bạn cần các chỉ số (index) để truy cập các phần tử trong một list, tuple hoặc string.
  • Khi bạn cần tạo ra một chuỗi số tuần tự lớn mà không muốn tiêu tốn bộ nhớ.

Khi nào KHÔNG nên dùng range (hoặc có lựa chọn tốt hơn)?

  • Khi bạn đã có một danh sách (list) hoặc một tập hợp (collection) và muốn lặp qua chính các phần tử của nó. Trong trường hợp này, for item in my_list: là cách Pythonic và trực quan hơn nhiều so với for i in range(len(my_list)): item = my_list[i].

Vậy đó, range không chỉ là một hàm đếm số đơn thuần, nó là một công cụ mạnh mẽ giúp code của bạn hiệu quả và "mượt mà" hơn rất nhiều. Hãy tận dụng nó một cách thông minh nhé! Hẹn gặp lại trong bài học tiếp theo!

Thuộc Series: Python

Bài giảng này được tự động xuất bản ngẫu nhiên từ thư viện kiến thức. Đừng quên đón xem các Từ khoá Hướng Dẫn tiếp theo nhé!

#tech #cyberpunk #laravel
Chỉnh sửa bài viết

Bình luận (0)

Vui lòng Đăng Nhập để Bình luận

Hỗ trợ Markdown cơ bản
Nguyễn Văn A
1 ngày trước

Tính năng này đỉnh quá ad ơi, chờ mãi mới thấy một blog Tiếng Việt có UI/UX xịn như vầy!