🐸

一件事工坊

数据与文本工具python-data-tinkerer-18-the-single-job
奖励: 115 XP
|

一件事工坊

回到工匠台后,Hoppy 发现了一种很小但很常见的混乱:两张原始徽章名都要做同样的清理,代码也开始重复。现在还谈不上“出大问题”,但职责已经有点发糊了。这个函数到底只会处理某一张徽章,还是应该能帮任何一张原始徽章名做清理?

这节 checkpoint 要确认的,就是一个很实用的直觉:函数通常应该接收输入,完成一个主要动作,然后把结果交回来。今天这份工作非常小,函数只需要把一张原始徽章名整理干净。

一个函数,只负责一份清理工作

如果同样的清理步骤开始出现不止一次,这往往就是一个信号:可以把它们收进一个很小的 helper 里。这样 helper 就能接收一份输入,只做这一件事,再把清理后的结果返回出来。外部代码会更轻松,因为它只需要换一个原始值再调用一次。

raw_badge_one = "  silver fern  "
raw_badge_two = " ember ribbon "


def polish_badge_name(raw_name):
  cleaned_name = raw_name.strip().title()
  return cleaned_name


first_badge = polish_badge_name(raw_badge_one)
second_badge = polish_badge_name(raw_badge_two)

print("First badge:", first_badge)
print("Second badge:", second_badge)

注意这里的职责有多窄。polish_badge_name() 不负责打印整个结果画面,也不试图一次管理所有徽章。它只接收一个原始名字,把它清理好,再返回清理后的版本。正因为职责清楚,同一个函数才能自然地处理两张不同的徽章。

重复代码,常常是在提醒你有个小 helper 藏在那里

今天不是在做大型重构,只是在练一个很小的判断:如果你发现同样的清理动作一写再写,那你看到的很可能就是一个还没被抽出来的小函数。一个清楚的小 helper,通常也会带来更清楚的输入、更清楚的输出,以及更少的重复代码。

1
先给函数一个输入变量

polish_badge_name 改成接收一张原始徽章名,而不是总是直接去读取 raw_badge_one

2
保持工作很小,并返回清理后的名字

用这个输入通过 strip()title() 得到 cleaned_name,然后写出 return cleaned_name

3
让同一个 helper 服务两张徽章

分别调用 polish_badge_name(raw_badge_one)polish_badge_name(raw_badge_two)。这就是今天的 checkpoint 感觉:一个小函数,一份清楚职责,用不止一次。

什么叫“只做一件事”?

“一件事”不等于“只能写一行”。它真正的意思是“职责清楚”。在这节课里,这份职责很简单:接收一张原始徽章名,把它清理好,再把清理后的结果交回来。

参考答案
点击展开
参考答案:
raw_badge_one = "  moss lantern  "
raw_badge_two = " silver fern  "


def polish_badge_name(raw_name):
  cleaned_name = raw_name.strip().title()
  return cleaned_name


first_badge = polish_badge_name(raw_badge_one)
second_badge = polish_badge_name(raw_badge_two)

print("First badge:", first_badge)
print("Second badge:", second_badge)
高级技巧
想更进一步?点击展开

这节 checkpoint 故意做得很小。我们不讨论软件架构,也不把它变成大型整理工程。今天只是在强化一个习惯:让 helper 函数的输入、主要动作和输出都更容易看清。

这种习惯很重要,因为后面的代码会更容易拼装,只要这些小部件的职责够清楚。现在先把这个“徽章清理 helper”练稳就够了。

Loading...
终端输出
Terminal
Ready to run...