Python3 数字求和

一、场景 1:基础两数求和(新手入门)

适用于已知两个数字或手动输入两个数字的简单求和场景,是最基础的数字求和方式。

完整代码示例 

# 方式1:直接定义数字求和
num1 = 10
num2 = 25
sum_result = num1 + num2
print(f"数字{num1}{num2}的和:{sum_result}")  # 输出:数字10和25的和:35

# 方式2:手动输入两个数字求和(处理输入类型转换)
print("\n--- 手动输入求和 ---")
try:
    # input()获取的是字符串,需转为浮点数(支持小数)
    input1 = float(input("请输入第一个数字:"))
    input2 = float(input("请输入第二个数字:"))
    input_sum = input1 + input2
    print(f"你输入的两个数之和:{input_sum}")
except ValueError:
    # 处理非数字输入的异常
    print("错误:请输入有效的数字(整数/小数)!")
 

关键说明

  • input() 函数获取的用户输入是字符串类型,必须通过int()/float()转为数字类型才能求和;
  • 加入try-except异常处理,避免用户输入非数字(如字母、符号)导致程序崩溃;
  • 浮点数求和可能存在精度问题(如0.1+0.2=0.30000000000000004),若需高精度可使用decimal模块(见场景 5)。

二、场景 2:列表 / 元组等可迭代对象求和(最常用)

适用于批量数字(如列表、元组、集合)的求和,Python 内置sum()函数是最优选择,简洁高效。

完整代码示例 

# 1. 列表求和(最常用)
num_list = [1, 2, 3, 4, 5, 6]
list_sum = sum(num_list)
print(f"列表{num_list}的和:{list_sum}")  # 输出:列表[1,2,3,4,5,6]的和:21

# 2. 元组求和
num_tuple = (10, 20, 30, 40)
tuple_sum = sum(num_tuple)
print(f"元组{num_tuple}的和:{tuple_sum}")  # 输出:元组(10,20,30,40)的和:100

# 3. 求和时指定初始值(默认初始值为0)
num_set = {1.5, 2.5, 3.5}
set_sum = sum(num_set, 10)  # 初始值10,总和=10+1.5+2.5+3.5=17.5
print(f"集合{num_set}(初始值10)的和:{set_sum}")  # 输出:集合{1.5,2.5,3.5}(初始值10)的和:17.5
 

关键说明

  • sum(iterable, start=0) 是 Python 内置函数,iterable为可迭代对象(列表、元组、集合等),start为求和初始值(可选);
  • sum() 效率远高于手动循环求和(底层由 C 实现),优先使用;
  • 注意:sum() 仅支持数字类型,不能直接求和字符串列表(如sum(["1","2"])会报错)。

三、场景 3:手动输入多个数求和(不定数量)

适用于用户输入任意数量数字(用空格 / 逗号分隔)的求和场景,需先拆分输入内容再求和。

完整代码示例 

print("\n--- 输入多个数字求和(空格分隔) ---")
try:
    # 接收用户输入(如:1 2 3 4 5)
    input_str = input("请输入多个数字(空格分隔):")
    # 拆分字符串为列表,转为浮点数
    num_list = [float(num) for num in input_str.split()]
    # 求和
    total = sum(num_list)
    print(f"输入的数字列表:{num_list}")
    print(f"总和:{total}")
except ValueError:
    print("错误:请输入有效的数字,并用空格分隔!")

# 扩展:逗号分隔的输入(如:1,2,3,4)
print("\n--- 输入多个数字求和(逗号分隔) ---")
try:
    input_str2 = input("请输入多个数字(逗号分隔):")
    num_list2 = [float(num.strip()) for num in input_str2.split(",")]
    total2 = sum(num_list2)
    print(f"输入的数字列表:{num_list2}")
    print(f"总和:{total2}")
except ValueError:
    print("错误:请输入有效的数字,并用逗号分隔!")
 

关键说明

  • split():默认按空格拆分字符串,split(",")按逗号拆分;
  • strip():去除每个数字字符串的首尾空格(如处理输入"1 , 2 , 3"的情况);
  • 列表推导式[float(num) for num in ...]快速将字符串列表转为数字列表。

四、场景 4:带条件的数字求和

适用于仅对满足特定条件的数字求和(如偶数、奇数、大于 10 的数),结合列表推导式 / 生成器表达式实现。

完整代码示例

# 示例数据
nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

# 1. 求偶数的和
even_sum = sum(num for num in nums if num % 2 == 0)
print(f"列表{nums}中偶数的和:{even_sum}")  # 输出:30

# 2. 求奇数的和
odd_sum = sum(num for num in nums if num % 2 != 0)
print(f"列表{nums}中奇数的和:{odd_sum}")  # 输出:25

# 3. 求大于5且小于10的数的和
range_sum = sum(num for num in nums if 5 < num < 10)
print(f"列表{nums}中大于5且小于10的数的和:{range_sum}")  # 输出:36(6+7+8+9)

# 4. 求列表中正数的和(处理含负数的场景)
nums_with_neg = [-5, -2, 0, 3, 7, 10]
positive_sum = sum(num for num in nums_with_neg if num > 0)
print(f"列表{nums_with_neg}中正数的和:{positive_sum}")  # 输出:20
 

关键说明

  • 生成器表达式num for num in nums if 条件比列表推导式更节省内存(无需创建临时列表);
  • 条件可灵活组合(如num > 0 and num % 3 == 0),满足复杂求和需求;
  • 若条件逻辑复杂,可封装为函数(如def is_valid(num): return num > 5 and num % 2 == 0),再用sum(num for num in nums if is_valid(num))

五、场景 5:大数 / 高精度求和

Python 天然支持大整数求和(无溢出问题),但浮点数求和可能有精度误差,需用decimal模块保证高精度。

完整代码示例 

# 1. 大整数求和(Python天然支持,无需额外处理)
big_num1 = 123456789012345678901234567890
big_num2 = 987654321098765432109876543210
big_sum = big_num1 + big_num2
print(f"\n大整数求和:{big_num1} + {big_num2} = {big_sum}")
# 输出:1111111110111111111011111111100

# 2. 高精度浮点数求和(解决0.1+0.2≠0.3的问题)
from decimal import Decimal, getcontext

# 设置精度(保留10位小数)
getcontext().prec = 10

# 普通浮点数求和(有精度误差)
normal_sum = 0.1 + 0.2
print(f"普通浮点数求和:0.1 + 0.2 = {normal_sum}")  # 输出:0.30000000000000004

# 高精度求和
decimal_sum = Decimal("0.1") + Decimal("0.2")
print(f"高精度求和:0.1 + 0.2 = {decimal_sum}")  # 输出:0.3
 

关键说明

  • Python 的 int 类型无大小限制,可直接求和任意大整数;
  • decimal.Decimal需传入字符串形式的数字(而非浮点数),才能保证高精度;
  • getcontext().prec设置全局精度,根据需求调整(如财务计算设为 2 位)。

六、场景 6:迭代器 / 生成器求和(节省内存)

对于超大数据集(如百万级数字),直接生成列表会占用大量内存,用生成器迭代求和更高效。

完整代码示例 

 
# 示例:求1到100万的和(用生成器,不创建临时列表)
def num_generator(start, end):
    """生成从start到end的数字生成器"""
    current = start
    while current <= end:
        yield current
        current += 1

# 求和1到100万
total = sum(num_generator(1, 1000000))
print(f"\n1到100万的和:{total}")  # 输出:500000500000

# 等价于sum(range(1, 1000001))(range本身就是迭代器,节省内存)
total2 = sum(range(1, 1000001))
print(f"用range求和1到100万:{total2}")  # 输出:500000500000
 

关键说明

  • 生成器(yield)和range()都是惰性迭代,仅在需要时生成数字,内存占用几乎可忽略;
  • 对于文件中的海量数字(如每行一个数字),可逐行读取求和,避免加载整个文件到内存:
     
    # 读取文件中的数字求和
    total_file = 0
    with open("nums.txt", "r", encoding="utf-8") as f:
        for line in f:
            num = float(line.strip())
            total_file += num
    print(f"文件中数字的和:{total_file}")
    

posted on 2025-12-25 09:06  小陶coding  阅读(0)  评论(0)    收藏  举报