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}")
浙公网安备 33010602011771号