抓住甚至价值的例外是真的吗?

时间:2013-04-25 21:03:08

标签: python exception iteration python-3.3

我目前正在尝试编写一个迭代序列(x)的代码,搜索用户输入的单词。

以下是代码。

x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
i = -1
while True:
    s = input("Enter a word to search: ")
    if s != "Quit":
        try:
            while i < len(x):
                i = x.index(s, i+1)
                print("found at index", i)
        except ValueError:
            print("Not found")
        i = -1
    else:
        break
print("Goodbye")

上面的代码在迭代中工作正常,但是在遍历序列之后总会返回ValueError。我试图通过添加:

来纠正这个问题
while i < len(x):

认为迭代一旦到达序列的末尾就会停止,但是在从序列中返回找到的值之后它继续抛出异常。

例如,如果用户输入“9”,则返回的是:

found at index 8
Not found

3 个答案:

答案 0 :(得分:4)

您正在尝试查找所有次出现,但在最后一次出现之后您将找不到下一次出现:

>>> 'abc'.index('a', 0)
0
>>> 'abc'.index('a', 1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: substring not found

你需要设置一个标志来表明你发现了至少一个匹配,因为任何数量的匹配都会引发异常:

i = -1
try:
    found = False
    while i < len(x):
        i = x.index(s, i+1)
        print("found at index", i)
        found = True
except ValueError:
    if not found:
        print("Not found")

但如果您要扫描整个x列表 ,只需使用过滤器:

matches = [i for i, value in enumerate(x) if value == s]:
if not matches:
    print('Not found')
for match in matches:
    print("found at index", i)

如果你只需要找到一个匹配,第一个,你根本不需要使用循环:

try: 
    print("found at index", x.index(s))
except ValueError:
    print("not found")

因为没有必要在起始位置上循环。

答案 1 :(得分:0)

您始终获得ValueError的原因是因为您始终会继续遍历列表中的项目,直到获得ValueError。您需要在内部while循环中包含某种条件,以便在找到元素时退出。更好的是,做我在下面发布的编辑。

而不是:

try:
    while i < len(x):
        i = x.index(s, i+1)
        print("found at index", i)
except ValueError:
    print("Not found")
i = -1

试试这个:

try: 
    print("found at index", x.index(s))
except ValueError:
    print("not found")

更简单。

答案 2 :(得分:0)

首先获取一个计数,如果您想要列表中多个匹配项的位置,则获取出现的索引

x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
n = 0
while True:
    s = input("Enter a word to search: ")
    if s != "Quit":
        n = x.count(s)
        if s == 0:
            print('not found')
        else:
            i = -1
            while n > 0:
                print('found at index:', x.index(s,i+1))
                n = n - 1
    else:
        break
print("Goodbye")

虽然可能还有一种更简单的方法。