Ho fatto una funzione po generatore per intervalli di caratteri:Come estendere, imitare o emulare la funzione di intervallo?
>>> def crange(start, end):
... for i in range(ord(start), ord(end)+1):
... yield chr(i)
...
e poi posso fare questo:
>>> print(*crange('a','e'))
a b c d e
Yay! Ma questo non funziona:
>>> crange('a','e')[::2]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'generator' object is not subscriptable
E questo funziona, ma è O (n), a differenza di range
s' O (1):
>>> 'y' in crange('a','z')
True
Ciò significa che occorrono circa 0,35 secondi per la ricerca per carattere numero 109.999 su un massimo di 110.000. 109999 in range(110000)
è, ovviamente, veloce.
A quel punto, il mio primo pensiero era semplicemente la sottoclasse dell'intervallo. Purtroppo:
>>> class A(range):
... pass
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: type 'range' is not an acceptable base type
Quindi penso che avrei dovuto imitare in qualche modo che mi permette di passare personaggi come argomenti, funziona come range
internamente e produce caratteri. Sfortunatamente, non sono sicuro di come procedere. Ho provato un 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
che mi permette di vedere quali funzioni sono in là, ma non sono sicuro di quello che stanno facendo, o come range
li utilizza. Ho cercato la fonte per range
, ma è in C, e non so dove trovare il suo wrapper Python (ne ha uno, giusto?).
Dove vado da qui, e dovrei anche andarci?
"ma è in C, e non so dove trovare il suo wrapper Python (ne ha uno, giusto?)" - No. Come 'list' o' dict', nessuna parte di 'range' è scritta in Python. – user2357112
Informazioni sulla classe, forse 'classe A (oggetto, intervallo):' – Zizouz212
Mentre questa potrebbe sembrare una domanda interessante, sto votando per chiuderla come troppo ampia. Non c'è un buon modo per farlo se non passando attraverso l'intera API di 'range' e replicandolo, quindi le risposte dovrebbero descrivere tutto ciò che fa 'range', tutti gli hook usati per personalizzare' len' e slicing e tutto, e loro Prenderò come 10 pagine. Raccomando di cercare i nomi dei metodi e di esaminare il [modello dati Python] (https://docs.python.org/3/reference/datamodel.html). – user2357112