Python中的递增迭代器(iter)

Python中的递增迭代器(iter),python,c++,string,iterator,Python,C++,String,Iterator,例如,我有以下字符串: s = "string" 我试图维护这个字符串对象的迭代器 it = iter(s) 我知道我可以使用循环并使用next调用增加it for i in range(0, len(s)): print(next(it)) 这将打印此字符串中的所有字符 但是我有两个事情要迭代器做,就像我在C++ > STD::列表 中使用C++迭代器所做的那样。 1.)返回迭代器当前指向的元素。 // In C++, I would do, std::string

例如,我有以下字符串:

s = "string"
我试图维护这个字符串对象的迭代器

it = iter(s)
我知道我可以使用循环并使用
next
调用增加
it

for i in range(0, len(s)):
    print(next(it))
这将打印此字符串中的所有字符

<>但是我有两个事情要迭代器做,就像我在C++ > STD::列表

中使用C++迭代器所做的那样。 1.)返回迭代器当前指向的元素。

   // In C++, I would do,

   std::string str = "string";

   std::string::iterator it = str.begin();
   *it; // gets the value of element
2.)获取迭代器所在元素的索引。

   // In C++, I would do,

   std::string str = "string";

   std::string::iterator it = str.begin();
   *it; // gets the value of element
因此,我能够使用Python切片方法获取子字符串:

例如:

在C++中,我可以使用迭代器:

   std::string str = "string";
   std::string::iterator it = str.begin();
   std::string(it, it+3);

在Python中可以像这样增加迭代器吗?如果没有,那么我可以使用迭代器当前指向的元素的索引,我将如何做?

您可以使用内置的
enumerate()
函数:

for index, element in enumerate(mystring):
    print index
    print element

你可以这样做:

import itertools
s = "mystring"
s2 = ''.join(itertools.islice(s, 0, 3))

但是,实际上,不是试图直接翻译C++习语,而是要找到python方式来做你想做的任何事情,总之,它最终可能更简洁。

< Python的内置程序不提供任何可以获得迭代器的“当前元素”的任何东西。迭代器必须支持的唯一操作是
next
,以获取以下元素并推进迭代

但是,编写自己的迭代器来实现其他操作非常简单:

class AugmentedIterator(object):
    _sentinel = object()

    def __init__(self, iterator):
        self.iterator = iterator
        self.value = self._sentinel

    def __iter__(self):
        return self

    def __next__(self):
        if self.value is not self._sentinel:
            self.value, val = self._sentinel, self.value
            return val
        return next(self.iterator)

    def peek(self, default=_sentinel):
        if self.value is not self._sentinel:
            return self.value
        try:
            self.value = next(self.iterator)
        except StopIteration:
            if default is not self._sentinel:
                return default
            raise
        else:
            return self.value
现在,给定任何迭代器
it
,您可以将其包装到
augmenteditor
中,并且只要您愿意,就可以调用
peek()
来检查当前元素

请注意,没有所谓的
end()
,因为迭代器很容易是无限的。知道迭代器是否没有更多元素的唯一方法是调用
next
,查看它是否引发
StopIteration

对于第二个请求,您可以使用
itertools.islice
获取迭代器的片段。但是请注意,
islice
执行python切片,这允许越界索引:

In [19]: list(islice('string', 0, 1000))
Out[19]: ['s', 't', 'r', 'i', 'n', 'g']
这里的索引
1000
,因为它比字符串长度大,所以它的意思是:直到结束。这与切片一致:

In [20]: 'string'[:1000]
Out[20]: 'string'
<>在C++中,如果字符串长度为6,则尝试使用<代码> It + 1000 < /代码>时出错。(不是100%确定,但由于指针是不可编辑的,至少在某些情况下,您肯定会遇到一些麻烦)


总的来说,这个包包含很多有用的函数(在文档的末尾有一些使用它们的方法)。Python还提供了一些与迭代器相关的函数,例如:

  • :迭代元素并获取相对索引
  • 映射
    /
    过滤器
    /
    减少
  • :允许您获得给定函数的迭代器,无需参数:

    for chunk in iter(lambda: file_object.read(4096), ''):
        handle(chunk)
    
    相当于:

    while True:
        chunk = file_object.read(4096)
        if chunk == '':
            break
        handle(chunk)