Kỳ diệu range
by Pymier0
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)
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.