常用的 for-in 循环形如:
for element in iterable:
# do something with element
for循环的内部实现是这个样子的:
# create an iterator object from that iterable
iter_obj = iter(iterable)
# infinite loop
while True:
try:
# get the next item
element = next(iter_obj)
# do something with element
except StopIteration:
# if StopIteration is raised, break from loop
break
弄懂了这个底层原理后有助于解决 for x in my_set
这种 for 语句本身的异常问题.
def fibonacci(max):
n, current, next_one = 0, 1, 1
while n < max:
yield current
tmp=current
current=next_one
next_one=current+tmp
n += 1
for x in fibonacci(4):
print(x)
print('###')
it=iter(fibonacci(4))
while True:
try:
print(next(it))
except StopIteration:
pass
"""
1
1
2
3
###
1
1
2
3
"""
带有 yield 的函数不再是一个普通函数,Python 解释器会将其视为一个 generator,调用 fibonacci(5) 不会执行 fibonacci函数,而是返回一个 iterable 对象!在 for 循环执行时,每次循环都会执行 fibonacci函数内部的代码,执行到 yield b 时,fibonacci函数就返回一个迭代值,下次迭代时,代码从 yield b 的下一条语句继续执行,而函数的本地变量看起来和上次中断执行前是完全一样的,于是函数继续执行,直到再次遇到 yield。
__setitem__(self, *args, **kwargs)
me[1]='hi'
.__getitem__(self, y)