士兵序列号生成器

PythonBeginner
立即练习

介绍

在这个项目中,你将学习如何实现一个武器工厂类,该类为银河帝国克隆工厂中的克隆士兵生成唯一 ID。武器工厂类被设计为一个迭代器,使你能够轻松地生成和管理唯一 ID 序列。

👀 预览

------测试1-------
1000face
1000facf
1000fad0
------测试2-------
1000f000
1000f001
1000f002
1000f003
1000f004
1000f005
1000f006
1000f007
1000f008
1000f009
1000f00a

🎯 任务

在这个项目中,你将学习:

  • 如何在 Python 中创建一个自定义迭代器类
  • 如何按顺序生成唯一的十六进制 ID
  • 如何使用迭代器类生成和管理 ID 序列

🏆 成果

完成这个项目后,你将能够:

  • 在 Python 中实现一个自定义迭代器类
  • 按顺序生成唯一的十六进制 ID
  • 使用迭代器类管理 ID 序列
  • 用其他功能(如 ID 验证)增强迭代器类

实现 WeaponFactory 类

在这一步中,你将学习如何将 WeaponFactory 类实现为一个迭代器类。

  1. 在你的代码编辑器中打开 soldier_generator.py 文件。
  2. 按照以下要求定义 WeaponFactory 类:
    • __init__() 方法应接受一个字符串作为参数。此参数是武器工厂的起始 ID。
    • __next__() 方法应按顺序生成下一个 ID。生成的 ID 应为一个 8 位十六进制字符的字符串。
    • __iter__() 方法应返回 WeaponFactory 实例本身,以便该类可以用作迭代器。

以下是 WeaponFactory 类的代码:

class WeaponFactory:
    def __init__(self, start_id):
        self.current_id = int(start_id, 16)

    def __iter__(self):
        return self

    def __next__(self):
        hex_id = hex(self.current_id)[2:]
        self.current_id += 1
        return hex_id.zfill(8)

__init__() 方法中,我们使用 int() 函数将 start_id 字符串转换为以 16 为基数(十六进制)的整数,从而初始化 current_id 属性。

__next__() 方法中,我们使用 hex() 函数将 current_id 转换为十六进制字符串,然后使用切片 [2:] 删除前导的 '0x'。然后我们将 current_id 加 1。最后,我们使用 zfill() 方法确保 ID 字符串始终为 8 个字符长,必要时用前导零填充。

__iter__() 方法只需返回 WeaponFactory 实例本身,以便该类可以用作迭代器。

✨ 查看解决方案并练习

测试 WeaponFactory 类

既然你已经实现了 WeaponFactory 类,那就让我们对其进行测试,以确保它能按预期工作。

  1. 将以下代码添加到 soldier_generator.py 文件中的 if __name__ == "__main__": 代码块中:
wf = WeaponFactory("1000face")
print("------测试 1-------")
print(next(wf))   ## 输出:'1000face'
print(next(wf))   ## 输出:'1000facf'
print(next(wf))   ## 输出:'1000fad0'

count = 0
max_count = 10
print("------测试 2-------")
for id in WeaponFactory("1000f000"):
    print(id)
    count += 1
    if count > max_count:
        break
  1. 保存 soldier_generator.py 文件并运行脚本:
python3 soldier_generator.py

输出应该是:

------测试1-------
1000face
1000facf
1000fad0
------测试2-------
1000f000
1000f001
1000f002
1000f003
1000f004
1000f005
1000f006
1000f007
1000f008
1000f009
1000f00a

这证实了 WeaponFactory 类按预期工作,在调用 __next__() 方法时按顺序生成下一个 ID,并在用作迭代器时遍历这些 ID。

✨ 查看解决方案并练习

总结

恭喜你!你已经完成了这个项目。你可以在 LabEx 中练习更多实验来提升你的技能。