Next 函数
从迭代器中取出 下一个元素。
next() 只适用于“迭代器”,包括:
- iter(list/tuple/dict/set/str)
- 生成器(generator)
- 文件对象
- 自定义迭代器类
next(iterator)
next(iterator, default)
- 如果没有 default 参数,迭代结束会抛出 StopIteration
- 如果给了 default,迭代结束会返回该默认值
it = iter([10, 20, 30])
print(next(it)) # 10
print(next(it)) # 20
print(next(it)) # 30
# next(it) # StopIteration
it = iter([1, 2])
print(next(it, "结束")) # 1
print(next(it, "结束")) # 2
print(next(it, "结束")) # 结束
def gen():
yield "A"
yield "B"
g = gen()
print(next(g)) # A
print(next(g)) # B
with open("test.txt") as f:
print(next(f))
读取文件直到为空行:
for line in iter(lambda: input().strip(), ""):
print("你输入了:", line)
这是 Python 内部使用 next() 驱动循环的经典模式。
it = iter([1, 2, 3])
for x in it:
print(x)
else:
print("循环正常结束,无 break")
实际上 for 背后就是不停 next(it)。
it = iter([1, 2, 3])
first = next(it)
print(first) # 1
# 重新组合迭代器
it = iter([first] + list(it))
print(list(it)) # [1,2,3]
next -> 从迭代器取下一个值;默认值 -> 不报错;for 循环底层靠它。
result = next((data for data in data_list if data['code'] == code), None) 是什么意思?
下面我把这行代码 逐层拆解、清晰解释,你马上就能完全看懂。
result = next((data for data in data_list if data['code'] == code), None)
在 data_list 列表里查找第一个 code 匹配的元素,如果没有找到就返回 None。
(data for data in data_list if data['code'] == code)
这会创建一个“惰性生成器”:
- 遍历 data_list
- 找出满足
data['code'] == code的项目 - 每找到一个立即 yield
类似于:
for data in data_list:
if data["code"] == code:
yield data
next(generator, None)
next(generator) 会从生成器里取 第一个满足条件的元素。
如果没有任何满足条件的,就会:
- 因为给了第二参数 None
- 所以 不会抛 StopIteration,而是返回 None
你可以完全理解成:
result = None
for data in data_list:
if data['code'] == code:
result = data
break
在一堆字典组成的列表里查找某个对象:
user = next((u for u in users if u['id'] == uid), None)
这种写法:
- 精简
- 快速
- 优雅
- 不会报错(因为带了 default=None)
- 这是一个查找 “第一个匹配项” 的快捷写法
- 生成器表达式负责过滤
next(…, None)负责安全地取一个结果