单一职责原则:写好Python函数的第一步

当刚开始学习 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%