-1

我只是想知道 python 语句的最接近的翻译是什么:

try:

except StopIteration:

我对 C++ 和 python 都很陌生,我想现在已经有 3-4 周了。虽然我知道一般的 if 语句会做相对相同的工作,但我只是不确定如何复制该StopIteration部分。一个简单的休息就足够了吗?

编辑:内部代码

try:
   nextread1=myfile1.next()
   nextread2=myfile2.next()
except StopIteration:
   print("error msg")
   sys.exit(2)
4

2 回答 2

3

StopIteration是 Python 中的一个特殊异常,当您尝试获取新元素但不再存在时,迭代器会抛出该异常。这就是 Python 检测何时停止循环(如for x in iterator. 这基本上在 Python 中转换为:

while True:
    try: value = next(iterator)
    except StopIteration: break
    # do something...

但是,C++ 的 STL 中的迭代器有很大不同。我不确定您希望在哪个级别看到 C++ 翻译。如果你有类似 Python 中的迭代器,你也许可以 1:1 转换代码。但是 STL 迭代器的行为不是这样的。如果您尝试在没有下一个元素时读取它,它不会抛出异常。该行为是相当不确定的,很可能会导致崩溃。在所有容器的 STL 中,总是有一个特殊的结束迭代器(它在容器之外!)并且你检查你的迭代器是否等于结束迭代器。如果是这种情况,您知道您不能阅读任何其他元素。这大多看起来像这样:

auto iterator = mylist.begin(); // get the iterator at the start of mylist
while(iterator != mylist.end()) { // check if our iterator is not equal to the end-iterator
    auto value = *iterator; // get the value of the iterator
    // do something with value
    ++iterator; // advances the iterator by one
}

请注意,next()在 Python 中做了两件事:如果有一个值,则返回当前值并将迭代器前进 1。否则,它会引发StopIteration异常。在 C++ 中,当前值通过返回*iterator,迭代器前进++iterator. 此外,在 C++ 中,也不例外,因此您必须自己进行检查(即iterator != mylist.end())。

用 C++ 编写它的一种更短且更常见的方法是:

for(auto iterator = mylist.begin(); iterator != mylist.end(); ++iterator) {
    auto value = *iterator; // get the value of the iterator
    // do something with value
}

或者,更短:

for(auto value : mylist) {
    // do something with value
}

list对于所有 STL 容器,如, vector, deque, set,的代码都是这样工作的multiset。Avector主要是内部的一个数组。但是 C 数组(例如int numbers[N];)不适用于前两个代码示例,因为它不是对象并且没有begin()andend()函数。但是,最后一个示例也适用于这种情况。

如果你编写一个自己的容器类,你还应该实现一些使上述代码像这样工作的函数begin()end()


请注意,C++ 中的文件读取再次不同。在 Python 中,当您使用 时for x in myfile,它会自动在文件的行上生成一个迭代器,并且您正在使用该迭代器。当然,Python 中还有其他方法可以读取文件,例如myfile.read(). 后者在 C 中有一个直接的等价物,即fread()(或者也简单地read(),但你应该使用fread()它,因为它更节省并且你得到缓存)。但是 C/C++ 中有很多不同的方式来读取文件,我不会在这里列出所有的可能性。


sys.exit()主要相当于 C-function exit()。但是您最好只return从所有功能开始,并在最后return退出,main()以便您的应用程序退出。

于 2013-10-17T12:37:19.880 回答
1

为了打破 C++ 中的循环,break使用了该语句。在你的循环中做这样的事情:

try
{
    ...
}
catch(MyException e) //use whatever exception you are trying to catch
{
    ...
    break;
}
于 2013-10-17T10:05:45.303 回答