Я сделал небольшую функцию генератора для диапазонов символов:
>>> def crange(start, end):
... for i in range(ord(start), ord(end)+1):
... yield chr(i)
...
И тогда я могу это сделать:
>>> print(*crange('a','e'))
a b c d e
Ура! Но это не работает:
>>> crange('a','e')[::2]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'generator' object is not subscriptable
И это работает, но O (n), в отличие от range
O (1):
>>> 'y' in crange('a','z')
True
Это означает, что для поиска номера персонажа 109999 из 110 000 требуется около 0,35 секунды. 109999 in range(110000)
, конечно, быстро.
В этот момент моя первая мысль заключалась в простом подклассе. К сожалению:
>>> class A(range):
... pass
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: type 'range' is not an acceptable base type
Итак, я думаю, мне придется каким-то образом подражать ему, что позволяет передавать символы в качестве аргументов, работает как range
внутри, и создает символы. К сожалению, я не уверен, как действовать дальше. Я попробовал 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
который позволяет мне видеть, какие функции там, но я не уверен, что они делают, или как range
использует их. Я искал источник для range
, но он в C, и я не знаю, где найти его оболочку Python (у него есть один, правда?).
Куда я иду отсюда, и я должен пойти туда?