tôi đã thực hiện một chức năng máy phát điện nhỏ cho nhân vật dao động:Làm cách nào để mở rộng, bắt chước hoặc mô phỏng chức năng phạm vi?
>>> def crange(start, end):
... for i in range(ord(start), ord(end)+1):
... yield chr(i)
...
Và sau đó tôi có thể làm điều này:
>>> print(*crange('a','e'))
a b c d e
Yay! Nhưng điều này không làm việc:
>>> crange('a','e')[::2]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'generator' object is not subscriptable
Và làm việc này, nhưng là O (n), không giống như range
's O (1):
>>> 'y' in crange('a','z')
True
Điều đó có nghĩa nó mất khoảng 0,35 giây để tìm kiếm cho số ký tự 109,999 trong số tối đa 110.000. 109999 in range(110000)
, tất nhiên là nhanh.
Tại thời điểm đó, suy nghĩ đầu tiên của tôi chỉ đơn giản là phạm vi phân lớp. Thật không may:
>>> class A(range):
... pass
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: type 'range' is not an acceptable base type
Vì vậy, tôi đoán tôi sẽ phải bắt chước nó trong một cách nào đó cho phép tôi để vượt qua nhân vật như các đối số, hoạt động giống như range
nội bộ, và tạo ra các nhân vật. Thật không may, tôi không chắc chắn làm thế nào để tiến hành. Tôi đã thử một dir()
:
>>> print(*dir(range), sep='\n')
__class__
__contains__
__delattr__
__dir__
__doc__
__eq__
__format__
__ge__
__getattribute__
__getitem__
__gt__
__hash__
__init__
__iter__
__le__
__len__
__lt__
__ne__
__new__
__reduce__
__reduce_ex__
__repr__
__reversed__
__setattr__
__sizeof__
__str__
__subclasshook__
count
index
start
step
stop
cho phép tôi xem những gì các chức năng đang chờ ở đó, nhưng tôi không chắc chắn những gì họ đang làm, hoặc làm thế nào range
sử dụng chúng. Tôi tìm kiếm nguồn cho range
, nhưng nó trong C, và tôi không biết nơi để tìm wrapper Python của nó (nó có một, phải không?).
Tôi nên đi đâu từ đây và tôi có nên đến đó không?
"nhưng trong C và tôi không biết phải tìm trình bao bọc Python của nó ở đâu (nó có một, đúng không?)" - không. Giống như 'list' hoặc' dict', không có phần nào của 'range' được viết bằng Python. – user2357112
Về lớp học, có lẽ 'lớp A (đối tượng, phạm vi): ' – Zizouz212
Mặc dù điều này có vẻ giống như một câu hỏi thú vị, tôi đang bỏ phiếu để đóng nó quá rộng. Không có cách nào tốt để làm điều này trừ khi đi qua toàn bộ 'phạm vi' của API và sao chép nó, vì vậy các câu trả lời sẽ phải mô tả mọi thứ' phạm vi', tất cả các móc được sử dụng để tùy chỉnh 'len' và cắt và mọi thứ, và chúng 'd mất 10 trang. Tôi khuyên bạn nên googling các tên phương thức và tìm kiếm thông qua [mô hình dữ liệu Python] (https://docs.python.org/3/reference/datamodel.html). – user2357112