name是元组列表,它是len(1)并包含字符串
当我使用时:
if word in (name[0] for name in t):
return name[0]
return None
然后我得到无(搜索失败)
但如果我使用相同的单词值和相同的列表:
gen=(name[0] for name in t)
for i in gen:
if word in i:
return i
return None
搜索成功,我得到了所需的结果。为什么会出现这种不同的行为?
答案 0 :(得分:1)
在if word in (name[0] for name in t)
中,您实际上是在搜索确切的字符串而不是子字符串,即生成器是否包含该字符。
将其更改为使用any()
:
if any(word in name[0] for name in t):
<强>演示:强>
>>> t = [('foo',), ('bar',)]
>>> any('oo' in name[0] for name in t)
True
>>> 'oo' in (name[0] for name in t)
False
>>> 'foo' in (name[0] for name in t)
True
注意,如果你想返回匹配的项目,那么最好使用你的第二个代码(只需删除不必要的genexpr,直接遍历t
),如果你只想检查是否存在子串然后使用any()
。以下是使用enumerate
和next
并将生成器表达式用于学习目的的示例:
>>> item = next((name[0] for name in t if 'oo' in name[0]), None)
>>> if item is not None:
print item
...
foo
答案 1 :(得分:0)
一个问题是,在第一个示例中,name
不在return name[0]
范围内。
如果代码返回None
而不是抛出异常,那么您有另一个(全局?)变量名为name
。