首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python -高阶函数- make_fair_dice

Python -高阶函数- make_fair_dice
EN

Stack Overflow用户
提问于 2021-01-18 06:51:50
回答 1查看 27关注 0票数 0

我正在做一个项目。我需要创建骰子。我有一个解决方案如下:

代码语言:javascript
复制
from random import randint

def make_fair_dice(sides):
    """Return a die that returns 1 to SIDES with equal chance."""
    assert type(sides) == int and sides >= 1, 'Illegal value for sides'
    def dice():
        return randint(1,sides)
    return dice

four_sided = make_fair_dice(4)
six_sided = make_fair_dice(6)

我不明白为什么解决方案要创建一个内部函数dice()。我认为这没有必要。但我知道我可能错过了一个重要的概念。一如既往,代码不是难懂的,而是概念。

EN

回答 1

Stack Overflow用户

发布于 2021-01-18 12:44:09

这里的想法是你的“死亡”是一个函数。如果您这样做了:

代码语言:javascript
复制
four_sided = make_fair_dice(4)
six_sided = make_fair_dice(6)

您正在创建一个四面骰子和一个六面骰子。您可以通过调用函数来“滚动”它;您不需要再次提供边数,因为"die“(由make_fair_dice函数返回的函数)已经包含了该信息。

例如,您可以执行以下操作:

代码语言:javascript
复制
print(f"5d4: {sum(four_sided() for _ in range(5))}")
print(f"3d6: {sum(six_sided() for _ in range(3))}")

另一种表示相同概念的方法是使骰子对象包含边的数量,并具有滚动它们的方法:

代码语言:javascript
复制
class FairDie:
    def __init__(self, sides: int) -> None:
        assert type(sides) == int and sides >= 1, 'Illegal value for sides'
        self._sides = sides

    def roll(self) -> int:
        return randint(1, self._sides)

然后:

代码语言:javascript
复制
four_sided = FairDie(4)
six_sided = FairDie(6)
   
print(f"5d4: {sum(four_sided.roll() for _ in range(5))}")
print(f"3d6: {sum(six_sided.roll() for _ in range(3))}")
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65766819

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档