协程的概念
协程,又称微线程,纤程,也称为用户级线程,在不开辟线程的基础上完成多任务,也就是在单线程的情况下完成多任务,多个任务按照一定顺序交替执行 通俗理解只要在def里面只看到一个yield关键字表示就是协程。
迭代
迭代的概念:使用for循环遍历取值的过程叫做迭代 可迭代对象:使用for循环遍历取值的对象叫做可迭代对象, 比如:列表、元组、字典、集合、range、字符串
判断对象是否是可迭代对象:
from collections import Iterable
result = isinstance ( ( 3 , 5 ) , Iterable)
print ( "元组是否是可迭代对象:" , result)
迭代器
我们创建一个迭代器对象,那么这个对象可以使用for循环进行迭代。 迭代器的创建:一个类只要实现了__iter__与__next__方法这个类创建对象就是迭代器对象。
class MyIter ( object ) :
def __iter__ ( self) :
return self
def __next__ ( self) :
return 1
my_iter = MyIter( )
for temp in my_iter:
print ( temp)
迭代器停止:抛出一个异常,raise StopIteration
class MyIter ( object ) :
def __iter__ ( self) :
return self
def __next__ ( self) :
raise StopIteration
return 1
my_iter = MyIter( )
for temp in my_iter:
print ( temp)
class MyIter ( object ) :
def __init__ ( self) :
self. num = 0
def __iter__ ( self) :
return self
def __next__ ( self) :
self. num += 1
if self. num > 10 :
raise StopIteration
return self. num
my_iter = MyIter( )
for temp in my_iter:
print ( temp)
列表与迭代器的区别: 1.列表循环遍历的时候必须先存数据,这个比较浪费内存 2.迭代器是迭代一次生成一次 3.迭代器最大的一个问题是数据的生成必须有规则
生成器
概念:是一类特殊的迭代器,它不需要再像上面的类一样写__iter__()和__next__()方法了, 使用更加方便,它依然可以使用next函数和for循环取值。 创建生成器第一式:
a = [ i for i in range ( 10 ) ]
for temp in a:
print ( temp)
print ( a)
b = ( i for i in range ( 10 ) )
print ( b)
for temp in b:
print ( temp)
print ( b)
import time
def test ( ) :
for temp in range ( 10 ) :
yield temp
print ( test( ) )
for temp in test( ) :
print ( temp)
使用了yield关键字的函数不再是函数,而是生成器。(使用了yield的函数就是生成器) 代码执行到yield会暂停,然后把结果返回出去,下次启动生成器会在暂停的位置继续往下执行 每次启动生成器都会返回一个值,多次启动可以返回多个值,也就是yield可以返回多个值 return只能返回一次值,代码执行到return语句就停止迭代,抛出停止迭代异常
for循环本质
class MyIter ( object ) :
def __init__ ( self) :
self. num = 0
def __iter__ ( self) :
return self
def __next__ ( self) :
self. num += 1
if self. num > 10 :
raise StopIteration
return self. num
my_iter = MyIter( )
iter = iter ( my_iter)
while True :
try :
print ( next ( iter ) )
except Exception as e:
break
yield
greenlet
gevent
gevent 完美版
理解
CPU效率最优方案:
一个cpu 一个进程 一个进程里面一个线程 一个线程里面多个协程