Python 为什么';这个代码不会触发ValueError吗?

Python 为什么';这个代码不会触发ValueError吗?,python,Python,当“chunk_size”为零或大于“sequence”的长度时,我试图触发一个错误。当我用chunk_size为4、sequence等于“123”调用这个函数时,它不会抛出错误。我做错了什么 def slices(sequence,chunk_size): position=0 mini_list=[] answer=[] while chunk_size<=len(sequence) and chunk_size>0: try:

当“chunk_size”为零或大于“sequence”的长度时,我试图触发一个错误。当我用chunk_size为4、sequence等于“123”调用这个函数时,它不会抛出错误。我做错了什么

def slices(sequence,chunk_size):
    position=0
    mini_list=[]
    answer=[]

    while chunk_size<=len(sequence) and chunk_size>0:

        try:
            for char in sequence:
                if len(sequence[position:position+chunk_size])==chunk_size:
                    mini_seq = sequence[position:position+chunk_size]
                    for digit in mini_seq:
                        mini_list.append(int(digit))
                    answer.append(mini_list)
                    mini_list=[]
                    position+=1
            return answer
            break

        except ValueError:
            print "Oops!  That was no valid number.  Try again..."

print slices("012", 4)
def切片(序列、块大小):
位置=0
迷你列表=[]
答案=[]
而chunk_size0:
尝试:
对于按顺序排列的字符:
如果len(序列[位置:位置+块大小])==块大小:
最小顺序=顺序[位置:位置+块大小]
对于小序号中的数字:
小列表。追加(整数(数字))
答案.附加(小列表)
迷你列表=[]
位置+=1
回覆
打破
除值错误外:
打印“哦!这不是有效的数字。请重试…”
打印切片(“012”,4)

它不会抛出ValueError,因为您在while块中引发它,并且while块只有在
块大小
<0
>len(str)
的所需条件未满足时才被输入

因此,要更正此问题,请将引发错误的代码部分移出
while
循环。事实上,您在
中放置的条件while
是错误的,请将其转换为
if
语句。另外,在
return
语句之前加一个中断也没有任何意义

所以你的代码变成了

while True:
    try:
        if chunk_size<=len(sequence) and chunk_size>0:
            for char in sequence:
                if len(sequence[position:position+chunk_size])==chunk_size:
                    mini_seq = sequence[position:position+chunk_size]
                    for digit in mini_seq:
                        mini_list.append(int(digit))
                    answer.append(mini_list)
                    mini_list=[]
                    position+=1
            return answer
        else:
            raise ValueError       
    except ValueError:
        print "Oops!  That was no valid number.  Try again..."
为True时:
尝试:
如果块大小为0:
对于按顺序排列的字符:
如果len(序列[位置:位置+块大小])==块大小:
最小顺序=顺序[位置:位置+块大小]
对于小序号中的数字:
小列表。追加(整数(数字))
答案.附加(小列表)
迷你列表=[]
位置+=1
回覆
其他:
升值误差
除值错误外:
打印“哦!这不是有效的数字。请重试…”
此外,您可以不用引发异常本身,而不用引发错误来验证数据的格式是否正确,并通过简单的if-else块获得相同的结果:

while True:
    if chunk_size<=len(sequence) and chunk_size>0:
        for char in sequence:
            if len(sequence[position:position+chunk_size])==chunk_size:
                mini_seq = sequence[position:position+chunk_size]
                for digit in mini_seq:
                    mini_list.append(int(digit))
                answer.append(mini_list)
                mini_list=[]
                position+=1
        return answer
    else:
        print "Oops!  That was no valid number.  Try again..."
为True时:
如果块大小为0:
对于按顺序排列的字符:
如果len(序列[位置:位置+块大小])==块大小:
最小顺序=顺序[位置:位置+块大小]
对于小序号中的数字:
小列表。追加(整数(数字))
答案.附加(小列表)
迷你列表=[]
位置+=1
回覆
其他:
打印“哦!这不是有效的数字。请重试…”

您认为代码的哪一部分应该抛出错误?如果您在列表中超出范围-您将得到一个
索引器
而不是
值错误
而且您永远不会到达
的主体,因为
块大小
永远不会小于或等于3。@Ankit Jaiswal-“而块大小0”应该抛出一个错误(我认为),因为它的计算结果为False。@Mu,以及所有:我刚刚意识到我是多么愚蠢。@user1473511如果我的答案有用,别忘了:)