我发现我之前还是没有理解迭代器。
最初的理解
定义的函数中有 yield
就是一个迭代器。
def one_iter():
for i in range(10):
yield i
yield 只是暂时将进程挂起
yield 只是暂时将进程挂起,再次执行时会从第一次挂起的地方继续往下执行,而 return 是完全中断了函数。这是 yield 和 return 不同的地方。
def one_iter():
for i in range(3):
yield i
print(i)
for i in one_iter():
pass
# continue
输出:
// 0
// 1
// 2
如果打上断点观察,会发现更加明显。
每次从迭代器中迭代元素都会指针移动
迭代器和读取文件一样,内部应该维护着一个指针,每迭代一次,指针就会指向下一个元素,指针指向最后一个元素后,整个迭代就会结束。
文件迭代
def iterable():
with open(fileName, encoding="utf8") as f:
for i in f.read():
print(i)
print("+++++++++++++++++++++++++++")
for i in f.read():
print(i)
for 和 next 连用
for 其实和 next 一样,每次迭代都会让指针移动
def study_next():
a = iter(range(3))
next(a)
for i in a:
print(f"for: {i}")
for 循环
def dropwhile(predicate, iterable):
# dropwhile(lambda x: x<5, [1,4,6,4,1]) --> 6 4 1
iterable = iter(iterable)
for x in iterable:
if not predicate(x):
yield x
break
for x in iterable:
yield x
网友评论