Kỳ diệu range

Bất kỳ ai học Python cũng đều biết đến range, function giúp tạo 1 list các số nguyên:

range(1, 100)

img

range có trong Python từ rất lâu rồi, thời Python2, range có kèm 1 người anh em song sinh tên gọi xrange. xrange này chính là range ở Python3. Khác gì nhau?

  • range (cũ) sẽ tạo ra 1 list
  • xrange hay range python3 sẽ tạo ra… 1 range
>>> range(1, 100)
range(1, 100)
>>> type(range(1, 100))
<class 'range'>

Vậy nên trong Python3, khi muốn tạo list, phải gõ list(range(1, 100). Tại sao?

Nếu dùng range Python2, sẽ khó mà tạo được list chứa 1 tỷ phần tử (do máy sẽ hết RAM), nhưng range Python3 thì tạo cái gì cũng được, và nó chỉ trả về phần tử khi yêu cầu - đây là ý tưởng chính của “generator”.

Nhưng range không phải generator, range là kiểu range, vì nó còn đặc biệt hơn. Một generator không có len, range thì có:

>>> len(range(2, 1_000_000_000, 3))
333333333
>>> def gen():
...     yield 1
...
>>> len(gen())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: object of type 'generator' has no len()

Bonus: đọc code tính len của range - code C: https://github.com/python/cpython/blob/main/Objects/rangeobject.c#L182

Hết

Đăng ký ngay tại PyMI.vn để học Python tại Hà Nội TP HCM (Sài Gòn), trở thành lập trình viên #python chuyên nghiệp ngay sau khóa học.