双份回礼
返回之路打通后,Hoppy 继续在工匠台前工作。这次它不只是算一盏灯的亮度,而是在把火花石分装成小护符。一次分装结束后,台面上自然会留下两样东西:做好的护符数量,以及还没凑够下一枚护符的剩余火花石。
这节课要补上的直觉是:一个函数也可以把两个相关结果一起交回来。只要它们属于同一个小任务,就不必拆成两次调用或两段无关代码。
一个小任务,可能天然会产出两份结果
把火花石按固定份数装进护符时,你通常会同时关心两件事:ready_charms 有多少,以及 spare_stones 还剩多少。这两个结果来自同一个分装动作,所以让函数一次把它们都交回来,反而最自然。
spark_stones = 9
stones_per_charm = 4
def split_charm_batch(spark_stones, stones_per_charm):
ready_charms = spark_stones // stones_per_charm
spare_stones = spark_stones % stones_per_charm
return ready_charms, spare_stones
ready_charms, spare_stones = split_charm_batch(spark_stones, stones_per_charm)
print("Ready charms:", ready_charms)
print("Spare stones:", spare_stones)
这里并不是在讲什么新的复杂理论,而是在练一个很实用的动作:函数做完一个小任务后,可以把两份彼此相关的结果一起交回来;外面的代码也可以用两个变量把它们一起接住。
一起返回,也要一起接住
今天最重要的不是“记住可以返回多个值”这句话本身,而是看清它为什么合理:护符数量和剩余火花石本来就是同一批分装的两个产物。所以你会同时 return ready_charms, spare_stones,也会同时用 ready_charms, spare_stones = ... 把它们接住。
starter 已经算出了 ready_charms 和 spare_stones。现在把函数里的打印改成 return ready_charms, spare_stones。
在函数外调用一次 split_charm_batch(spark_stones, stones_per_charm),并用 ready_charms, spare_stones 这两个变量把结果一起接住。
运行后,你会同时看到做好的护符数量和剩余火花石数量。它们来自同一次函数调用,这就是“双份回礼”的感觉。
当一个函数完成的是同一个小任务,而你自然会关心它产出的两份相关结果时,就很适合一起返回。重点不是“多”,而是“相关”。
参考答案点击展开点击收起
spark_stones = 14
stones_per_charm = 4
def split_charm_batch(spark_stones, stones_per_charm):
ready_charms = spark_stones // stones_per_charm
spare_stones = spark_stones % stones_per_charm
return ready_charms, spare_stones
ready_charms, spare_stones = split_charm_batch(spark_stones, stones_per_charm)
print("Ready charms:", ready_charms)
print("Spare stones:", spare_stones)高级技巧想更进一步?点击展开点击收起
这一课只守住一个很窄但很实用的边界:一个函数可以把两份相关结果一起交回来,外面再用两个变量接住它们。我们没有展开高级解包,也没有把它讲成 tuple 理论课,因为今天真正要建立的是“小任务可能有两个天然产物”的直觉。
再往下一步,你会看到有些函数不只交回一两个散落的值,而会直接交回一张更整洁的小报告。这就是下一课要走的方向。