Является ли использование __add__ в Python для int плохой идеей?

#python

#python

Вопрос:

Я хочу увеличить значение на единицу, а в Python нет оператора . Рассмотрим следующий пример:

 # In a method called calculate(self, basecost, othertaxes=None)
# Returns the value of the tax (self) applied to basecost in relation to previous taxes
i = -1
basecost  = sum((tax.calculate(basecost, othertaxes[:i.__add__(1)]) for tax in othertaxes))
  

Является ли использование __add__ в этом примере плохой идеей? Есть ли лучший способ написать это утверждение?

Приветствия — D


Обновить

Я изменил ответ, потому что решение for … in …: v = calc намного быстрее, чем метод sum(). На 6 секунд быстрее за 10000 итераций, учитывая мои настройки, но разница в производительности есть. Ниже приведена моя тестовая настройка:

 class Tax(object):
    def __init__(self, rate):
        self.rate = rate

def calculate_inline(self, cost, other=[]):
    cost  = sum((o.calculate(cost, other[:i]) for i, o in enumerate(other)))
    return cost * self.rate

def calculate_forloop(self, cost, other=[]):
    for i, o in enumerate(other):
        cost  = o.calculate(cost, other[:i])
    return cost * self.rate

def test():
    tax1 = Tax(0.1)
    tax2 = Tax(0.2)
    tax3 = Tax(0.3)
    Tax.calculate =  calculate_inline # or calculate_forloop
    tax1.calculate(100.0, [tax2, tax3]) 

if __name__ == '__main__':
    from timeit import Timer
    t = Timer('test()', 'from __main__ import test; gc.enable()')
    print t.timeit()
  

С Tax.calculate = calculate_inline проблема заняла 16,9 секунды, с calculate_forloop — 10,4 секунды.

Комментарии:

1. Есть ли в Python оператор сложения ?

2. Да, но нет оператора увеличения (например, i или i). В строке мне нужно увеличить на единицу и вернуть.

3. >>> i = 0 >>> a = [1,2,3,4] >>> a[:i = 1] Файл «<stdin>», строка 1 a[:i = 1] ^ Ошибка синтаксиса: недопустимый синтаксис

4. почему бы просто не othertaxes[:i 1] ?

5. Я уже видел эту ужасную вещь с двойным подчеркиванием в коде Python раньше. Если вас беспокоит только уродство, я бы не стал терять сон из-за этого.

Ответ №1:

Похоже, это:

 basecost  = sum((tax.calculate(basecost, othertaxes[:i]) 
                      for i,tax in enumerate(othertaxes))
  

Ответ №2:

Если я правильно читаю:

 for i,tax in enumerate(othertaxes):
    basecost  = tax.calculate(basecost,othertaxes[:i])
  

Комментарии:

1. Столь же хороший и, вероятно, более разборчивый ответ. Но мне нравится однострочный подход. Спасибо за вашу помощь!

Ответ №3:

В Python целые числа не изменяемы (как и числа с плавающей точкой, логические значения или строки).

Вы не можете изменить значение i, если не напишете i = 1. i.add(1) не изменяет значение i, оно просто возвращает новое целое число, равное (i 1).

Ответ №4:

Обычно вы бы сделали lambda x: x 1 вместо использования __add__