python基础-------迭代器,生成器,协程函数

1,迭代器协议:

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

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

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

2,迭代器:

1.1:为什么要用迭代器:

1.2 优点:迭代器提供了一种不依赖索引的取值方式,这样就可以遍历那些没有索引的可迭代对象,如:(字典,集合,文件)

迭代器于列表比较,迭代器属于惰性计算,更省内存。

1.3 缺点:无法获取迭代器的长度,不如列表操作灵活。一次性的取值,只能从前向后取值,不能从后向前取值。

1.4 可迭代的,只要对象本身有__iter__方法,得到的就是迭代器。

1.5 列表list,元组tuple,字典dict,集合set,字符串str,文件file,都是可以迭代的。

1.6 示例:笨方法

d = {"a":1,"b":2,"c":3,}
i = d.__iter__()   #把字典变成一个可迭代的对象,i 就是迭代器
print(i.__next__())
print(i.__next__())
print(i.__next__())

1.7 运行结果:把字典里的k都打印出来了

1.8 用while来遍历字典:

d = {"a":1,"b":2,"c":3,}
i = d.__iter__()
while True:
    print(i.__next__())

1.9 运行结果字典可k全部打印出来了,但是,while是一个死循环,遍历玩字典里的三个k,就抛出了StopIteration异常,我们这样处理就好了

a
Traceback (most recent call last):
b
c
  File "F:/PycharmProjects/py_fullstack_s4/day23/迭代器.py", line 4, in <module>
    print(i.__next__())
StopIteration

2.0  把代码改成这样:

d = {"a":1,"b":2,"c":3,}
i = d.__iter__()
while True:
    try:
        print(i.__next__())
    except StopIteration:
        break

2.1 try ,except 是去除异常的语句,运行结果如下:

a
b
c

2.2 用 for 循环来遍历:

d = {"a":1,"b":2,"c":3,}

for k in d:
    print(k)

2.3 因为for 是非常牛逼的,他自己只接把d转成迭代器了,运行结果就是,a,b,c,

2.4 查看可迭代对象与迭代器对象:

s = "hello world"                                  #字符串 str
l = ["h","e","l","l""o"]                #列表 list
t = ("w","o","r","l","d")                          #元组 tuble
d = {"name":"gaoyuan","job":"IT","age":25}         #字典 dict
set1 = {1,2,3,4,5,}                                #集合 set
f = open("a.txt")                                  #文件 file

#都是可迭代的:都有__iter__方法
# s.__iter__()
# l.__iter__()
# t.__iter__()
# d.__iter__()
# set1.__iter__()
# f.__iter__()
print(isinstance(s,Iterable))
print(isinstance(l,Iterable))
print(isinstance(t,Iterable))
print(isinstance(d,Iterable))
print(isinstance(set1,Iterable))
print(isinstance(f,Iterable))
#返回的结果都是True  

#查看是否是迭代器 ,只有文件有__next__方法,
f.__next__()

print(isinstance(s,Iterator))  #False
print(isinstance(l,Iterator))   #False
print(isinstance(t,Iterator))   #False
print(isinstance(d,Iterator))   #False
print(isinstance(set1,Iterator))#False
print(isinstance(f,Iterator))      #True
#只有文件是迭代器

3,生成器:

3.1 什么是生成器?

可以理解为一种数据类型,这种数据类型自动实现了迭代器协议(其他的数据类型需要调用自己内置的__iter__方法),所以生成器就是可迭代对象

生成器分类及在python中的表现形式:(Python有两种不同的方式提供生成器)

生成器就是一个函数,函数体内含有yield关键字 就是生成器

return跟yield的区别

return返回一次值就彻底结束了,yield能返回多次值

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

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

3.2 为何使用生成器之生成器的优点

3.3 Python使用生成器对延迟操作提供了支持。所谓延迟操作,是指在需要的时候才产生结果,而不是立即产生结果。这也是生成器的主要好处。

3.4 生成器小结:

3.4.1.是可迭代对象

3.4.2.实现了延迟计算,省内存啊

3.4.3.生成器本质和其他的数据类型一样,都是实现了迭代器协议,只不过生成器附加了一个延迟计算省内存的好处,其余的可迭代对象可没有这点好处,记住喽!!!

时间: 2024-08-05 23:40:37

python基础-------迭代器,生成器,协程函数的相关文章

10.迭代器/生成器/协程函数/列表生成器

迭代器为什么要用迭代器?小结:生成器为什么要使用生成器,什么是生成器?如何创建一个生成器举个栗子:斐波拉契数列用yield返回结果的执行流程作业代码以及注释:协程函数面向过程编程作业以及代码注解:典型范例以及代码解析:列表生成式生成器表达式作业和练习 迭代器 为什么要用迭代器? 提供了一种不依赖索引的取值方式,使一些不具有索引属性的对象也能遍历输出 相比列表,迭代器的惰性计算更加节约内存. 但是它无法有针对性地指定取某个值,并且只能向后取值. >>> from collections i

python基础----迭代器、生成器、协程函数

一.什么是迭代器协议 1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前退) 2.可迭代对象:实现了迭代器协议的对象(如何实现:对象内部定义一个__iter__()方法) 3.协议是一种约定,可迭代对象实现了迭代器协议,python的内部工具(如for循环,sum,min,max函数等)使用迭代器协议访问对象. 二,为什么要用迭代器 优点: 1:迭代器提供了一种不依赖于索引的取值方式,

python协程函数、递归、匿名函数与内置函数使用、模块与包

目录: 协程函数(yield生成器用法二) 面向过程编程 递归 匿名函数与内置函数的使用 模块 包 常用标准模块之re(正则表达式) 一.协程函数(yield生成器用法二) 1.生成器的语句形式 a.生成器相关python函数.装饰器.迭代器.生成器,我们是如何使用生成器的.一个生成器能暂停执行并返回一个中间的结果这就是 yield 语句的功能 : 返回一个中间值给调用者并暂停执行. 我们的调用方式为yeild 1的方式,此方式又称为生成器的语句形式. 而使用生成器的场景:使用生成器最好的场景就

【Python】【控制流程】【生成器 | 协程 | 期物 | 任务】对比与联系

Python 的 asyncio 类似于 C++ 的 Boost.Asio. 所谓「异步 IO」,就是你发起一个 IO 操作,却不用等它结束,你可以继续做其他事情,当它结束时,你会得到通知. Asyncio 是并发(concurrency)的一种方式.对 Python 来说,并发还可以通过线程(threading)和多进程(multiprocessing)来实现. Asyncio 并不能带来真正的并行(parallelism).当然,因为 GIL(全局解释器锁)的存在,Python 的多线程也不

Python 协程函数

1.1 协程函数理解 协程函数就是使用了yield表达式形式的生成器 def eater(name): print("%s eat food" %name) while True: food = yield print("done") g = eater("gangdan") print(g) 结果:generator object eater at 0x00000000028DC048这里就证明了g现在就是生成器函数 1. 2 协程函数赋值过程

Python之协程函数

Python之协程函数 什么是协程函数:如果一个函数内部yield的使用方法是表达式形式的话,如x=yield,那么该函数成为协程函数. def eater(name): print('%s start to eat food' %name) food_list=[] while True: food=yield food_list print('%s get %s ,to start eat' %(name,food)) food_list.append(food) print('done')

day05 协程函数,递归函数,匿名函数lambda,内置函数map reduce filter max min zip sorted,匿名函数lambda和内置函数结合使用,面向过程编程与函数编程,模块与包的使用,re模块内置函数

基础篇 本章大纲: 协程函数 递归函数 匿名函数lambda 内置函数map reduce filter  max min zip sorted 匿名函数lambda和内置函数结合使用 面向过程编程与函数编程 模块与包的使用 re模块内置函数 一,协程函数 注意:函数先定义,后使用.这是函数第一原则.函数主要分为定义,调用 1.1,什么是协程函数 协程函数特点:yield变为表达式,可以通过g.send(value)传值,用send传值时协程函数需要初始化,也可以说是生成器函数的一种 1.2,协

Python异步IO之协程(一):从yield from到async的使用

引言:协程(coroutine)是Python中一直较为难理解的知识,但其在多任务协作中体现的效率又极为的突出.众所周知,Python中执行多任务还可以通过多进程或一个进程中的多线程来执行,但两者之中均存在一些缺点.因此,我们引出了协程. Tips 欲看完整代码请见:我的GitHub 为什么需要协程?首先,我们需要知道同步和异步是什么东东,不知道的看详解.简单来说:[同步]:就是发出一个“调用”时,在没有得到结果之前,该“调用”就不返回,“调用者”需要一直等待该“调用”结束,才能进行下一步工作.

函数5—协程函数的有应用

协程函数的应用:找到一个文件夹下所有包含python字符串的文件的绝对路径为生成器函数添加初始化功能的装饰器import os ,timedef init(func): def wrapper(*args,**kwargs): res = func(*args,**kwargs) next(res) return res #返回初始化之后的生成器 return wrapper 下面的每一个函数都是一个生成器函数,可以接收生成器发送的值, 同时也是一个生成器,可以发送下面的函数想要的内容 可以实现

python 高性能编程之协程

用 greenlet 协程处理异步事件 自从 PyCon 2011 协程成为热点话题以来,我一直对此有着浓厚的兴趣.为了异步,我们曾使用多线程编程.然而线程在有着 GIL 的 Python 中带来的性能瓶颈和多线程编程的高出错风险,"协程 + 多进程"的组合渐渐被认为是未来发展的方向.技术容易更新,思维转变却需要一个过渡.我之前在异步事件处理方面已经习惯了回调 + 多线程的思维方式,转换到协程还非常的不适应.这几天我非常艰难地查阅了一些资料并思考,得出了一个可能并不可靠的总结.尽管这个