Python中判断generator生成器是否为空的最佳方法
Python生成器判断是否包含元素的实现方法
生成器属于一次性迭代器,没有预计算的长度,所以无法直接使用len()获取长度,针对不同使用场景有两种常见实现方案:
场景1:仅判断是否存在元素,不需要后续使用生成器内容
你当前的代码就属于这个场景,直接使用内置函数any()即可,any()会迭代生成器直到找到第一个真值就停止返回,不会遍历全部内容,性能最优。
修改后的代码如下:
name = 'john' while True: n = (x for x in names if x['name'] == name) # 生成器 if any(n): # 替换原有len判断,逻辑完全匹配需求 break name = input('Enter name > ')
场景2:判断非空后还需要继续使用生成器的所有元素
如果后续还要遍历生成器的内容,需要把判断时取出的第一个元素和剩余元素拼接,避免元素丢失,可以封装为工具函数使用:
import itertools def check_generator_nonempty(g): try: first_element = next(g) except StopIteration: # 生成器为空 return False, g # 把第一个元素和剩余生成器内容拼接,返回完整的迭代器 return True, itertools.chain([first_element], g) # 调用示例 name = 'john' while True: n = (x for x in names if x['name'] == name) has_element, n = check_generator_nonempty(n) if has_element: # 这里可以正常遍历n,不会丢失第一个匹配的元素 for item in n: print(item) break name = input('Enter name > ')
注意:不要直接将生成器转为列表再用
len()判断,当匹配的元素数量很大时会占用大量内存,性能远低于上面两种方案。
内容的提问来源于stack exchange,提问作者mark12345
相关产品推荐
相关产品推荐

