【问题标题】:Re-evaluating a function to get a new random value in python重新评估函数以在 python 中获取新的随机值
【发布时间】:2013-12-21 06:26:16
【问题描述】:

这是我遇到问题的代码(简化以使其更清晰)。这是一个基于文本的游戏,只是为了帮助学习。

class Character(object):
    def __init__(self):
        self.level = 5
        self.moveset = [None,None,None,None] 

    def movesetleveling(self): 
        if self.level > 4:
            self.moveset[0] = Punch(self.level)

def punch(level):
    damagedealt = random.randint(0,5)**level
    return damagedealt

我想知道如何在这段代码中生成self.moveset[0] = Punch() 而不是等于Punch() 的输出。这样每次我在 while 循环中运行它时,它都会重新评估 Punch() 的输出,而不是评估一次 Punch() 并将其分配给 self.moveset[0] 的第 0 个索引。

【问题讨论】:

  • “在while循环中运行”是什么意思?你打算如何使用moveset
  • 您想在self.moveset 中设置四个随机打孔级别,还是希望self.moveset 中的第一项在循环的每次迭代中成为随机打孔值?
  • @BrenBarn moveset 将用于显示选择的玩家动作。他们将从列表中选择一个移动,然后对其进行评估以产生一个整数值,该值将是一个damagestat。这个伤害统计会影响敌人的健康。我创建了一个 while 循环,它一遍又一遍地执行此操作,但每次它对 self.moveset[0] 使用相同的值,而不是获取新值。
  • 将你的while循环添加到问题中
  • @BurhanKhalid 我希望第一个项目是循环的每次迭代中的随机打孔值。

标签: python function class python-3.x


【解决方案1】:

您可以将函数分配给self.moveset[0] 而不是其结果(使用functools.partial()):

from functools import partial

self.moveset[0] = partial(punch, self.level)

然后,在您的 while 循环中,调用它:

while True:
    new_punch_every_time = self.moveset[0]() #note: parentheses

self.moveset[0]() 调用 punch 函数并将 level 参数设置为 self.level(它在 partial 调用时的值)。

之所以有效,是因为函数、方法是 Python 中的一等公民。您可以将它们作为参数传递给其他函数、从函数返回、绑定到不同的名称、附加到列表等。

【讨论】:

  • partial?对初学者? ;)
  • @thefourtheye:OP 明确表示:“帮助学习”functools.partial() 是要学习的东西。它不是鳄鱼;如果你靠近它,它不会吃掉你。
  • 很好,但我怀疑问题可能出在(原始问题的)while循环中
  • @J.F.Sebastian 刚刚查看了functools 文档,我有点同意@thefourtheye 的观点。我的头在游泳。如果您知道一个对初学者更友好的答案,将不胜感激!
  • @user3124704: 你在这句话中不理解哪个概念/词:"self.moveset[0]() 调用punch 函数,level 参数设置为self.level(它的值在partial 通话时间)。”?你知道什么是函数吗?什么是函数参数?调用给定参数的函数是什么意思?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-09
  • 2012-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多