python - 每次调用一个键时,如何从字典中返回一个随机数?

标签 python dictionary random properties python-descriptors

我正在尝试制造一种提供随机伤害的武器。我这样做是使用表单中的项目数据库

itemsList = {
1: {"name": "Padded Armor",  "armor": 1,  "value": 5, "class": "Light"},
2: {"name": "Leather Armor",  "armor": 2,  "value": 10, "class": "Light"},
....
19: {"name": "Dagger", "damage" : int(random.randrange(1, 4)), "value": 2, "Type": "Dagger"},
20: {"name": "Dagger + 1", "damage" : int(random.randrange(1, 4) + 1), "value": 200, "Type": "Dagger"},
21: {"name": "Dagger + 2", "damage" : int(random.randrange(1, 4) + 2), "value": 750, "Type": "Dagger"},
22: {"name": "Dagger + 3", "damage" : int(random.randrange(1, 4) + 3), "value": 2000, "Type": "Dagger"}
}

每次我尝试调用 "damage" 时,它只会返回相同的结果。我知道这是因为随机数是生成一个然后保存到那个字典键。

每次调用损坏时我将如何生成一个随机数?

最佳答案

我会不厌其烦地在类的 itemsList 实例中制作这些东西。尽管您可能认为这有点矫枉过正,但这样做会给您以后的编程带来很大的灵 active 。它还将使许多代码更易于编写(和阅读),因为您将能够使用点符号而不是通过索引来引用事物,这意味着您不仅可以编写现在使用 itemsList[19].damage 而不是 itemsList[19]["damage"]。您还将对所有其他属性使用相同的语法,例如 itemsList[1].nameitemsList[2].value,并且能够编写条件代码如下:

if hasattr(itemsList[2], 'Class'):
    # do something based on itemsList[2].Class

我的意思是:

import random

class Gear(object):
    def __init__(self, **kwargs):
        kwargs['_damage'] = kwargs.pop('damage', False)
        self.__dict__.update(kwargs)

    @property
    def damage(self):
        return int(random.randrange(*self._damage)) if self._damage else 0

itemsList = {
    1: Gear(name="Padded Armor", armor=1, value=5, Class="Light"),
    2: Gear(name="Leather Armor", armor=2, value=10, Class="Light"),
    # ...
    19: Gear(name="Dagger", damage=(1, 4), value=2, Type="Dagger"),
    20: Gear(name="Dagger + 1", damage=(1, 5), value=200, Type="Dagger"),
    21: Gear(name="Dagger + 2", damage=(1, 9), value=750, Type="Dagger"),
    22: Gear(name="Dagger + 3", damage=(2, 6), value=2000, Type="Dagger"),
}

在下面的一条评论中回答您的后续问题:

kwargs 是传递给 __init__() 构造方法的所有关键字参数的字典。 (__dict__ 是字典的名称,每个实例都在其中存储其属性。)参见 this section在文档中。

damage 由使用 @property 的类定义装饰器,这是一种实际使它成为“数据描述符”的简单方法。这会设置一些东西,以便每当您引用类实例的 damage 属性时,它都会调用一个函数来检索/确定其当前“值”。查看Descriptor HowTo Guide有关 Python 描述符的更多信息。

关于python - 每次调用一个键时,如何从字典中返回一个随机数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39563672/

相关文章:

python - 按回车作为命令输入

python - Pandas :在一行中向数据框添加多列

parsing - 将字符串解析为映射 Golang

javascript - 从列表中随机选择一个项目

random - 如何获得从1到N随机排序的数字数组?

python - 数独子方 block 生成

dictionary - 如何使用Java 8中的方法引用进行Map合并?

java - 使用 JAXB 解码嵌套 XML 元素

c++ - C++ 中的随机数

python - RobertaForSequenceClassification 的对数和概率代表什么?