-
迭代
1. 迭代器: 迭代是访问集合元素的一种方式。 迭代器是一个可以记住遍历的位置的对象 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问结束。 迭代器只能往前不会后退 2. 可迭代对象: 对list,tuple,str等类型的数据使用for...in...的循环语法从其中依次拿到数据进行使用 我们把这样的过程称为遍历,也叫迭代。 3. 判断一个对象是否可以迭代: 可以使用isinstance()判断一个对象是否是可迭代对象 是的话会返回True 不是会返回Flase 4. 可迭代对象的本质: 可迭代对象的本质就是可以向我们提供一个这样的中间“人" 即 迭代器 (lterator)帮助我们对其进行迭代遍历使用。 可迭代对象通过__iter__方法向我们提供的一个迭代器, 然后通过这个迭代器来依次获取对象中的每一个数据 也就是说,一个具有了__iter__方法的对象,就是一个可迭代对象
-
相关函数
1. iter()函数和next()函数: list,tuple等都是可迭代的对象的,可以通过iter()函数获取这些可迭代对象的迭代器 然后可以对获取到的迭代器不断使用next()函数来获取下一条数据 iter()函数实际上就是调用了可迭代对象的__iter__方法 注:迭代完最后一个数据之后,再次调用next()函数会抛出Stoplteration的异常 表示所有数据已经迭代完成,不用再执行next()函数 2.判断一个对象是否是迭代器: 可以使用isinstance()判断一个对象是否是lterator对象 3. 迭代器(lterator): 迭代器是用来帮助我们记录每次迭代访问到的位置, 当我们对迭代器使用next()函数的时候 迭代器会向我们返回它所记录位置的下一个位置的数据。 实际上,在使用next()函数的时候,调用的就是迭代器对象的__next__方法, 所以,想要构造一个迭代器,就要实现它的__next__方法。 但还不够,python要求本身也是可以迭代的,所以还要为迭代器实现__iter__方法, 而__iter__方法要返回一个迭代器,迭代器自身正是一个迭代器。 所以迭代器的__iter__方法返回自身即可。 即:一个实现了__iter__和__next__方法的对象,就是迭代器。 迭代器最核心的功能就是可以通过next()函数的调用来返回下一个数据值 也就是可以通过程序按照一定的规律计算出来的数据代替所有要缓存的数据 即:用保存生成数据的方式代替板寸需要的数据 除了for循环能接收可迭代对象,list,tuple等也能接收
-
for…in…循环的本质:
for item in iterable 循环的本质就是先通过iter()函数获取可迭代对象lterable 的迭代器
然后对获取到的迭代器不断调用next()方法来获取下一个值并将其赋值给item
当遇到Stoplteration 异常后循环结束
4.生成器:
利用迭代器,可以在每次迭代数据是按照特定的规律进行生成。
但是在实现一个迭代器时,关于当前迭代到的状态需要自己记录
进而才能根据当前状态生成下一个数据。
为了达到记录当前状态,并配合next()函数进行迭代使用
可以采用更简便的语法,即生成器(genertor)。生成器是一类特殊的迭代器
1. 创造生成器方法:
1)只要把一个列表生成式的[]改成()
2)只要早def中有yield关键字的,就称为生成器
总结:
1)使用了yiled关键字的函数不再是函数,而是生成器
2)yiled关键字有两点作用:
保存当前运行状态(断点),然后停止执行,即将生成器(函数)挂起
将yiled关键字后面表达式的值作为返回值返回,可以理解为起了return的作用
3)可以使用next()函数让生成器从断点处继续执行,即唤醒生成器(函数)
4)python3中的生成器可以使用return返回最终运行的返回值,
而python2中的生成器不允许使用return返回一个返回值
使用send唤醒:
除了用next()函数来唤醒生成器继续执行外,还可以用send()函数来唤醒执行
使用send()函数的好处是可以在唤醒的同时向断点处传入一个附加数据(重新定位)
协程:又称微线程,纤程。(Coroutine)
协程是python中另外一种实现多任务的方式,比线程更小,占用更小的执行单元
在一个线程中的某个函数,可以在任何地方保存当前函数的一些临时变量等信息,
然后切换到另 外一个函数中执行(不是通过调用函数的方式做到的),
并且切换的次数以及什么时候再切换到原来的函数都有开发者自己决定。
- 简单总结:
1)进程是资源分配的单位
2)线程是操作系统调度的单位,(执行代码)
3)进程切换需要的资源很大,效率很低
4)线程切换需要的资源一般,效率一般
5)协程切换任务需要的资源很小,效率高
6)多进程,多线程根据cpu核数不一样可能是并行的,但是协程实在一个线程中,所以是并发