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())(最终代码)