2016-11-02 1 views
0

La fonction intégrée Python range() est limitée aux entiers.Existe-t-il une implémentation de range() qui ne soit pas limitée aux entiers?

je besoin d'une fonction plus générique de signature similaire range(start, stop, step), où start, stop et step peut être tout type étant donné que:

  • résultat de (éventuellement multiple) ajout de step-start est défini
  • à la fois start et le résultat mentionné ci-dessus peut être comparé avec stop.

La fonction peut être utilisée (par exemple) pour obtenir une séquence de jours de l'année:

range(datetime.datetime(2015, 1, 1), 
     datetime.datetime(2016, 1, 1), 
     datetime.timedelta(1)) 

Je sais que je peux facilement écrire cette fonction par moi-même. Cependant, je cherche des solutions existantes efficaces dans un certain paquet populaire (comme numpy ou scipy), travaillant avec Python 2 et Python 3.

J'ai déjà essayé de combiner itertools.takewhile avec itertools.count, mais ce dernier semble être limité aux nombres.

Répondre

1

Vous pouvez le faire avec un générateur simple. L'exemple suivant fonctionne avec les flottants, les entiers et le datetime.

Avec datetime il vous suffit de préciser clairement la date exacte (1 janvier 2016) non seulement 2016 et préciser clairement le delta du temps (timedelta (jours = 1) non timedelta (1))

import datetime 

def range2(start,stop,step): 
    value = start 
    while value <= stop: 
     yield value 
     value += step 

for date in range2(datetime.datetime(2015,1,1),datetime.datetime(2016,1,1),datetime.timedelta(days=1)): 
    print(date) 

Comme pour les solutions sur étagère il y a arange en numpy mais je n'ai pas testé cela avec datetime.

>>> from numpy import arange 
>>> arange(0.5, 5, 1.5) 
array([0.5, 2.0, 3.5]) 
+0

Merci. Je connais l'astuce du générateur, mais c'est une solution de bricolage. On dirait que 'arange' fonctionne avec' datetime' et 'timedelta', et c'est quasiment ce que je cherche, mais il faut aussi définir les opérations' -' et '/', et '/' retourner un nombre. J'ai corrigé les objets 'datetime', cependant l'appel à' timedelta' est correct: https://docs.python.org/2/library/datetime.html#timedelta-objects. – abukaj

+0

Quel est le problème avec une solution de bricolage? @abukaj –

+1

D'accord. Pourquoi chercher une solution qui est dans une bibliothèque pré-libérée lorsque vous avez quelque chose qui fonctionne? Tout le codage est une solution de bricolage. – scotty3785