Идиоматический Python: цикл 'времен' [дубликат]

47
задан perimosocordiae 17 April 2010 в 03:09
поделиться

4 ответа

Вопрос предполагает, что вызов foo () n раз является априори необходимостью. Откуда взялось? Это длина чего-то повторяемого? Затем выполните итерацию по итерации. Когда я беру в руки Python, я обнаружил, что использую несколько или совсем не использую произвольных значений; за вашим n есть еще один важный смысл, который потерялся, когда стал целым числом.

Сегодня я наткнулся на провокационную статью Никлауса Вирта для IEEE Computer под названием Хорошие идеи - в Зазеркалье (архивная версия для будущих читателей). В разделе 4 он привносит другой взгляд на программные конструкции, которые все (включая его самого) считают само собой разумеющимся, но которые содержат явные недостатки:

«Общность оператора Algol for должна иметь был предупреждением для всех будущих дизайнеров всегда помнить об основной цели конструкции и уставать от преувеличенной общности и сложности, что может легко стать контрпродуктивным ".

Алгол для эквивалентен C / Java для , но он тоже много. Эту статью полезно читать хотя бы потому, что она заставляет не принимать как должное столько того, что мы с такой готовностью делаем. Так что, возможно, лучший вопрос: «Зачем вам нужен цикл, который выполняется произвольное количество раз?»

9
ответ дан 26 November 2019 в 19:41
поделиться

Самый быстрый и чистый - это itertools.repeat :

import itertools

for _ in itertools.repeat(None, n):
    foo()
16
ответ дан 26 November 2019 в 19:41
поделиться

Если вам нужен метод раз , и вам нужно использовать его в своих собственных функциях, попробуйте следующее:

def times(self, n, *args, **kwargs):
    for _ in range(n):
        self.__call__(*args, **kwargs)

import new
def repeatable(func):
    func.times = new.instancemethod(times, func, func.__class__)
    return func

теперь добавьте декоратор @repeatable для любого метода, который вам нужен, метод раз на:

@repeatable
def foo(bar):
    print bar

foo.times(4, "baz") #outputs 4 lines of "baz"
17
ответ дан 26 November 2019 в 19:41
поделиться

Вы уже показали идиоматический путь:

for _ in range(n): # or xrange if you are on 2.X
    foo()

Не уверен, что в этом «хакерского». Если вы имеете в виду более конкретный вариант использования, предоставьте более подробную информацию, и может быть что-то более подходящее для того, что вы делаете.

43
ответ дан 26 November 2019 в 19:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: