【问题标题】:Calling iterator from another function in python从python中的另一个函数调用迭代器
【发布时间】:2015-03-15 03:03:47
【问题描述】:

假设我有一个列表列表。 我想遍历每个列表中的每个索引,并在另一个函数中使用它。 所以:

def func_a(self):
    for i in range(len(big_list)):
        current_list = big_list[i]
            for j in range(len(current_list):
                char_iter = iter(current_list)

def func_b(self):
    <<here i want to use the next char from iter>>
    <<how do i do it>>

我尝试过的事情:

  • next(func) -> 错误
  • next(char_iter) -> 最后一个字符

注意: 我在课堂上写了这个函数。

【问题讨论】:

  • 那么你希望 func_a 做的只是遍历所有内容,而 func_b 将使用来自 func_a 的每个值?
  • 请注意,for i in range(len(big_list)): current_list = big_list[i] 是一种糟糕的迭代方式。好多了for current_list in big_list

标签: python function class iterator


【解决方案1】:

不完全确定您在问什么。据我了解,您希望 func_a 遍历所有嵌套列表中的所有元素,并使其其他函数(尤其是 func_b)可以重用这些元素。

在这种情况下,您应该遍历列表和 yield 字符,使 func_a 成为生成器函数。

def func_a(self):
    for current_list in big_list:
        for char in current_list:
            yield char

然后你可以在func_b中这样使用它

def func_b(self):
    for char in func_a():
        print char

或使用next:

def func_b(self):
    gen = func_a()
    print next(gen)
    print next(gen)

【讨论】:

    【解决方案2】:

    这应该给你基本的想法。如果还不够,请提供更多说明。

    big_list = [[1,2,3],[3,4]]
    
    def func_a():
        for current_list in big_list:
            for value in current_list:
                yield value
    
    y = func_a()
    
    
    for x in y:
        print x
        if x>2:
            break
    
    print 'broke'
    for x in y:
        print x
    

    【讨论】:

      【解决方案3】:

      您不应该使用基于索引的访问,如果您始终只进行迭代,Python 效果最好,因为它允许延迟评估,以及处理流而不是随机访问容器。

      我建议使用生成器:

      def g(big_list):
          # no need for complicated indexing
          for current_list in big_list:
              # again, no need for index-based access
              for char in current_list:
                  yield char
      
      
      for char in g(the_big_list):
          func_b(char)
      

      【讨论】:

        【解决方案4】:
        def func_a(self):
            return [j for i in big_list for j in i]
        
        def func_b(self):
            flattened_big_list = func_a()
        

        【讨论】:

        • 这里 func_a 实际上创建了整个列表。我认为这不是 OP 想要的。
        • 您可以将那些外部的[...] 更改为(...) 以使其成为生成器。
        • @Joel 也许......但它只是一个很好的单行,你可以用 Python 列表理解来做我只需要炫耀它...... :)
        • @tobias_k 啊,对!但老实说,如果你真的想迭代,其他人建议的带有for ... for ... yield 的生成器更容易阅读。
        • @Joel 使我的基于列表理解的列表扁平化在语义上更合理
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-10
        • 2023-03-17
        • 1970-01-01
        • 2020-04-01
        • 1970-01-01
        相关资源
        最近更新 更多