py iter,yield与常规运算符重载

iter 迭代器

常用的 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 语句本身的异常问题.

yield

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)
    自己的类有了这个专有方法, 就可以按下标去取值.

运算符重载

py iter,yield与常规运算符重载_第1张图片

你可能感兴趣的:(python)