多任务(协程(collections)

1、迭代:在原来的版本的基础上添加新的东西(功能);可以用for就是表名可以迭代

2、迭代器:比返回列表的方式占用极小的空间,还能执行其同样的结果。迭代器存储的是生成结果的方式,返回列表是生成结果占用很大资源。

代码1:

from collections import Iterable #迭代

from collections import Iterator #迭代器

 

class Classmate(object):

def __init__(self):

self.names = list()

def add(self,names):

self.names.append(names)

def __iter__(self):

"""如果要一个对象称为 可以迭代的对象,即可以使用for,那么必须实现__iter__方法"""

return ClassIterable(self)

 

class ClassIterable(object):

"""如果想要判断一个对象是否是迭代器,对象里面必须要有__iter__与__next__方法"""

 

def __init__(self,obj):

self.obj = obj

self.i = 0

def __iter__(self):

pass

def __next__(self):

if self.i<len(self.obj.names):

name=self.obj.names[self.i]

self.i+=1

return name

else:

raise StopIteration #出栈异常

 

classmate=Classmate()

classmate.add("老王")

classmate.add("老是 ")

classmate.add("老上")

classmate.add("老4")

 

#如果classmate里面有__iter__方法返回Ture是迭代对象

print("判断classmate是否可以迭代:",isinstance(classmate,Iterable))

classmate_iterator=iter(classmate)

#如果classmate_iterator里面有__iter__与__next__方法返回Ture是迭代器

print("判断classmate_iterator是否是迭代器:",isinstance(classmate_iterator,Iterator))

# print(next(classmate_iterator))

for name in classmate:

print(name)

代码2(代码1的改进):

from collections import Iterable #迭代

from collections import Iterator #迭代器

 

class Classmate(object):

def __init__(self):

self.i=0

self.names = list()

def add(self,names):

self.names.append(names)

def __iter__(self):

"""如果要一个对象称为 可以迭代的对象,即可以使用for,那么必须实现__iter__方法"""

return self

def __next__(self):

if self.i<len(self.names):

name=self.names[self.i]

self.i+=1

return name

else:

raise StopIteration #出栈异常

 

classmate=Classmate()

classmate.add("老王")

classmate.add("老是 ")

classmate.add("老上")

classmate.add("老4")

 

#如果classmate里面有__iter__方法返回Ture是迭代对象

# print("判断classmate是否是迭代的对象:",isinstance(classmate,Iterable))

# classmate_iterator=iter(classmate)

##如果classmate_iterator里面有__iter__与__next__方法返回Ture是迭代器

# print("判断classmate_iterator是否是迭代器:",isinstance(classmate_iterator,Iterator))

# print(next(classmate_iterator))

for name in classmate:

print(name)

 

总结代码1与代码2:如果一个对象是迭代对象但是他不是迭代器,如果一个对象是迭代器那么它一定是迭代对象

3.面试题:在python2.7中range(10)与Xrange(10)的区别:

如果用Xrange(10)占用极小的空间,他里面存的不是数据的结果而是生成这个结果的方式

range(10)是生成这个数据的结果,占用极大的空间

(xrange()好比生产馒头的机器,range()就是馒头本身)

4.生成器:是一种特殊的迭代器,只要函数里面有yield那么这个函数就不叫函数,叫生成器;

(1)生成器的创建

(2)send的用法(send与next功能相似,send可以往函数传值)

总结:

  • 保证函数执行一部分遇到yield先暂停执行,可以接收返回的数据保留,然后在保留的数据的基础上继续执行;
  • 换成return的区别:函数剩余部分的代码不能继续执行;

(3)、使用yield完成假的多任务(耗费资源最少)

(4)、greenlet为了使用协程完成多任务,python中的greenlet模块对其封装,从而使得切换任务变得更加简单(了解)注:遇到延时会等待,并不会切换任务。

(5)、gevent(实现多任务)可以解决遇到延时等待,切换其他任务

注:协程真正用到的是这个

代码1:

代码3:替换(.join())(最终代码)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值