python笔记(六)迭送器和生成器

一、迭送器

1.1可迭代协议(iteradle)

可迭代协议可以被迭代要满足的要求就叫做可迭代协议

可迭代协议的定义:内部实现了__iter__方法可以实现_iter_的内置方法的都是可迭代对象

可以被for循环的对象都是可迭代的对象

迭代是一个重复的过程每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的初始值

1.2迭代器(iterator)

迭代器遵循迭代器协议:必须拥有__iter__方法和__next__方法

优点:   - 提供一种统一的、不依赖于索引的迭代方式   - 惰性计算,节省内存

缺点:   - 无法获取长度(只有在next完毕才知道到底有几个值)   - 一次性的,只能往后走,不能往前退,执行到最后一个元素后,会报错

 

二、生成器(Generator)

生成器定义

1.生成器函数:常规函数定义,使用yield语句而不是return语句返回结果。yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次重它离开的地方继续执行

2.生成器表达式:类似于列表推导,但是,生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表

3.本质:生成器的本质为迭代器(所以自带了__iter__方法和__next__方法,不需要我们去实现)   

4.特点:惰性运算,开发者自定义

生成器的优点

1.延迟计算,一次返回一个结果。也就是说,它不会一次生成所有的结果,这对于大数据量处理,将会非常有用

2.提高代码可读性

生成器表达式

1 g=('%s' %i for i in range(10))
2 for i in g:
3     print(i)

yield from

 1 def gen1():
 2     for c in 'AB':
 3         yield c
 4     for i in range(3):
 5         yield i
 6 
 7 print(list(gen1()))
 8 
 9 def gen2():
10     yield from 'AB'
11     yield from range(3)
12 
13 print(list(gen2()))
14 # 两个函数执行的结果是一样的

send

 1 def generator():
 2     print(123)
 3     content = yield 1
 4     print('=======',content)
 5     print(456)
 6     yield 2
 7 
 8 g = generator()
 9 ret = g.__next__()
10 print('***',ret)
11 ret = g.send('hello')   #send的效果和next一样
12 print('***',ret)
13 
14 #send 获取下一个值的效果和next基本一致
15 #只是在获取下一个值的时候,给上一yield的位置传递一个数据
16 #使用send的注意事项
17     # 第一次使用生成器的时候 是用next获取下一个值
18     # 最后一个yield不能接受外部的值

 

三、推导式

1 #列表推导式
2 g=[i for i in range(10)]
3 print(g)
4 #与生成器表达式的区别为:生成器用(),列表用[]

遍历之后挨个处理:[每一个元素或者是和元素相关的操作 for 元素 in 可迭代数据类型]
筛选功能:[满足条件的元素相关的操作 for 元素 in 可迭代数据类型 if 元素相关的条件]

例子:所有能被3整除的数

1 ret = [i for i in range(30) if i%3 == 0]  #完整的列表推导式
2 print(ret)

 

posted @ 2018-08-06 15:48  要死醉生梦死  阅读(575)  评论(0编辑  收藏  举报
# 一段js特效的代码 # 使用方法:粘贴到页脚代码