Как вернуть результат ADD AND на python?

#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']) ; Я подозреваю, что вы обнаружите, что один из них имеет место (менее вероятная возможность заключается в том, что переменная, которую вы проверяете, была инициализирована нулем, здесь вы получаете исключение, например, потому что у some item даже нет 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 or totalnum = 0 в верхней части функции, чтобы использовать глобальную переменную с этим именем, либо инициализировать локальную с этим именем соответственно.