当前位置: 首页 > 面试题库 >

对它执行一些操作后,Python迭代器为空

田志
2023-03-14
问题内容

我试图对python3中的codeeval进行挑战,并试图改善我的解决方案。每次我尝试在同一个迭代器上连续两次迭代(或打印或执行其他操作)时,第二个循环为空。这是产生此行为的一个最小示例,尽管我尝试了使用列表等的几种不同组合,但结果却相同:

numbers = ('1','2','3','4','5')
numbers = map(int, numbers)                                                    
print(list(numbers))                                                          
print(list(numbers))

结果是:

[1, 2, 3, 4, 5]
[]

为什么打印(在这种情况下)会删除数字的内容?


问题答案:

这正是迭代器的工作方式。它们被设计为一次只生成一次动态数据,而不再需要一次。如果要第二次获取数据,则必须将所有迭代的数据保存到另一个列表中,或者再次启动迭代器。如果您需要读取文件或做其他烦人的事情来重新获得该迭代器,则最好在生成数据时将其存储在列表中。

>>> numbers = ('1','2','3','4','5')
>>> ints = [x for x in map(int, numbers)]
>>> print(list(ints))
[1, 2, 3, 4, 5]
>>> print(list(ints))
[1, 2, 3, 4, 5]

https://docs.python.org/2/library/stdtypes.html#iterator-
types

该协议的目的是,一旦迭代器的next()方法引发StopIteration,它将在后续调用中继续这样做。不遵守此属性的实现被视为已损坏。(在Python
2.3中添加了此约束;在Python 2.2中,根据此规则破坏了各种迭代器。)

我应该注意,我运行了您在Python 2.4.3上给出的确切代码,并且每次都打印出列表。我想这是与版本有关的事情。



 类似资料:
  • 本文向大家介绍Python可迭代对象操作示例,包括了Python可迭代对象操作示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Python可迭代对象。分享给大家供大家参考,具体如下: 1、列表生成式 输出: <class 'generator'> <generator object <genexpr> at 0x0000024E6AC08F10> 0 输出: [0, 1, 2, 3,

  • 问题内容: 我有一个实现该接口的类,但是Java的foreach循环需要该接口。是否有一个到适配器在Java的标准库? 问题答案: 您需要一个所谓的“适配器”,以适应不兼容的。Apache commons- collections具有。用法是:

  • 问题内容: 这个问题已经在这里有了答案 : 嵌套函数中的局部变量 (4个答案) 5年前关闭。 我在玩Python生成器和模块,并尝试制作无限版的Eratosthenes筛。这是我的代码: 当我对其进行测试时,我得到以下信息: 但是,如果我用这样的函数代替的重新分配: 我得到: 我不知道为什么第一个版本不起作用。据我所知,这两个版本应该等效。有谁知道为什么他们不一样? 问题答案: 在Python中使

  • 问题内容: 在python 2.6中,我想对每个字典值执行一个运算,例如,我想对每个字典值乘以2。如何为该任务减少编码? 问题答案:

  • 问题内容: 我想了解更多有关的信息,所以如果我错了,请纠正我。 迭代器是一个对象,该对象具有指向下一个对象的指针,并作为缓冲区或流(即,链表)读取。它们特别有效,因为它们所做的只是通过引用而不是使用索引来告诉您下一步是什么。 但是我仍然不明白为什么会发生以下行为: 经过迭代器()的第一个循环后,就好像它已被消耗并且留空,因此第二个循环()不输出任何内容。 但是,我从未为变量分配新值。 循环幕后到底

  • 问题内容: 无论如何,要使python列表迭代器向后移动? 基本上我有这个 运行以下代码将产生输出: 我知道为什么它会给我输出,但是有没有办法我可以在str()方法中向后退一步呢? 编辑 好吧,也许可以更清楚地说明这一点。我不想做一个完全相反的事情,基本上我想知道是否有一种简单的方法可以等效于python中的 双向 迭代器? 问题答案: 不,通常您不能使Python迭代器向后移动。但是,如果您只想