【问题标题】:iterate over a list as iterator in python迭代列表作为python中的迭代器
【发布时间】:2015-05-20 02:35:41
【问题描述】:

我有一个返回对象列表的函数(例如,我使用了下面的代码)。每个对象都有一个名为 text 的属性:

def mylist():
    mylist = []
    for i in range(5):
        elem = myobject(i)
        mylist.append(elem)
    return mylist

for obj in mylist():
    print obj.text

如何重写此代码,以便 mylist() 每次迭代都返回新值并迭代迭代器?换句话说,我怎样才能在 python 中重用 mylist 以便像 xrange() 一样使用它?

【问题讨论】:

  • 鉴于您已包含generator,有什么问题?
  • 没问题)我只想从 mylist --> xmylist 中制作。从范围-> xrange。我只是不知道如何迭代生成器。只需将单词“return”更改为“yield”不起作用:AttributeError:'generator' 对象没有属性'text'。对不起愚蠢的问题。我是这个话题的新手。

标签: python iterator generator


【解决方案1】:

如果我没看错,你在找generators

def mylist():
    for i in range(5):
        elem = myobject(i)
        yield elem

完整的代码供你玩:

class myobject:
    def __init__(self, i):
        self.text = 'hello ' + str(i)

def mylist():
    for i in range(5):
        elem = myobject(i)
        yield elem

for obj in mylist():
    print obj.text

【讨论】:

    【解决方案2】:

    你也可以使用生成器表达式:

    mylist = (myobject(i) for i in range(5))
    

    这将为您提供一个实际的生成器,但无需事先声明一个函数。

    请注意使用括号而不是方括号来表示生成器推导而不是列表推导

    【讨论】:

    • 很好的解决方案)))真正的pythonish)))但是我的问题是如何将对象列表(任何对象)转换为迭代器。但无论如何 - 谢谢)
    【解决方案3】:

    georg 说了什么,或者你可以返回那个列表的iter

    def mylist():
        mylist = []
        for i in range(5):
            mylist.append(myobject(i))
        return iter(mylist)
    

    不过,将函数名用作变量名可能不是一个好主意:)

    【讨论】:

    • 虽然这个答案是“正确的”,因为它有一个迭代器,它与 when 评估发生时的其他迭代器不同 - 它是一个对急切评估的惰性包装器。 (我相信 OP 正在寻求避免急切的范围类位。)
    【解决方案4】:
    llist = [0,4,5,6] 
    ii = iter(llist) 
    while (True): 
        try: 
            print(next(ii)) 
        except StopIteration: 
            print('End of iteration.') 
            break 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-11
      • 1970-01-01
      • 2019-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-10
      相关资源
      最近更新 更多