一、迭代器
- 什么是迭代器 ?
- 迭代器是一个可以记住遍历的位置的对象。
- 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
- 迭代器有两个基本的方法:iter() 和 next()。
- 字符串,列表或元组对象都可用于创建迭代器:
- 可迭代对象和迭代器对象
- 可迭代对象指内置方法中有__iter__的对象,如列表,元组,字典,集合,字符串,打开的文件对象
- 迭代器对象是有可迭代对象通过调用其__iter__方法(实际上就是(iter(obj))得到的对象,迭代器对象内置方法中有__iter__和__next__方法,其中__next_方法就是执行迭代器对象的下一个值,需要注意的是,当迭代器对象中的值全部取出来之后,里面就没有元素了,再使用___next__会产生异常,所以迭代器对象只能拿取一次
list1 = [1, 2, 3] list_iter = list1.__iter__() print(list_iter.__next__()) print(list_iter.__next__()) print(list_iter.__next__()) print(list_iter.__next__()) """ 1 Traceback (most recent call last): 2 3 File "C:/Users/12104/PycharmProjects/jiangye/练习/11.py", line 6, in <module> print(list_iter.__next__()) StopIteration """
- 迭代器优缺点
优点: - 提供一种统一的、不依赖于索引的迭代方式 - 惰性计算,迭代器可以存放无限大的数据流,只有调用__next__方法才会拿到相关数据,比其他容器对象节省内存 缺点: - 无法获取长度(只有在next完毕才知道到底有几个值) - 一次性的,只能往后走,不能往前退
二、生成器
- 什么是生成器?
在 Python 中,使用了 yield 的函数被称为生成器(generator)。跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行。调用一个生成器函数,返回的是一个迭代器对象。
-
生成器的使用
因为生成器本事就是迭代器,所以它也有__tier__和__next__方法,调用__next__方法可以触发生成器所对应的的函数执行

def func(): print('====>1') yield print('====>2') yield print('====>3') yield g = func() g.__next__() g.__next__() g.__next__() """ ====>1 ====>2 ====>3 """
其实除了next()方法可以触发生成器所对应的的函数执行,yield 可以通过一个send方法为它传值
def func(): while True: res= yield print(res) f = func() f.send(None) # 对于表达式形式的yield,在使用时,第一次必须传None,g.send(None)等同于next(g) f.send('hello') """ hello """
利用send()方法,我们可以编写一个生产者消费者模型(实际上就是协程函数)

import time def comsmer(name): print('%s开始吃包子!' % name) while True: time.sleep(0.2) baozi = yield print("%s开心地吃%s" % (name, baozi)) def produce(): p = comsmer('jiangge') p.__next__() for i in range(5): time.sleep(0.2) p.send("包子%d" % i) produce()
因为生成器是一个返回迭代器的函数,利用这一点,可以利用生成器帮我们保存一些信息

def func(): for i in range(5): yield i f = func() for i in f: print(i) """ 0 1 2 3 4 """
三、三元表达式、列表生成式、生成器表达式
- 三元表达式
python三元表达式格式如下:
条件为真时的结果 if 判段的条件 else 条件为假时的结果
其转化为条件判断语句为:
if 条件的判断为真:
条件为真时的结果
else:
条件为假时的结果
- 列表生成式
列表生成式格式如下:
list=[ i for i in range(n)]
相当于
list = []
for i in range(n):
list.append(i)
- 生成器表达式
生成器表达式格式就是将列表的[]变成()即可,其返回的是一个生成器对象,相对于列表节省许多 空间
list=( i for i in range(n))
来源:https://www.cnblogs.com/liangweijiang/p/11845309.html