【问题标题】:Using Random Once in a While loop在 While 循环中使用随机一次
【发布时间】:2015-02-21 20:10:49
【问题描述】:

在 while 循环中使用随机数时,我在使用类时遇到了一点问题。目标是第一次生成随机字符串并在整个课程中使用它。这是有问题的四行。

 def run_review(self, key_history):
        level = reviewer.ReviewLesson(self.history_list)
        if self.counter:
            level.shuffled()
            self.counter = False
            return shuffle
        level.review()
        level.review_lesson()

来自另一个模块

def shuffled(self):
        self.shuffled_list = sorted(self.history_list, key=lambda k: random.random())
        return self.shuffled_list

    def review(self): 
        for item in self.shuffled_list:
            self.word = item+self.word
        self.word = self.word*7
        return self.word


    def review_lesson(self):
        word = ''
        self.word = word+self.word
        return self.word

问题是在第一个块之后 review_lesson 是一个空白空间,因为 level.review() 没有被调用,但是如果 level.review 被调用,它就会变成另一个随机序列。

编辑:使代码更加清晰,并删除了重复的函数。

【问题讨论】:

  • 将随机调用移到方法之外,为什么还要向 self.word 添加一个空字符串并分配 self.word = ... 两次?
  • @poor 编码为第二个。 def run_review 是一个 while 循环,它为 pygame 运行循环,但正如您的建议,我已编辑为显示:
  • self.word + ""self.word 相同,如果您只想要一个值,只需将shuffled_list 声明为类属性,就像我的回答中一样或实例属性,具体取决于您想要的。然后在方法中使用,这样只会创建一次
  • 你确实是对的,我唯一的问题是 self.history_list 是在 init 中定义的,所以现在它不会让我定义它。
  • 我不确定我是否遵循,为什么不能将其定义为属性?

标签: python string random


【解决方案1】:

您似乎在您的方法中将 self.word 分配给多个事物,因此不完全确定这是在做什么,但能够使用 review 并获得相同的随机 shuffled_list 每次将 shuffled_list 声明为类属性:

 # either declare before init, or use self.shuffled_list = .. in your init method
 shuffled_list = sorted(self.history_list, key=lambda k: random.random())

def review(self): 
        for item in class_name.shuffled_list:
            self.word = item+self.word
        self.word *= 7
        return self.word

例如:

 class Foo():
    r = randint(1, 7) # either here as class attribute so it will be the same for all instances
    def func(self):
        return  Foo.r

## -- End pasted text --

In [13]: for _ in range(5):
            f = Foo()
            print(f.func())
            f1 = Foo()
            print(f1.func())
   ....:     
2
2
2
2
2
2
2
2
2
2

一个类属性将在所有实例中保持相同:

class Foo():
    r = randint(1, 7) 
    def func(self):
        return  Foo.r

如果您想为每个实例设置不同的值,请将其设为实例属性:

    class Foo():
        def __init__(self)
            self.r = randint(1, 7) 
        def func(self):
            return  self.r

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-29
    • 1970-01-01
    • 2016-06-11
    • 2020-12-15
    • 2015-09-28
    • 2021-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多