未知的战利品
冒险归来,Hoppy 需要把战利品存入仓库。但问题来了:有时候他只捡到 1 颗宝石,有时候是 3 把剑,有时候是一大堆杂物。
如果我们定义 save(item1),那捡到两个物品时就会报错。如果我们定义 save(item1, item2),那捡到一个物品时又会报错。
“我需要一种能自动伸缩的盒子,”Hoppy 说道,“不管我往里面塞多少东西,它都能装下。”
伸缩收纳盒 (*args)
在参数名前加一颗星星 *,这个参数就会变成一个神奇的收纳盒(魔法术语叫 元组 Tuple)。
def save_loot(*items):
print("收到了 " + str(len(items)) + " 件物品:")
for item in items:
print("- " + item)
现在,你可以随意调用它:
save_loot("Gold")(装 1 个)save_loot("Sword", "Shield", "Potion")(装 3 个)save_loot()(空的也行!)
你的任务
工坊里有一个现成的仓库系统 inventory.py。
1
连接仓库
在第一行 import inventory。
2
可以伸缩的搬运工
定义一个名为 store_all 的函数,使用 *loots 作为参数。
3
批量入库
在函数内部,写一个 for 循环遍历 loots。对于每一个 loot,调用 inventory.add(loot)。
4
实战测试
调用 store_all("Diamond", "Ruby", "Sapphire") 一次性存入三颗宝石。
星星只在定义时
注意:星号 * 只在定义函数 (def) 时需要写。在使用变量 (for 循环) 时不需要写星号!
参考答案点击展开点击收起
点击展开点击收起
参考答案:
import inventory
def store_all(*loots):
for loot in loots:
inventory.add(loot)
store_all("Diamond", "Ruby", "Sapphire")高级技巧想更进一步?点击展开点击收起
F. 现实桥接 (Bridge to Reality)
- 伸缩收纳盒 = 可变参数 (Variable Arguments),常缩写为
args。 - 星星 (*) = 解包操作符 (Unpacking Operator)。
- 当你不知道用户会传多少参数时(比如
print()函数可以打印任意多个变量),这个技巧非常有用。
Loading...
终端输出
Terminal
Ready to run...