社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

是否可以在预定义的可变数据上创建python迭代器?

Wilduck • 6 年前 • 1842 次点击  

我可能做错了,如果是的话,请告诉我,但我很好奇是否可能发生以下情况:

我有一个类,它包含许多字典,每一个字典都将名称对到一个给定类的不同对象集。例如:

items = {"ball" : ItemInstance1, "sword" : ItemInstance2}
people = {"Jerry" : PersonInstance1, "Bob" : PersonInstance2, "Jill" : PersonInstance3}

然后,我的类将保存当前项目和可用人员,这些项目和人员将随着状态的更改而更改:

Class State:
    def __init__(self, items, people):
        self.items = items
        self.people = people

我想定义一个 伊特尔 ()和next()方法,使其迭代其属性中的所有值。我的第一个问题是这是否可能。如果是,它是否能够支持以下情况:

我定义项目和人员如下:

state = State(items, people)
for names, thing in state:
    print name + " is " + thing.color

items[cheese] = ItemInstance3
for names, thing in state:
    print name + " weighs " + thing.weight

虽然我觉得这在我的代码中是有用的,但我不知道这是可能的还是正确的方法。关于用户定义的迭代器,我所读到的所有内容都建议它们的每个实例只能使用一次。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/30330
 
1842 次点击  
文章 [ 2 ]  |  最新文章 6 年前
Py站长
Reply   •   1 楼
Py站长    6 年前

还可以的

Colin
Reply   •   2 楼
Colin    14 年前

有很多方法可以做你想做的事。您确实可以拥有这样一个状态类,并实现 伊特尔 ()方法 http://docs.python.org/library/stdtypes.html )

还可以创建生成器函数:

   def iterate_two(l1, l2):
      for k in l1:
         yield k, l1[k]
      for k in l2:
         yield k, l2[k]

您可以使用itertools.chain。可以使用列表理解和生成器表达式。等。

我个人不会像您建议的那样创建状态类,如果它只是一个迭代器机制的话——我可能会使用列表理解。

awatts
Reply   •   3 楼
awatts    14 年前

如果我正确理解您的问题,那么向您的类中添加以下方法应该可以做到:

def __iter__(self):
    import itertools
    return itertools.chain(self.items.itervalues(), self.people.itervalues())

这将两个迭代器链接在一起,这里选择的迭代器用于 items 以及 people .

不过,为了使您以后的代码能够工作,您需要迭代这些项——键值对。在这种情况下,可以这样做:

def __iter__(self):
    import itertools
    return itertools.chain(self.items.iteritems(), self.people.iteritems())