我正在编写一些python代码,并且创建了一个罗马数字类。它的工作原理与内置的roman()类相同。
我想实例化从1到1000的罗马数字,而不必自己实际实例化每个罗马数字。
例如:

I = roman(1)
II = roman(2)
.... up to M = roman(1000)


假设我已经有一种将数字转换为罗马数字的方法,那么最有效的方法是什么?

因此,某人应该能够从罗马模块中导入*并输入以下内容:

IV * I + II * V


得到...

罗马(14)

换句话说,每个罗马数字都是它自己的对象。

最佳答案

作为字典

由于本质上是将像"IV"这样的字符串映射到roman类的对象,因此您应该将其保留在字典中,而不是在本地名称空间中。假设您的roman__str__(self)方法返回类似"I""XV"的字符串,则可以这样声明字典:

ROMANS = {
  str(r): r for r in (
    roman(i) for i in range(1, 1000 + 1)
    )
  }


现在,您可以将各个roman对象作为ROMANS["XXIV"]访问,依此类推。

(该字典理解和生成器表达式组合非常丑陋,以至于我可能会将其隐藏在名为_romans_dict(upper=1000)的函数中。)

作为一堆变量

如果您确实想通过名为roman(7)的变量访问VII对象,则可以使用刚创建的字典来更新本地名称空间。更新后,您甚至可以丢弃字典的名称。 (幸运的是,大写的罗马数字,例如“ VII”,与Python的模块级常量的命名约定匹配。)

# ROMANS = ...same as above
locals().update(ROMANS)
del(ROMANS)  # optional


用一千个或更多的罗马数字向模块的命名空间发送垃圾邮件的智慧是另一个问题。 (对于初学者来说,我的语法检查器使用VIIXIX这样的变量在任何地方都找不到声明,这使我大叫。您的老板也可能对您大叫。)

最后的魁北克

您的roman类可能应该拼写为Roman。 Python类名称(通常)在StudlyCaps中。

10-06 15:45