【问题标题】:Skipping yield in python在python中跳过产量
【发布时间】:2014-06-16 08:53:39
【问题描述】:

我正在写一个generator,它接受一个iterable 和一个整数n。例如,如果我调用我的生成器:

generator('abcdefg',2)

那么它应该产生adg跳过2个字母。

当我调用 iter(iterable) 然后使用 yield next 时,yield 会自动跳过 1 个字母。我如何告诉 python 跳过让步以便我可以跳过 n 字母?

【问题讨论】:

    标签: python python-3.x iterator generator yield


    【解决方案1】:

    您的生成器实际上是带有 step 参数的 islice,因此您可以将原始 iterable 包装成这样:

    from itertools import islice
    
    def generator(iterable, skip):
        return islice(iterable, None, None, skip+1)
    
    for item in generator('abcdefg', 2):
        print(item)
    # a
    # d
    # g
    

    如果您想手动编写,那么可能一种简单的理解方法是首先从可迭代中yield'ing,然后从可迭代中消耗间隙大小...

    def generator(iterable, skip):
        it = iter(iterable)
        while True:
            yield next(it)
            for _ in range(skip):
                next(it)
    

    【讨论】:

      【解决方案2】:

      这可能是你想要的

      def generator(string, skip):
          for i,c in enumerate(string):
              if i % (skip+1)==0:
                  yield c
      

      这实际上并没有“跳过” yield 语句,即每个 yield 都被执行。然而,yield 只在字符串字符的固定迭代间隔被调用。

      【讨论】:

        【解决方案3】:

        使用custom iterator的基本框架:

        class skipper():
            def __init__(self, iterable, skip_count):
                self.it = iter(iterable)
                self.skip = skip_count
            def __iter__(self):
                return self
            def __next__(self):
                value = next(self.it)
                for _ in range(self.skip):
                    next(self.it, None)
                return value
        

        您可以轻松地将所需的任何其他行为添加到此类。

        【讨论】:

          【解决方案4】:

          您只需使用 next() 函数即可完成此操作

          def make_generator():
              for x in range(1, 10):
                  yield x
          
          
          my_generator = make_generator()
          
          
          def generator(temp_generator, num):  # generator('abcdefg',2)
              for x in range(num):
                  next(temp_generator)
              for y in temp_generator:
                  print(y)  # Skipped Value of generator
          generator(my_generator, 2)
          

          输出:3 4 5 6 7 8 9

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-01-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-06-14
            • 2017-06-11
            • 1970-01-01
            相关资源
            最近更新 更多