鉴于此示例Python代码:
for item in items:
if somecondition(item):
requireditem = item
break
# use item
如何知道循环后我是否可以访问requireditem
?即如果somecondition(item)
对于列表中的某个项目True
为requireditem = None
for item in items:
if somecondition(item):
requireditem = item
break
if requireditem != None:
# do something
。
一种解决方案可能是:
{{1}}
但我想知道Pythonic的做法是什么。
答案 0 :(得分:5)
你在循环中做了什么吗?您是否将somevar
设置为True
以外的任何内容?如果没有,也许这会更好:
if any(somecondition(item) for item in items):
# do something
不需要变量。
还有更好的方法:
required_items = [item for item in items if somecondition(item)]
if required_items:
# do something
# if only one required item is ever present, then maybe...
required_item = required_items[0]
答案 1 :(得分:1)
您可以尝试这样的事情(但您的问题与变量范围更相关吗?)
somevar = [item for item in items if somecondition(item)]
if somevar:
do something
if somevar:
do something
答案 2 :(得分:0)
您所指的是“变量范围”。
这是一篇很好的文章,可以为新程序员解释。 http://www.digital-web.com/articles/variable_scope_for_new_programmers/
答案 3 :(得分:0)
如果你真的想知道是否有办法测试局部变量是否存在,你可以通过处理UnboundLocalError
例外来实现:
try:
somevar
except UnboundLocalError:
print "Variable does not exist"
else:
print "Variable exists"
但这当然不被认为是“pythonic”。不要那样做。可以事先将变量设置为None
,也可以使用不同的方法。
一种解决方案是使用Python的for-else
构造:
for item in items:
if somecondition(item):
break
else:
raise NoSuitableItemFound() # If no break occurred.
答案 4 :(得分:0)
对于编辑过的问题,您可以使用
try:
requireditem = next(item for item in items if somecondition(item))
except StopIteration:
# error handling, no item found
else:
# do something with requireditem
这将仅遍历items
,直到找到第一个匹配项,与使用列表推导的解决方案形成对比。
答案 5 :(得分:0)
对于代码的最小更改,只需在循环体中执行您想要执行的任何操作然后突破。你可能应该在第一场比赛中突破(除非你想要总是扫描整个列表并需要 last 项目满足你的条件)。
for item in items:
if somecondition(item):
# do something with item
break
但是,有更好的方法可以做到这一点,具体取决于您想要做什么(其他人已发布此类解决方案)。