#python
#python
Вопрос:
Я пытаюсь написать функцию, которая будет суммировать значения в цикле for.
Я пробовал:
def get_total_items(self):
return totalnum = totalnum item['quantity'] for item in self.cart.values()
Я получаю синтаксическую ошибку, однако я не уверен, почему, поскольку это кажется мне правильным.
Комментарии:
1.Я предполагаю, что
self.cart
этоdict
, такжеdicts
ли значения?2. вы пытаетесь вернуть сумму списка
3. Как определяется ваша корзина?
Ответ №1:
Правильный способ сделать это — sum
функция с выражением генератора. Выражение генератора похоже на цикл, для которого вы пытались, но ограничено круглыми скобками (которые могут быть такими же, как в скобках вызова, когда это единственный аргумент, как в sum
):
def get_total_items(self):
return sum(item['quantity'] for item in self.cart.values())
Обратите внимание, что totalnum
это никогда не присваивается (вы не можете назначить как часть return
), но это и не обязательно; значение из sum
возвращается напрямую, вообще не сохраняя его в именованной переменной.
Если totalnum
существует какой-то существующий глобальный файл, который необходимо обновить, вам нужно будет разделить это на три строки, одну для объявления totalnum
глобального файла (чтобы он не стал локальным из-за назначения), одну для увеличения totalnum
, одну для return
него:
def get_total_items(self):
global totalnum
totalnum = sum(item['quantity'] for item in self.cart.values())
return totalnum
Комментарии:
1. Ах, спасибо.totalnum не является глобальным, я просто пытался назначить его как часть return . Я пытаюсь использовать sum с item[‘количество’], но он всегда возвращает 0, и он должен возвращать хотя бы один.
2. @JakeRankin: Если он всегда возвращает ноль,
self.cart
либо пусто, все величины равны нулю, либо вам каким-то образом удалось получить отрицательные величины, которые отменяют положительные величины. Попробуйте цикл:for item in self.cart.values(): print(item['quantity'])
; Я подозреваю, что вы обнаружите, что один из них имеет место (менее вероятная возможность заключается в том, что переменная, которую вы проверяете, была инициализирована нулем, здесь вы получаете исключение, например, потому что у someitem
даже нетquantity
, и вы перехватываете и игнорируете исключение, затем видите неизмененный ноль).
Ответ №2:
Используйте существующую sum()
функцию.
sum(item['quantity'] for item in self.cart.values())
Или, если вам нужно начальное значение:
sum((item['quantity'] for item in self.cart.values()), 1000.0) #start summing with 1000.0
Если вам абсолютно необходимо реализовать это самостоятельно:
def get_total_items(self):
totalnum = 0
for item in self.cart.values():
totalnum = item['quantity']
return totalnum
Ответ №3:
Согласно [Python 3]: Операторreturn:
return_stmt ::= «return» [expression_list]
totalnum = totalnum item['quantity'] for item in self.cart.values()
это не выражение, а оператор, отсюда и ошибка SynraxError.
Одним из способов сделать это является использование [Python 3]: sum(iterable[, start]):
def get_total_items(self):
return sum(item["quantity"] for item in self.cart.values())
Подход «старого стиля»:
def get_total_items(self):
totalnum = 0
for item in self.cart.values():
totalnum = item["quantity"]
return totalnum
Комментарии:
1.
sum
это не совсем «новый стиль»; он существует со времен Python 2.3, а выражения генератора добавляются в 2.4.
Ответ №4:
Почему бы вам не сделать это следующим образом:
def get_total_items(self):
for item in self.cart.values():
totalnum = item['quantity']
return totalnum
Комментарии:
1. Наряду с тем, что он (обычно) медленнее, чем
sum
, он гарантированно умрет вместе сUnboundLocalError
; вам нужно будет добавить либоglobal totalnum
ortotalnum = 0
в верхней части функции, чтобы использовать глобальную переменную с этим именем, либо инициализировать локальную с этим именем соответственно.