dict方法dict.keys(),dict.items()和dict.values()返回"views"而不是list. http://docs.python.org/dev/3.0/whatsnew//3.0.html
首先,视图与迭代器有何不同?其次,这种变化有什么好处?这只是出于性能原因吗?
这对我来说似乎不太直观,也就是说,我要求列出一些东西(给我所有的钥匙),然后我又得到了别的东西.这会让人迷惑吗?
这对你们中的一些人来说可能看起来很无聊,但是对于STL容器,以下哪两种迭代方法更好?为什么?
class Elem;
typedef vector<Elem> ElemVec;
ElemVec elemVec;
// Method 0
for (ElemVec::iterator i = elemVec.begin(); i != elemVec.end(); ++i)
{
Elem& e = *i;
// Do something
}
// Method 1
for (int i = 0; i < elemVec.size(); ++i)
{
Elem& e = elemVec.at(i);
// Do something
}
Run Code Online (Sandbox Code Playgroud)
方法0似乎更清晰STL,但方法1使用较少的代码实现相同.在容器上简单重复的事情似乎都在以任何源代码的地方.所以,我倾向于选择方法1,这似乎可以减少视觉混乱和代码大小.
PS:我知道迭代器可以做的不仅仅是一个简单的索引.但是,请将回复/讨论集中在如上所示的容器上的简单迭代上.
作为一些WSGI中间件的一部分,我想编写一个包含迭代器的python类,以在迭代器上实现close方法.
当我尝试使用旧式类时,这可以正常工作,但是当我尝试使用新式类时会抛出TypeError.我需要做些什么来使用新式的类?
例:
class IteratorWrapper1:
def __init__(self, otheriter):
self._iterator = otheriter
self.next = otheriter.next
def __iter__(self):
return self
def close(self):
if getattr(self._iterator, 'close', None) is not None:
self._iterator.close()
# other arbitrary resource cleanup code here
class IteratorWrapper2(object):
def __init__(self, otheriter):
self._iterator = otheriter
self.next = otheriter.next
def __iter__(self):
return self
def close(self):
if getattr(self._iterator, 'close', None) is not None:
self._iterator.close()
# other arbitrary resource cleanup code here
if __name__ == "__main__":
for i in IteratorWrapper1(iter([1, 2, 3])):
print i
for …Run Code Online (Sandbox Code Playgroud) 我对take特质中方法的行为感到困惑Iterator.它似乎不消耗物品.这是一个例子:
scala> Iterator(1,2,3)
res0: Iterator[Int] = non-empty iterator
scala> res0 take 2 toArray
res1: Array[Int] = Array(1, 2)
scala> res0.next
res2: Int = 1
Run Code Online (Sandbox Code Playgroud)
显然,步骤2消耗两个项目,但在步骤3 Iterator中仍然是第一个项目.看看实现,我看不到任何类型的复制或缓冲,只是一个新的Iterator委托给底层的.怎么可能呢?我怎样才能真正消耗n个物品?
C++ STL类std :: map使用二叉树实现O(log(n))查找.但是对于树,迭代器如何工作并不是很明显.++运算符在树结构中实际意味着什么?虽然"下一个元素"的概念在数组中有明显的实现,但对于我来说,它在树中并不那么明显.如何实现树迭代器?
我有一个用例,我需要迭代Vector元素并将结果存储在say数组中,只要该实例是类method
这有什么容易的吗?
目前我这样做:
Iterator itr = vec.iterator();
Iterator element = vec.iterator();
while(itr.hasNext())
{
boolean method = itr.next() instanceof Method;
if(method)
System.out.println( "\t" + ( (Method)(element.next()) ).name);
else
element.next();
}
Run Code Online (Sandbox Code Playgroud)
但我认为会有比这更好的方法.
受我自己答案的启发,我甚至不了解它是如何起作用的,请考虑以下几点:
def has22(nums):
it = iter(nums)
return any(x == 2 == next(it) for x in it)
>>> has22([2, 1, 2])
False
Run Code Online (Sandbox Code Playgroud)
我预计会有一个StopIteration被提升,因为一旦到达2,next(it)就会推进消耗的迭代器.但是,对于生成器表达式,似乎已完全禁用此行为!break一旦发生这种情况,生成器表达似乎立即出现
>>> it = iter([2, 1, 2]); any(x == 2 == next(it) for x in it)
False
>>> it = iter([2, 1, 2]); any([x == 2 == next(it) for x in it])
Traceback (most recent call last):
File "<pyshell#114>", line 1, in <module>
it = iter([2, 1, …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用返回迭代器的函数构建一个特征.
我的简单示例如下所示:
pub trait TraitA {
fn things(&self) -> Iterator<Item=&u8>;
}
fn foo<A: TraitA>(a: &A) {
for x in a.things() { }
}
Run Code Online (Sandbox Code Playgroud)
哪个不起作用,因为在编译时不知道Iterator大小类型.
参见,例如, http ://en.cppreference.com/w/cpp/container/map/erase
在C++ 03中有三个重载:
void erase( iterator pos );
void erase( iterator first, iterator last );
size_type erase( const key_type& key );
Run Code Online (Sandbox Code Playgroud)
在C++ 11中,第一和第二过载改变为采取const_iterator,使得它们可与任一被调用iterator或const_iterator.第一次重载也通过在删除之后将迭代器返回到元素来改进:
iterator erase( const_iterator pos );
void erase( const_iterator first, const_iterator last );
size_type erase( const key_type& key );
Run Code Online (Sandbox Code Playgroud)
在C++ 17中,重新引入了非const重载:
iterator erase( const_iterator pos );
iterator erase( iterator pos );
void erase( const_iterator first, const_iterator last );
size_type erase( const key_type& key );
Run Code Online (Sandbox Code Playgroud)
为什么需要这个?它不加入为不等erase,也不是为insert …