Wolframalpha api 中的迭代错误是什么,我该如何解决?
What is iteration error in Wolframalpha api and how can I fix it?
所以我正在努力制作一个简单的研究机器人,但我 运行 遇到了问题。我在 python 中遵循有关使用 wolfram alpha 的指南,当我测试它时,有时会出现错误
Traceback (most recent call last):
File "python", line 6, in <module>
StopIteration`.
这是我的代码:
import wolframalpha
import wikipedia
client = wolframalpha.Client('my_id')
q=input('Problem: ')
res = client.query(q)
print(next(res.results).text)
它只发生在一些查询中并且经常有效,但仍然很烦人。我在网上查看但没有找到任何帮助,所以我不知道这是新的还是我的代码有问题。不管怎样,这里是一个 link 对我所做的回复,但它不起作用 here。尝试使用“uranium”我知道其中一个会带来错误,我试过的其他几个也会出错。谢谢!
此错误告诉您查询没有结果。
这一行:
print(next(res.results).text)
… 在迭代器 res.results
上调用 next
,没有默认值:
Retrieve the next item from the iterator by calling its __next__()
method. If default is given, it is returned if the iterator is exhausted, otherwise StopIteration
is raised.
如果 res
没有结果显示给您,则 res.results
是一个空迭代器。这意味着它从一开始就用完了,所以当你在上面调用 next
时,你将得到 StopIteration
.
仅仅传递一个默认值在这里不会有多大用处。考虑一下:
print(next(res.results, None).text)
现在,如果没有结果,next
将 return 您的默认值 None
,您将立即尝试执行 None.text
,这只会提出 AttributeError
.
解决这个问题的一种方法是只处理错误:
try:
print(next(res.results).text)
except StopIteration:
print('No results')
另一种方法是将该复合表达式分解为更简单的表达式,因此您可以使用默认值:
result = next(res.results, None)
print(res.text if res else 'No results')
但是,res
可以像包含 0 个结果一样轻松地包含 2 个或 3 个结果——这就是它 return 是迭代器的全部原因。通常,您会想要所有这些,或者至少需要其中的一些。如果是这种情况,最好的解决方案是使用 for
循环。迭代器的诞生希望它们能在 for
循环中使用,因为它让每个人都更容易:
for result in res.results:
print(result.text)
如果results
为空,这将不执行任何操作,如果只有一个结果,则打印一个结果,如果有多个,则打印所有结果。
如果你担心得到 500 个结果而你只想要几个,你可以停在 3:
for result in itertools.islice(res.results, 3):
print(result.text)
… 或:
for i, result in enumerate(res.results):
print(result.text)
if i > 2: break
所以我正在努力制作一个简单的研究机器人,但我 运行 遇到了问题。我在 python 中遵循有关使用 wolfram alpha 的指南,当我测试它时,有时会出现错误
Traceback (most recent call last):
File "python", line 6, in <module>
StopIteration`.
这是我的代码:
import wolframalpha
import wikipedia
client = wolframalpha.Client('my_id')
q=input('Problem: ')
res = client.query(q)
print(next(res.results).text)
它只发生在一些查询中并且经常有效,但仍然很烦人。我在网上查看但没有找到任何帮助,所以我不知道这是新的还是我的代码有问题。不管怎样,这里是一个 link 对我所做的回复,但它不起作用 here。尝试使用“uranium”我知道其中一个会带来错误,我试过的其他几个也会出错。谢谢!
此错误告诉您查询没有结果。
这一行:
print(next(res.results).text)
… 在迭代器 res.results
上调用 next
,没有默认值:
Retrieve the next item from the iterator by calling its
__next__()
method. If default is given, it is returned if the iterator is exhausted, otherwiseStopIteration
is raised.
如果 res
没有结果显示给您,则 res.results
是一个空迭代器。这意味着它从一开始就用完了,所以当你在上面调用 next
时,你将得到 StopIteration
.
仅仅传递一个默认值在这里不会有多大用处。考虑一下:
print(next(res.results, None).text)
现在,如果没有结果,next
将 return 您的默认值 None
,您将立即尝试执行 None.text
,这只会提出 AttributeError
.
解决这个问题的一种方法是只处理错误:
try:
print(next(res.results).text)
except StopIteration:
print('No results')
另一种方法是将该复合表达式分解为更简单的表达式,因此您可以使用默认值:
result = next(res.results, None)
print(res.text if res else 'No results')
但是,res
可以像包含 0 个结果一样轻松地包含 2 个或 3 个结果——这就是它 return 是迭代器的全部原因。通常,您会想要所有这些,或者至少需要其中的一些。如果是这种情况,最好的解决方案是使用 for
循环。迭代器的诞生希望它们能在 for
循环中使用,因为它让每个人都更容易:
for result in res.results:
print(result.text)
如果results
为空,这将不执行任何操作,如果只有一个结果,则打印一个结果,如果有多个,则打印所有结果。
如果你担心得到 500 个结果而你只想要几个,你可以停在 3:
for result in itertools.islice(res.results, 3):
print(result.text)
… 或:
for i, result in enumerate(res.results):
print(result.text)
if i > 2: break