迭代器:for循环实际是对容器使用iter(),iter()实际会调用该对象的__iter__()方法,返回一个定义了__next__()方法的迭代器对象,
该迭代器可以逐一访问容器中的元素,使用next()内置函数调用该对象的__next__()方法,next()越界触发StopIteration异常提示for循环结束
class CustomIter:
#自定义对传入可迭代对象进行逆序输出
def __init__(self, data):
self.data = data
self.index = len(data)
def __iter__(self):
return self
def __next__(self):
if not self.index:
raise StopIteration
self.index = self.index - 1
return self.data[self.index]
if __name__ == '__main__':
customIter1 = CustomIter('123456789')
for info in customIter1:
print(info, end='')
生成器:是一个用于创建迭代器的简单而强大的工具。 它们的写法类似于标准的函数,但当它们要返回数据时会使用 yield 语句。
每次在生成器上调用 next() 时,它会从上次离开的位置恢复执行(它会记住上次执行语句时的所有数据值)
可以用生成器来完成的任何功能同样可以通用前一节所描述的基于类的迭代器来完成。 但生成器的写法更为紧凑,因为它会自动创建 __iter__() 和 __next__() 方法。
另一个关键特性在于局部变量和执行状态会在每次调用之间自动保存。 这使得该函数相比使用 self.index 和 self.data 这种实例变量的方式更易编写且更为清晰
def costomeZip(list1, list2):
length = len(list1) if len(list2) >= len(list1) else len(list2)
for index in range(length):
yield [list1[index], list2[index]]
if __name__ == '__main__':
res = []
for info in costomeZip([1, 2, 3], [4, 5, 6, 7]):
res.append(info)
print(res)
生成器表达:某些简单的生成器可以写成简洁的表达式代码,所用语法类似列表推导式,但外层为圆括号而非方括号。 这种表达式被设计用于生成器将立即被外层
函数所使用的情况。 生成器表达式相比完整的生成器更紧凑但较不灵活,相比等效的列表推导式则更为节省内存