python学习【第五篇】python迭代器与生成器

一、什么是迭代器

1.迭代器协议:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代(只能往后走不能往前退)

2.可迭代对象:实现了迭代器协议的对象(如何实现:对象内部定义一个__iter__()方法)

3.协议是一种约定,可迭代对象实现了迭代器协议,python的内部工具(如:for循环,sum,min,max函数等)使用迭代器协议访问对象

二、for循环的本质

for循环的本质:循环所有对象,全都是使用迭代器协议

字符串、列表、元祖、字典、集合、文件对象这些都不是可迭代对象(没有遵循迭代器协议,没有next方法),只不过在for循环时调用了内部的__iter__转换成了可迭代对象而已

li = [1, 2, 3]

aa = li.__iter__()  # 将列表转换为可迭代对象

print(aa)

print(aa.__next__())  # 调用next方法
print(aa.__next__())
print(aa.__next__())

  

注:

  for其实做了三件事:

    1.将列表转换为可迭代对象

    2.调用了__next__()方法

    3.将StopIteration异常处理了

扫描二维码关注公众号,回复: 113268 查看本文章

三、生成器

可以理解为一种数据类型,这种数据类型自动实现了迭代器协议,所以生成器就是可迭代对象

生成器的创建方式:

  • 生成器函数:常规函数定义,但是使用yield语句而不是return语句返回结果;yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次从它离开的地方继续执行
  • 生成器表达式:类似于列表推导,但是生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表

生成器函数

def fun():
    print("hhloo")
    yield 1
    print("44444")
    yield 2
    print('dddddd')
    yield 3

g = fun()  # 生成器对象
print(g)   # 结果:<generator object fun at 0x00000000010373B8>

# 进行一次打印
print(g.__next__())  # 第一次next时调用函数到yield 1处函数返回,结果为hhloo,1
print(g.__next__())  # 第二次会从上一次离开的地方继续往下执行,结果:44444,2
print(g.__next__())  # 第三次执行   结果为:dddddd,3
print(g.__next__())  # 会抛StopIteration异常

  

生成器表达式

ccc = ('鸡蛋%s' % i for i in range(10))
print(ccc)   # <generator object <genexpr> at 0x0000000000A273B8>
print(ccc.__next__())

  

注:

  生成器表达式比生成器函数更加的节省内存

生成器注意项

  • 生成器在产生的过程中不做任何操作
  • 生成器只能遍历一次
def fun1():
    for i in range(4):
        yield i

t = fun1()

t1 = (i for i in t)
t2 = (i for i in t1)


print(list(t1))  # [0, 1, 2, 3]
print(list(t2))  # []

  

生成器的优点

  • 生成器的好处就是延迟计算,一次返回一个结果,它不会一次生成所有的结果。对于大数据处理,将会非常有用
  • 生成器还能有效的提供代码的可读性,使用生成器会使python代码更加的pythonic

猜你喜欢

转载自www.cnblogs.com/fengyuhao/p/8995164.html