#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__