Можно ли реализовать Python для цикла диапазона без переменной итератора? - PullRequest
168 голосов
/ 04 мая 2009

Можно ли выполнять следующие действия без i?

for i in range(some_number):
    # do something

Если вы просто хотите сделать что-то N раз и вам не нужен итератор.

Ответы [ 15 ]

0 голосов
/ 09 декабря 2013

Мы немного повеселились со следующим, интересно поделиться так:

class RepeatFunction:
    def __init__(self,n=1): self.n = n
    def __call__(self,Func):
        for i in xrange(self.n):
            Func()
        return Func


#----usage
k = 0

@RepeatFunction(7)                       #decorator for repeating function
def Job():
    global k
    print k
    k += 1

print '---------'
Job()

Результаты:

0
1
2
3
4
5
6
---------
7
0 голосов
/ 18 марта 2013
#Return first n items of the iterable as a list
list(itertools.islice(iterable, n))

Взято из http://docs.python.org/2/library/itertools.html

0 голосов
/ 13 марта 2013

Вместо ненужного счетчика теперь у вас есть ненужный список. Лучшее решение - использовать переменную, начинающуюся с «_», которая сообщает средствам проверки синтаксиса, что вы знаете, что не используете переменную.

x = range(5)
while x:
  x.pop()
  print "Work!"
0 голосов
/ 11 октября 2012

А как же:

while range(some_number):
    #do something
0 голосов
/ 06 января 2012

Я в целом согласен с решениями, приведенными выше. А именно с:

  1. Использование подчеркивания в for -loop (2 и более строк)
  2. Определение нормального while счетчика (3 и более строк)
  3. Объявление пользовательского класса с реализацией __nonzero__ (еще много строк)

Если определить объект как в # 3 , я бы порекомендовал реализовать протокол для с ключевым словом или применить contextlib .

Далее я предлагаю еще одно решение. Это трехслойный лайнер, не обладающий исключительной элегантностью, но он использует пакет itertools и, следовательно, может представлять интерес.

from itertools import (chain, repeat)

times = chain(repeat(True, 2), repeat(False))
while next(times):
    print 'do stuff!'

В этом примере 2 - это количество повторений цикла. цепочка оборачивает два повторных итератора, первый ограничен, а второй бесконечен. Помните, что это настоящие итераторы, поэтому они не требуют бесконечной памяти. Очевидно, что это намного медленнее, чем решение # 1 . Если не написано как часть функции, может потребоваться очистка переменной times .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...