Hàm range() là một hàm rất phổ biến và được sử dụng rộng rãi trong Python, đặc biệt khi bạn làm việc với vòng lặp for, và đôi khi cả với vòng lặp while. Đáng để bạn nắm vững hàm range() vì điều đó sẽ mở ra rất nhiều cánh cửa: range() được dùng cho mọi việc từ điều khiển luồng chương trình đến lặp qua các tập dữ liệu dùng cho phân tích dữ liệu.
Hàm range() trả về một dãy số và là bất biến (immutable), nghĩa là giá trị của nó cố định. Hàm range() nhận một, hoặc nhiều nhất là ba đối số, cụ thể là giá trị start (bắt đầu) và stop (kết thúc) cùng với kích thước step (bước nhảy).
range() được giới thiệu trong Python3. Trong Python2, một hàm tương tự là xrange() được dùng, với hành vi hơi khác. Trong số đó, xrange() trả về một đối tượng generator và tiêu tốn ít bộ nhớ hơn, trong khi range() lại trả về một danh sách hoặc dãy số.
Một phần lý do khiến hàm range() hữu ích là vì nó chỉ lưu trữ các giá trị start, stop và step, nên tiêu tốn ít bộ nhớ hơn so với một list hay tuple.
Cú pháp hàm range() trong Python
Hàm range() có thể được biểu diễn theo ba cách khác nhau, hay bạn cũng có thể xem đó là ba tham số của range():
range(stop_value): Theo mặc định, điểm bắt đầu ở đây là số không.
range(start_value, stop_value): Tạo ra dãy số dựa trên giá trị bắt đầu và kết thúc.
range(start_value, stop_value, step_size): Tạo dãy bằng cách tăng dần giá trị bắt đầu theo bước nhảy cho đến khi chạm giá trị kết thúc.
Hàm range() trong Python. Ảnh: Tác giả.
Chúng ta cũng có thể kiểm tra kiểu của đối tượng do range() trả về bằng cách bọc range() trong type().
my_range =range(100)print(type(my_range))# Expected output: <class 'range'>Được hỗ trợ bởi
Trình soạn thảo Learn-by-Example, nhấn Tab để Vào. Nhấn Escape rồi Tab hoặc Shift+Tab để điều hướng ra ngoài.
Giờ hãy xem một vài ví dụ để bạn có thể luyện tập và thành thạo cách dùng range().
Dùng Python range() để in một dãy số
Bắt đầu với ví dụ đơn giản in ra một dãy mười số, qua đó bao quát tham số đầu tiên của range(). Để làm điều này, bạn chỉ cần truyền vào giá trị stop. Vì Python dùng chỉ mục bắt đầu từ 0, nên dãy sẽ bắt đầu từ số 0 và dừng tại số được chỉ định, tức là n-1, trong đó n là số được chỉ định trong hàm range().
my_range =range(10)for num in my_range:print(num)# Expected output:# 0# 1# 2# 3# 4# 5# 6# 7# 8# 9Được hỗ trợ bởi
Trình soạn thảo Learn-by-Example, nhấn Tab để Vào. Nhấn Escape rồi Tab hoặc Shift+Tab để điều hướng ra ngoài.
Giờ hãy thêm tham số thứ ba, tức kích thước step, vào hàm range() và xem nó ảnh hưởng đến đầu ra thế nào. Bạn sẽ đặt điểm start là 50, giá trị stop là 1000 với step bằng 100. Hàm range dưới đây sẽ tạo ra một dãy bắt đầu từ 50 và tăng dần với bước 100.
my_range =range(50,1000,100)print(my_range)# Expected output: range(50, 1000, 100)Được hỗ trợ bởi
Trình soạn thảo Learn-by-Example, nhấn Tab để Vào. Nhấn Escape rồi Tab hoặc Shift+Tab để điều hướng ra ngoài.
Lưu ý rằng hàm range() chỉ hoạt động khi giá trị truyền vào là số nguyên. Nó không hỗ trợ kiểu dữ liệu float hay chuỗi. Tuy vậy, bạn có thể truyền cả số nguyên dương lẫn âm. Hãy xem điều gì xảy ra khi bạn thử truyền giá trị float.
for num inrange(0.2,2.4):print(num)# Expected output:# TypeError: 'float' object cannot be interpreted as an integerĐược hỗ trợ bởi
Trình soạn thảo Learn-by-Example, nhấn Tab để Vào. Nhấn Escape rồi Tab hoặc Shift+Tab để điều hướng ra ngoài.
Có thể bạn đã từng đau đầu khi thử đảo ngược một danh sách liên kết các giá trị nguyên trong ngôn ngữ C. Tuy nhiên, trong Python, có thể làm được điều đó với hàm range() chỉ bằng cách hoán đổi start và stop cùng với thêm một bước âm. Đơn giản phải không? Hãy xem nhé!
for num inrange(100,10,-10):print(num)# Expected output:# 100# 90# 80# 70# 60# 50# 40# 30# 20Được hỗ trợ bởi
Trình soạn thảo Learn-by-Example, nhấn Tab để Vào. Nhấn Escape rồi Tab hoặc Shift+Tab để điều hướng ra ngoài.
Giả sử bạn có một danh sách các giá trị nguyên và muốn tìm tổng của danh sách đó, nhưng dùng hàm range(). Hãy xem cách thực hiện.
Trước hết, bạn sẽ định nghĩa danh sách gồm các giá trị nguyên. Sau đó khởi tạo một biến đếm để lưu giá trị mỗi lần bạn lặp qua danh sách và cộng giá trị hiện tại của danh sách với giá trị đếm trước đó.
Để truy cập các phần tử trong danh sách, bạn sẽ áp dụng hàm range() trên độ dài của danh sách rồi truy cập phần tử bằng cách truyền vào chỉ số i, bắt đầu từ 0 và dừng ở độ dài của danh sách.
list1 =[2,4,6,8,10,12,14,16,18,20]
count =0for i inrange(len(list1)):
count = count + list1[i]print(count)print('sum of the list:', count)# Expected output:# 2# 6# 12# 20# 30# 42# 56# 72# 90# 110# sum of the list: 110Được hỗ trợ bởi
Trình soạn thảo Learn-by-Example, nhấn Tab để Vào. Nhấn Escape rồi Tab hoặc Shift+Tab để điều hướng ra ngoài.
Bạn cũng có thể nối hai hoặc nhiều hàm range() bằng lớp chain trong gói itertools. Và không chỉ hàm range, bạn còn có thể nối list, tuple, v.v. Hãy nhớ rằng phương thức chain trả về một đối tượng generator; để truy cập các phần tử từ generator đó, bạn có thể dùng vòng lặp for hoặc dùng list và truyền generator làm đối số.
from itertools import chain
a1 =range(10,0,-2)
a2 =range(30,20,-2)
a3 =range(50,40,-2)
final = chain(a1,a2,a3)print(final)#generator object# Expected output: <itertools.chain object at 0xae6330>Được hỗ trợ bởi
Trình soạn thảo Learn-by-Example, nhấn Tab để Vào. Nhấn Escape rồi Tab hoặc Shift+Tab để điều hướng ra ngoài.
Bạn có thể áp dụng so sánh bằng nhau giữa các hàm range(). Với hai hàm range(), nếu chúng biểu diễn cùng một dãy giá trị, thì chúng được xem là bằng nhau. Nói vậy có nghĩa là hai hàm range() bằng nhau không nhất thiết phải có cùng thuộc tính start, stop và step. Hãy hiểu bằng ví dụ.
Như bạn thấy từ các kết quả trên, dù các tham số của hàm range() khác nhau, chúng vẫn được coi là bằng nhau nếu dãy của cả hai là như nhau. Ở ví dụ thứ hai, thay đổi kích thước step khiến phép so sánh cho kết quả False.
Kết luận
Chúc mừng bạn đã hoàn thành hướng dẫn. Bạn có thể thử nghiệm thêm với hàm range() và tìm cách tùy biến để chấp nhận các kiểu dữ liệu khác ngoài số nguyên.
Nếu sau khi đọc xong, bạn nghĩ rằng mình sẽ có lợi khi luyện tập các hàm Python, hãy xem các hướng dẫn Hàm Python và Hướng dẫn Vòng lặp for trong Python cho người mới bắt đầu của chúng tôi. Để học theo lộ trình có cấu trúc, hãy xem khóa Viết mã Python hiệu quả trên DataCamp, khóa này không chỉ trình bày chi tiết về hàm range() mà còn giúp bạn nắm các khái niệm lập trình tổng quát để viết mã thực sự hiệu quả mà không tốn nhiều chi phí phụ trợ.
Tiếp tục phát triển kỹ năng Khoa học Dữ liệu hiện đại của bạn bằng cách tìm hiểu về các cấu trúc lặp (iterators) và biểu thức danh sách (list comprehensions).
Hàm
range()là một hàm rất phổ biến và được sử dụng rộng rãi trong Python, đặc biệt khi bạn làm việc với vòng lặpfor, và đôi khi cả với vòng lặpwhile. Đáng để bạn nắm vững hàmrange()vì điều đó sẽ mở ra rất nhiều cánh cửa:range()được dùng cho mọi việc từ điều khiển luồng chương trình đến lặp qua các tập dữ liệu dùng cho phân tích dữ liệu.Nếu bạn mới bắt đầu với Python và muốn học thêm, hãy tham gia khóa Giới thiệu Khoa học Dữ liệu bằng Python của DataCamp.
Hàm range() trong Python là gì?
Hàm
range()trả về một dãy số và là bất biến (immutable), nghĩa là giá trị của nó cố định. Hàmrange()nhận một, hoặc nhiều nhất là ba đối số, cụ thể là giá trịstart(bắt đầu) vàstop(kết thúc) cùng với kích thướcstep(bước nhảy).range()được giới thiệu trong Python3. Trong Python2, một hàm tương tự làxrange()được dùng, với hành vi hơi khác. Trong số đó,xrange()trả về một đối tượng generator và tiêu tốn ít bộ nhớ hơn, trong khirange()lại trả về một danh sách hoặc dãy số.Một phần lý do khiến hàm
range()hữu ích là vì nó chỉ lưu trữ các giá trịstart,stopvàstep, nên tiêu tốn ít bộ nhớ hơn so với một list hay tuple.Cú pháp hàm range() trong Python
Hàm
range()có thể được biểu diễn theo ba cách khác nhau, hay bạn cũng có thể xem đó là ba tham số củarange():range(stop_value): Theo mặc định, điểm bắt đầu ở đây là số không.range(start_value, stop_value): Tạo ra dãy số dựa trên giá trị bắt đầu và kết thúc.range(start_value, stop_value, step_size): Tạo dãy bằng cách tăng dần giá trị bắt đầu theo bước nhảy cho đến khi chạm giá trị kết thúc.Chúng ta cũng có thể kiểm tra kiểu của đối tượng do
range()trả về bằng cách bọcrange()trongtype().Ví dụ về hàm range() trong Python
Giờ hãy xem một vài ví dụ để bạn có thể luyện tập và thành thạo cách dùng
range().Dùng Python range() để in một dãy số
Bắt đầu với ví dụ đơn giản in ra một dãy mười số, qua đó bao quát tham số đầu tiên của
range(). Để làm điều này, bạn chỉ cần truyền vào giá trịstop. Vì Python dùng chỉ mục bắt đầu từ 0, nên dãy sẽ bắt đầu từ số 0 và dừng tại số được chỉ định, tức làn-1, trong đónlà số được chỉ định trong hàmrange().Đúng như mong đợi, ô trên trả về một dãy số bắt đầu từ
0và kết thúc ở9.Dùng Python range() với list()
Bạn cũng có thể dùng hàm range làm đối số cho list; khi đó, nó sẽ tạo ra một danh sách số với độ dài bằng giá trị dừng như dưới đây:
Sử dụng start, stop và step trong Python range()
Tiếp theo, hãy xem một cách khác để làm việc với hàm
range(). Lần này bạn sẽ chỉ định cả giá trịstartvàstop.Tương tự, bạn cũng có thể dùng hàm
range()để in ra các giá trị nguyên âm.Giờ hãy thêm tham số thứ ba, tức kích thước
step, vào hàmrange()và xem nó ảnh hưởng đến đầu ra thế nào. Bạn sẽ đặt điểmstartlà 50, giá trịstoplà 1000 vớistepbằng 100. Hàm range dưới đây sẽ tạo ra một dãy bắt đầu từ 50 và tăng dần với bước 100.Bạn sẽ nhận thấy rằng nó in ra toàn số chẵn.
Lưu ý về Python range() và giá trị float
Lưu ý rằng hàm
range()chỉ hoạt động khi giá trị truyền vào là số nguyên. Nó không hỗ trợ kiểu dữ liệu float hay chuỗi. Tuy vậy, bạn có thể truyền cả số nguyên dương lẫn âm. Hãy xem điều gì xảy ra khi bạn thử truyền giá trị float.Có thể bạn đã từng đau đầu khi thử đảo ngược một danh sách liên kết các giá trị nguyên trong ngôn ngữ C. Tuy nhiên, trong Python, có thể làm được điều đó với hàm
range()chỉ bằng cách hoán đổistartvàstopcùng với thêm một bước âm. Đơn giản phải không? Hãy xem nhé!Dùng range() để tìm tổng của một danh sách
Giả sử bạn có một danh sách các giá trị nguyên và muốn tìm tổng của danh sách đó, nhưng dùng hàm
range(). Hãy xem cách thực hiện.Trước hết, bạn sẽ định nghĩa danh sách gồm các giá trị nguyên. Sau đó khởi tạo một biến đếm để lưu giá trị mỗi lần bạn lặp qua danh sách và cộng giá trị hiện tại của danh sách với giá trị đếm trước đó.
Để truy cập các phần tử trong danh sách, bạn sẽ áp dụng hàm
range()trênđộ dàicủa danh sách rồi truy cập phần tử bằng cách truyền vào chỉ sối, bắt đầu từ 0 và dừng ở độ dài của danh sách.Dùng range() với itertools để nối các dãy
Bạn cũng có thể nối hai hoặc nhiều hàm
range()bằng lớpchaintrong góiitertools. Và không chỉ hàmrange, bạn còn có thể nối list, tuple, v.v. Hãy nhớ rằng phương thứcchaintrả về một đối tượng generator; để truy cập các phần tử từ generator đó, bạn có thể dùng vòng lặpforhoặc dùnglistvà truyền generator làm đối số.Python range() và so sánh bằng nhau
Bạn có thể áp dụng so sánh bằng nhau giữa các hàm
range(). Với hai hàmrange(), nếu chúng biểu diễn cùng một dãy giá trị, thì chúng được xem là bằng nhau. Nói vậy có nghĩa là hai hàmrange()bằng nhau không nhất thiết phải có cùng thuộc tínhstart,stopvàstep. Hãy hiểu bằng ví dụ.Như bạn thấy từ các kết quả trên, dù các tham số của hàm
range()khác nhau, chúng vẫn được coi là bằng nhau nếu dãy của cả hai là như nhau. Ở ví dụ thứ hai, thay đổi kích thướcstepkhiến phép so sánh cho kết quảFalse.Kết luận
Chúc mừng bạn đã hoàn thành hướng dẫn. Bạn có thể thử nghiệm thêm với hàm
range()và tìm cách tùy biến để chấp nhận các kiểu dữ liệu khác ngoài số nguyên.Nếu sau khi đọc xong, bạn nghĩ rằng mình sẽ có lợi khi luyện tập các hàm Python, hãy xem các hướng dẫn Hàm Python và Hướng dẫn Vòng lặp for trong Python cho người mới bắt đầu của chúng tôi. Để học theo lộ trình có cấu trúc, hãy xem khóa Viết mã Python hiệu quả trên DataCamp, khóa này không chỉ trình bày chi tiết về hàm
range()mà còn giúp bạn nắm các khái niệm lập trình tổng quát để viết mã thực sự hiệu quả mà không tốn nhiều chi phí phụ trợ.