当刚开始学习 Python 时,新手可能会写一个函数来计算阶乘(比如 5! = 5 × 4 × 3 × 2 × 1 = 120)。后来,如果又需要对一个数字列表,比如 [3, 4, 5],求出每个数的阶乘结果的“长度”(比如 120 有 3 位数字)。这时候,你可能会想:“干脆让阶乘函数直接返回长度吧!”但其实,更好的做法是保持原函数不变,在调用它的地方再做额外处理。这种思路背后,就体现了一个非常重要的编程原则:单一职责原则(Single Responsibility Principle, SRP)。
什么是单一职责原则?
简单来说:
一个函数只做一件事,并且把它做好。
比如,计算阶乘的函数就只负责“计算阶乘”,不要让它同时去算长度、转字符串、打印结果等等。这样你的代码会更清晰、更容易修改和复用。
用 for 循环写一个简单的阶乘函数
我们用最基础的 for 循环来实现阶乘,不需要递归,新手也能轻松看懂:
def factorial(n): result = 1 for i in range(1, n + 1): result = result * i return result
这个函数只做一件事:输入一个整数 n,返回它的阶乘值。
试试看:
print(factorial(5)) # 输出: 120
新需求来了:求阶乘结果的“长度”
现在,有一个数字列表:
numbers = [3, 4, 5]
来了新需求:
1.对每个数求阶乘;2.把阶乘结果转成字符串;3.看看每个结果有多少位数字(也就是“长度”)。
✅ 正确做法:不改原函数,用它来组合新功能
numbers = [3, 4, 5]
# 第一步:用 factorial 函数计算每个数的阶乘factorials = []for n in numbers: f = factorial(n) factorials.append(f)
# 第二步:计算每个阶乘结果的字符串长度lengths = []for f in factorials: length = len(str(f)) # 转成字符串后用 len() 算位数 lengths.append(length)
print("阶乘结果:", factorials) # [6, 24, 120]print("对应长度:", lengths) # [1, 2, 3]
或者用更简洁的列表推导式(其实也好理解):
factorials = [factorial(n) for n in numbers]lengths = [len(str(f)) for f in factorials]
无论哪种写法,factorial 函数本身没有变,它依然只负责计算阶乘。
如果违反单一职责原则会怎样?
假如我们图省事,把阶乘和长度计算混在一个函数里:
# 不推荐!函数干了两件事def factorial_and_length(n): result = 1 for i in range(1, n + 1): result *= i length = len(str(result)) return result, length # 返回两个东西
看起来好像“一步到位”,但问题很多:
•如果别的地方只需要阶乘值,还得写 fact, _ = factorial_and_length(5),麻烦;•如果以后需求定义变了(比如不要长度了),就得改这个函数;•函数名字越来越长,逻辑越来越乱;•别人读代码时会问:“这个函数到底是干啥的?”
总结
•✅ 函数要小,职责要单一:一个函数 = 一个任务。•✅ 复杂功能靠“组合”:用多个简单函数搭积木,比写一个“万能函数”更可靠。•✅ 先写清楚,再写聪明:一开始不用追求一行代码搞定,先保证逻辑清晰。•✅ 名字要准确:factorial 就该返回阶乘,别让它偷偷干别的事。
单一职责原则听起来很“高大上”,其实很简单:让每个函数专心做好一件事。
用 for 循环写阶乘、在调用处处理长度——这样的代码,你写得明白,别人读得轻松,以后改起来也不怕出错。
从今天开始,写函数前问自己一句:
“这个函数到底只做一件事吗?”
如果是,你就已经走在写出好代码的路上了!
预览时标签不可点
Close
更多
Name cleared
微信扫一扫赞赏作者
Like the AuthorOther Amount
赞赏后展示我的头像
作品
暂无作品
Like the Author
Other Amount
¥
最低赞赏 ¥0
OK
Back
Other Amount
更多
赞赏金额
¥
最低赞赏 ¥0
1
2
3
4
5
6
7
8
9
0
.
Python语言程序设计 · 目录
Python语言程序设计
下一篇牛顿法求解过程的Python实现及其详解
Close
更多
搜索「」网络结果
Close
调整当前正文文字大小
更多
100%