Python 中求和函数 sum 用法

Python 中求和函数 sum 用法

今天在看《集体编程智慧》这本书的时候,看到一段Python代码,当时是百思不得其解,总觉得是书中排版出错了,后来去了解了一下sum的用法,看了一些Python大神写的代码后才发现是自己浅薄了!特在此记录一下。书中代码段摘录如下:


from math import sqrt

def sim_distance(prefs, person1, person2):
    # 得到shared_items的列表
    si = {}
    for item in prefs[person1]:
        if item in prefs[person2]:
            si[item] = 1

    # 如果两者没有共同之处,则返回0
    if len(si) == 0: return 0

    # 计算所有差值的平方和
    sum_of_squares = sum([pow(prefs[person1][item] - prefs[person2][item], 2) 
                        for item in prefs[person1] if item in prefs[person2]])

    return 1/(1 + sqrt(sum_of_squares))

自己不明白的代码块就是在计算所有差值的平方和这里,按照一般语言逻辑,应该是for语句和pow语句位置对调一下啊,很是困惑!后来查阅了一下sum函数的用法才豁然开朗,再次感叹Python之神(bian)奇(tai)语法。

sum函数的参数是这样的:sum(iterable[, start]),其中iterable为可迭代对象,可以是listtuple或者dictionary等。

sum函数最后的值 = 可迭代对象里面的数相加的值 + start的值,其中start可以不写,默认为0。讲到这里,那么我们怎么去理解上面计算所有差值的平方和这段代码呢?其实很简单,看看下面这段代码,然后再回去看上面那段代码就会柳暗花明了!

from math import sqrt
a = range(1, 11)
b = range(1, 10)
c = sum([item for item in a if item in b])
print c

可以自己输入这段简单的代码运行试试,最终的结果是:45

补充一点:"item for item in a if item in b" 这种表达式叫作列表推导式,是在一组字符串或者一组对象上执行一条相同操作的简洁写法!

最后的最后:人生苦短,我用Python.

### Python `sum` 函数的使用方法 #### 定义与功能 `sum()` 是 Python 的内置函数,用于返回一个可迭代对象(iterable)中的所有项与 `start` 值的总和。如果没有提供 `start` 参数,默认值为 0[^1]。 #### 参数说明 - **第一个参数**:必需,表示要累加的可迭代对象(如列表、元组等)。 - **第二个参数 (start)**:可选,表示初始值。在 Python 3.8 中支持通过关键字形式指定该参数[^1]。 #### 返回值 返回的是可迭代对象中所有元素加上 `start` 的总计数值。 #### 示例代码 以下是几个典型的 `sum()` 使用场景: ```python # 示例 1: 求列表中所有整数的和 numbers = [1, 2, 3, 4, 5] total = sum(numbers) print(total) # 输出 15 # 示例 2: 设置起始值 total_with_start = sum(numbers, 10) print(total_with_start) # 输出 25 # 示例 3: 字典键求和 keys_sum = sum({1: 'a', 2: 'b', 3: 'c'}) print(keys_sum) # 输出 6 # 示例 4: 浮点数求和并提高精度 import math floats = [0.1, 0.2, 0.3] precise_total = math.fsum(floats) # 推荐使用 fsum 提高浮点运算精度 print(precise_total) # 输出 0.6 ``` #### 注意事项 1. 如果需要拼接字符串序列,应避免使用 `sum()`,而推荐使用 `''.join(sequence)` 方法,因为后者更高效。 2. 对于浮点数求和,建议使用 `math.fsum()` 来获得更高的精确度[^1]。 3. 在 Python 3.12 中,`sum()` 的实现已经改进,能够提供更高精度的结果[^1]。 #### 错误处理 尝试将不兼容类型的 `start` 参数传递给 `sum()` 将引发 `TypeError`。例如: ```python try: result = sum([1, 2, 3], '10') except TypeError as e: print(e) # 输出: sum() can't sum strings [use ''.join(seq) instead] ``` #### 替代方案 对于一些特殊需求,可以考虑其他工具代替 `sum()`: - 拼接多个可迭代对象时,推荐使用 `itertools.chain()`。 - 循环结构也可以完成类似的求和操作[^2]: ```python total = 0 for number in range(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值