python生成器、迭代器、动态新增属性及方法是什么
生成器:
生成器是一种特殊的迭代器,通过yield关键字来实现迭代的过程。生成器能够在迭代的过程中保存状态,并且只在需要时才生成值,从而节省内存空间。生成器的特点包括:节省空间、惰性计算和支持迭代协议。生成器可以使用for循环来进行迭代,也可以使用next()函数来获取下一个值。
生成器的工作原理是通过yield关键字将一个函数的功能分割成多个部分,每次调用生成器函数时,程序会执行到yield语句处,然后将yield后面的表达式作为生成器的值返回,并且保存当前函数的状态。下一次调用生成器时,程序会从上一次yield语句的下一行开始执行,直到遇到下一个yield语句或函数结束。
def fibonacci(): a, b = 0, 1 while True: yield a a, b = b, a + b fib = fibonacci() print(next(fib)) # 输出:0 print(next(fib)) # 输出:1 print(next(fib)) # 输出:1
迭代器:
迭代器是遍历容器对象的一种方式,它实现了迭代协议,即提供了__iter__和__next__方法。通过调用迭代器的__next__方法来逐个获取容器中的值,当容器中没有更多的值可供迭代时,迭代器会抛出StopIteration异常。
迭代器具有惰性计算的特性,它只在需要的时候才计算下一个值,从而节省内存空间。迭代器常见的应用场景包括:遍历文件内容、处理大型数据集、生成斐波那契数列等。
class MyIterator: def __init__(self, limit): self.limit = limit self.count = 0 def __iter__(self): return self def __next__(self): if self.count < self.limit: self.count += 1 return self.count else: raise StopIteration it = MyIterator(5) for i in it: print(i) # 输出:1 2 3 4 5
动态新增属性及方法:
在Python中,可以在运行时动态地为对象添加属性和方法。这种动态新增属性和方法的能力是由Python的动态特性所支持的。
要动态地为对象添加属性,可以直接给对象赋值,或者使用setattr函数。要动态地为对象添加方法,可以通过types.MethodType来创建一个方法对象,然后将其赋值给对象的属性。
class Person: pass p = Person() p.name = 'Alice' setattr(p, 'age', 25) def say_hello(self): print('Hello!') import types p.say_hello = types.MethodType(say_hello, p) print(p.name) # 输出:Alice print(p.age) # 输出:25 p.say_hello() # 输出:Hello!
总结:
生成器是一种特殊的迭代器,它通过yield关键字实现迭代过程的分段执行和状态保存。生成器能够节省内存空间,并且支持迭代协议,可以使用for循环或者next()函数来进行迭代。
迭代器是一种遍历容器对象的方式,实现了迭代协议。迭代器具有惰性计算的特性,只在需要时才计算下一个值,从而节省内存空间。常见的应用场景包括遍历文件内容和处理大型数据集。
在Python中,可以动态地为对象添加属性和方法。可以直接给对象赋值或者使用setattr函数来动态添加属性。对于方法的动态添加,可以通过types.MethodType来创建一个方法对象,并将其赋值给对象的属性。