【问题标题】:Replace ending integer number of a function with another random integer number [duplicate]用另一个随机整数替换函数的结束整数[重复]
【发布时间】:2020-07-13 11:26:05
【问题描述】:

我有一个函数,它生成一个介于 1 和 6 之间的随机整数,并根据该数字调用一个函数。

我还有 6 个来自另一个类的函数,它们的名称以 1 到 6 的数字结尾。

我想调用我每次生成的随机数对应的函数,因为我想减少if语句的重复行。

是否可以将函数的结束数替换为随机数?

不确定这是否可行,但我已经想象过这样的事情:

sense.set_pixels(self.dice_(self.number)())

这是我当前的代码:

def roll(self):
    sense = SenseHat()
    self.number = random.randint(1,6)

    if self.number == 1:
        sense.set_pixels(self.dice_1())
    elif self.number == 2:
        sense.set_pixels(self.dice_2())
    elif self.number == 3:
        sense.set_pixels(self.dice_3())
    elif self.number == 4:
        sense.set_pixels(self.dice_4())
    elif self.number == 5:
        sense.set_pixels(self.dice_5())
    elif self.number == 6:
        sense.set_pixels(self.dice_6())

【问题讨论】:

    标签: python function random methods replace


    【解决方案1】:

    你可以使用元组:

    def roll(self):
        sense = SenseHat()
        self.number = random.randint(1,6)
    
        dice_functions = (None, self.dice_1, self.dice_2, self.dice_3,
                          self.dice_4, self.dice_5, self.dice_6)
    
        dice_functions[self.number]()
    

    或者更紧凑的事件:

    def roll(self):
        sense = SenseHat()
    
        (self.dice_1, self.dice_2, self.dice_3,
         self.dice_4, self.dice_5, self.dice_6)[random.randint(0, 5)]()
    

    【讨论】:

      【解决方案2】:

      你也可以这样做:

      dice = [self.dice_1, self.dice_2, self.dice_3, self.dice_4, self.dice_5, self.dice_6]
      random.choice(dice)()
      

      random.choice 给定一个序列返回一个随机元素。如果序列为空,则引发IndexError

      【讨论】:

        【解决方案3】:

        如果方法名称遵循您所说的特定模式,您可以使用getattr 函数根据计算名称获取方法:

        def roll(self):
            sense = SenseHat()
            self.number = random.randint(1,6)
            getattr(self, 'dice_%d' % self.number)()
        

        但在这种情况下,您更有可能将您的 dice_# 方法组合成一个使用实例的骰子编号的方法,从而生成更优雅的代码:

        def roll(self):
            sense = SenseHat()
            self.number = random.randint(1,6)
            self.dice()
        
        def dice(self):
            print(self.number)
            # so something with self.number
        

        【讨论】:

        • 除了玩具项目之外,使用getattr 将很难找出函数的使用位置。
        • @mkrieger1 是的,但getattr 方法有时很有意义,这可以在cmdunittest.TestCase 等标准库模块中看到。
        • 当然,但我猜它在那里被使用,因为没有更好的解决方案存在(不像这里)。
        • @mkrieger1 它确实存在。例如,cmd 可以通过要求开发人员使用类方法将自定义命令方法注册到类变量列表中来实现。这是例如 Django 的自定义过滤器注册所采用的方法。
        • 感谢大家的评论。 (y) 我一定会看看 getattr,听起来不错。
        【解决方案4】:

        我认为这不是正确的方法,我更愿意将所有 dice 函数封装到一个根据其输入运行的函数,但是如果您坚持您的解决方案,您可以执行以下操作:

        sense = SenseHat()
        sense.set_pixels(getattr(self,f"dice_{self.number}")())
        

        getattr 允许您通过名称动态获取类的成员。

        【讨论】:

        • 就是我要找的那个,谢谢,现在有意义了~
        • 如果它对你有帮助,请接受它作为答案,以帮助其他在同样问题上苦苦挣扎的人:)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-05-09
        • 2016-09-20
        • 2014-01-12
        • 2018-04-03
        • 2011-06-26
        • 2017-06-26
        • 1970-01-01
        相关资源
        最近更新 更多