2016-01-24 2 views
0

Есть ли лучший способ применить функцию к переменной снова и снова, без использования цикла for (в идеале в стандартной библиотеке тоже)? Пример того, что я сейчас:снова и снова применяют функцию к переменной

def simulation(): 
    wealth = 0 
    for i in range(1000): 
     wealth = gamble(wealth) 
    return wealth 

То, что я хотел бы что-то как

def simulation() 
    return reduce_(gamble, 1000, 0) 
+1

Поскольку вы что-то делаете снова и снова, там всегда будет петля. Почему вы хотите скрыть это? – Blckknght

+0

@Blckknght, потому что иногда цикл не является «самой важной» или «самой описательной» частью кода. Имена «уменьшить» и «карта» и «grep» и «zip» - это конструкции цикла, но они делают больше, чем просто цикл и передают то, что они делают. –

ответ

2

Одна альтернатива я мог думать использует itertools.repeat с map:

from itertools import repeat 
wealth = 0 

# dummy gable function 
def gamble(wealth): 
    return wealth 

z = map(gamble, repeat(wealth, times=1000)) 

Вы 'd по-прежнему нужно перебирать через него (или называть его list()), чтобы заставить его выполнить.

Это если функция должна действовать на одно и то же значение. Если вам это нужно назвать себя много раз, вы можете также использовать декоратор (или reduce, но нет никакого смысла в добавлении этого, так как @Austin сделал):

def apply(f, times=10): 
    def func(*args, **kwargs): 
     nonlocal times 
     times -= 1 
     if times: 
      return func(f(*args, **kwargs)) 
    return func 

@apply 
def foo(val): 
    val += 1 
    print(val, end = " ") 
    return val 

foo(10) 
11 12 13 14 15 16 17 18 19 
+0

Это дает вам список одинаковых возвращаемых значений, а не 'gamble (gamble (... (азартная игра (богатство) ..)))' – chepner

+0

@chepner Хорошо, я действительно смутился об этом. Я добавил решение декоратора, которое делает трюк, если я не ошибаюсь. –

1
# python 3 
from functools import reduce 
return reduce(lambda w,i: gamble(w), range(1000), 0) 
1

К сожалению, нет встроенной или стандартной библиотечной функции что делает то, что вы хотите.

Хотя вы можете сузить существующую функцию, чтобы заставить ее работать, цикл for, вероятно, более читабельен, чем требуемый код. Я, например, предпочел бы прочитать ваш текущий код, чем очень умная версия Austin Hasting. Я могу сразу понять цикл for, вызов reduce и lambda, который игнорирует свой второй аргумент, требует от вас немного больше мысли.

Итак, тщательно подумайте, прежде чем «упростить» свой код и убедитесь, что ваше упрощение на самом деле не делает код более сложным для понимания.

Смежные вопросы