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

xiaoxiao2021-02-28  108

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

运算符重载

转载请注明原文地址: https://www.6miu.com/read-43190.html

最新回复(0)