Python 是什么导致我在三角形解中求和时出现NZEC(非零退出码)错误?

Python 是什么导致我在三角形解中求和时出现NZEC(非零退出码)错误?,python,python-2.7,Python,Python 2.7,我在做一件事。我已经并且正在尝试在Python2.7中做同样的事情。我在codechef judge上得到NZEC错误,这是“非零出口代码”。我不明白为什么会发生这种事。这个程序在我的电脑上运行得很好。什么样的情况会导致这个问题 import sys from itertools import islice def p(): cases = int(sys.stdin.readline()) for case in xrange(cases): height

我在做一件事。我已经并且正在尝试在Python2.7中做同样的事情。我在codechef judge上得到NZEC错误,这是“非零出口代码”。我不明白为什么会发生这种事。这个程序在我的电脑上运行得很好。什么样的情况会导致这个问题

import sys
from itertools import islice

def p(): 
    cases = int(sys.stdin.readline())
    for case in xrange(cases):
        height = int(sys.stdin.readline())
        triangle = [map(int, i.split()) for i in islice(sys.stdin,height)]

        prev_row = triangle[0]
        for i in xrange(1, height):
            cur_row = triangle[i]

            cur_row[0] += prev_row[0]
            cur_row[len(cur_row) - 1] += prev_row[len(prev_row) - 1]

            for j in xrange(1, len(cur_row) - 1):
                if(prev_row[j - 1] > prev_row[j]):
                    cur_row[j] += prev_row[j - 1]
                else:
                    cur_row[j] += prev_row[j]

            prev_row = cur_row

        print max(prev_row)

p()
更改此行:

triangle = [map(int, i.split()) for i in islice(sys.stdin,height)]
为此:

triangle = [map(int, sys.stdin.readline().split()) for _ in xrange(height)]
从:

作为使用预读缓冲区的结果,组合
next()
使用其他文件方法(如
readline()
)无法正常工作

演示:


$python so.py请查看Codechef常见问题解答:


不要混合使用file对象作为迭代器,并在对象上调用
.readline()

通过在
sys.stdin
上使用
islice()
可以将对象视为迭代器,在引擎盖下调用
file.next()
。从:

为了使for循环成为在文件行上循环的最有效方式(一种非常常见的操作),
next()
方法使用隐藏的预读缓冲区。使用预读缓冲区的结果是,将
next()
与其他文件方法(如
readline()
)结合使用无法正常工作

解决方案是不使用
.readline()
或不将文件对象用作迭代器。在这种情况下,请使用
next(sys.stdin)
而不是
sys.stdin.readline()
来一致地将对象用作迭代器。在任何情况下,这都比使用
.readline()
更有效:

def p(): 
    cases = int(next(sys.stdin))
    for case in xrange(cases):
        height = int(next(sys.stdin))
        triangle = [map(int, i.split()) for i in islice(sys.stdin, height)]
甚至:

def p(): 
    for case in xrange(int(next(sys.stdin))):
        triangle = [map(int, i.split()) for i in islice(sys.stdin, int(next(sys.stdin)))]

这似乎是codechef的特点。这与python无关itself@aksam您可能应该看看这个@aksam,请不要在问题中添加多余的标签。这不是一个运行时错误,正如oleg、Martijn和Aseem自己在问题中所指出的(“程序在我的计算机上运行得很好。”)请参阅我所做的编辑,以了解什么样的更改在这里是合适的。我是Python新手,所以我在尝试理解它产生的差异时遇到了问题。你能解释一下吗?这个解决方案有效,但我不明白为什么我不能在sys.stdin上使用islice?我以前用过这个,效果很好。你能看看这个吗@MartijnPieters我同意评论有缺陷(现在已删除),但我后来说,
islice
可以使用,但不能与
readline()
read()
等混合使用。尽管感谢
seek()
技巧,今天学到了一些新东西。:)对,看到了,;清除了我的评论。我更正了关于NZEC完整形式的问题。这仍然不能回答我的问题。这更有意义。你怎么知道调用islice会调用引擎盖下的file.next()?我怎么知道?我已经阅读了官方Python教程的一部分。我也应该开始阅读图书馆参考资料吗?因为单靠练习对我没有多大帮助。@Zel:
islice()
和其他迭代工具(例如整个
itertools
模块)都可以使用;迭代器类型的Python API定义良好。是调用迭代器以获取其下一个值的标准函数;它比调用
fileobj.next()
工作得更好,因为在Python 3中,后者被重命名为
。\uuuuu next\uuuu()
。实际上,我是在征求建议,如何不必每次询问就知道更多…@Zel:Python教程在类一章中介绍了迭代器。@Zel:别担心问这类问题!迭代器是相对高级的编程魔术。我不希望人们立即知道并探究这一点。
def p(): 
    cases = int(next(sys.stdin))
    for case in xrange(cases):
        height = int(next(sys.stdin))
        triangle = [map(int, i.split()) for i in islice(sys.stdin, height)]
def p(): 
    for case in xrange(int(next(sys.stdin))):
        triangle = [map(int, i.split()) for i in islice(sys.stdin, int(next(sys.stdin)))]