【问题标题】:Python - SUM(Iterator, FOR Loop) - How does this work?Python - SUM(Iterator, FOR Loop) - 这是如何工作的?
【发布时间】:2023-01-11 14:01:59
【问题描述】:

我正在继续我的 Python 学习之旅,遇到了一段代码,我对它在 Python 中的 SUM() 函数如何工作感到非常困惑。

代码如下

prices = {'apple': 0.75, 'egg': 0.50}
cart = {
  'apple': 1,
  'egg': 6
}

bill = sum(prices[item] * cart[item]
           for item in cart)

print(f'I have to pay {bill:.2f}')

这个的最终输出是“我必须支付 3.75”

真正让我感到困惑的部分是 SUM 函数中的“迭代器”或“购物车中的项目”

从关于 SUM 函数的 python 文档中可以看出

总和(可迭代,[开始])

可迭代:字符串、列表、字典等项目。

开始:添加到最终结果的可选数值。它默认为 0。

因此,例如,如果使用此代码

sum([1,2,3], 4)

这基本上可以得出 1+2+3+4=10,这对我来说很有意义。

所以我很困惑代码 sn-p 的“for 循环”部分是如何合法的?

我试着用谷歌搜索,但我发现的大多数例子都非常简单,就像我刚才提到的那个,而且我找不到任何关于 FOR 循环如何与 SUM 一起工作的解释

【问题讨论】:

    标签: python python-3.x dictionary for-loop sum


    【解决方案1】:

    prices[item] * cart[item] for item in cart 是一个发电机。它产生一个可迭代对象,这是 sum 函数的第一个参数。

    for item in cart 遍历 cart 字典中的每个键。所以在这种情况下,它将遍历列表['apple', 'egg'],依次将item设置为其中的每一个。对于每次迭代,表达式prices[item] * cart[item] 查找商品的价格(例如prices['apple'])并将其乘以商品的数量(例如cart['apple'])。生成器生成一个序列,该序列由计算 cart 中每个键的表达式值的结果组成,然后 sum 获取该序列并将其元素加在一起以得出 @987654331 中项目的最终总数@.

    【讨论】:

      【解决方案2】:

      尝试阅读有关List comprehensions 的内容。
      它们基本上是一种编写简单 for 循环的单行方式。
      由于这些创建列表,您可以将它们提供给使用列表(或迭代器,更通用)的函数,例如求和:

      list_of_nums = [1, 2, 3, 4]
      list_of_squares = [num**2 for num in list_of_nums]
      print(list_of_squares)
      >>> [1, 4, 9, 16]
      

      【讨论】:

      • 给定的示例中没有列表理解。有一个生成器,它很相似,但又不同。
      • 我从未声称示例中有列表理解,我只是说了解列表理解可以帮助 OP 理解代码。
      • 讨论一段代码并试图描述它是如何工作的,然后抛出一个不包含在该代码中的术语,这是非常误导的。如果您真的认为值得研究与生成器相对的列表推导式,您应该清楚地声明所讨论代码中的内容不是列表推导式。
      【解决方案3】:

      sum() 内部的代码是 generator expression,它基本上是用于从另一个迭代器创建迭代器的语法糖。

      在您的示例中,cart 变量是 Dictionary 类型的对象,它也是一个迭代器,而 prices[item] * cart[item] 部分是 cart (字典键)中的每个项目如何转换为新项目的方式结果迭代器。

      sn-p bill = sum(prices[item] * cart[item] for item in cart) 相当于

      bill = 0
      for item in cart:
        bill += prices[item] * cart[item]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-18
        相关资源
        最近更新 更多