在Python类中使用__iter__方法实现递归函数

时间:2014-10-31 07:30:56

标签: python recursion iteration generator

所以我正在研究一个问题,我要创建一个Python类来生成列表的所有排列,并且我遇到了以下问题:

  1. 我可以使用简单的递归函数轻松完成此操作,但作为一个类,我似乎想要使用 iter 方法。我的方法调用一个与我的 iter 几乎相同的递归函数(list_all),这非常令人不安。如何修改递归函数以符合 iter 的最佳做法?
  2. 我写了这段代码,看到它有效,我觉得我不明白!我尝试在测试用例中逐行跟踪代码,但对我来说,看起来列表中的第一个元素每次都被冻结,并且列表的其余部分被洗牌。相反,输出以意想不到的顺序出现。我不明白什么!
  3. 谢谢!

    class permutations():
      def __init__(self, ls):
        self.list = ls
    
      def __iter__(self):
        ls = self.list
        length = len(ls)
        if length <= 1:
          yield ls
        else:
          for p in self.list_all(ls[1:]):
            for x in range(length):
              yield p[:x] + ls[0:1] + p[x:]  
    
      def list_all(self, ls):
        length = len(ls)
        if length <= 1:
          yield ls
        else:
          for p in self.list_all(ls[1:]):
            for x in range(length):
              yield p[:x] + ls[0:1] + p[x:]
    

1 个答案:

答案 0 :(得分:0)

只需从self.list_all致电__iter__

class permutations():
  def __init__(self, ls):
    self.list = ls

  def __iter__(self):
    for item in self.list_all(self.list):
      yield item

  def list_all(self, ls):
    length = len(ls)
    if length <= 1:
      yield ls
    else:
      for p in self.list_all(ls[1:]):
        for x in range(length):
          yield p[:x] + ls[0:1] + p[x:]