迭代器:对象需要提供next()方法,它要么返回下一个对象,要么引起一个stopiteration异常
*如果对象是迭代器对象,必须使用next()方法
迭代器是访问集合(列表,元组,字典,能大量存储大量数据)内元素的一种方式。
迭代器对象从集合的第一个元素开始访问,直到所有元素都被访问一遍。
for max min sum等使用迭代器协议访问对象
迭代器的好处:以一种延迟计算(lazyevaluation)方式返回元素。
它并不是一次性调用所用数据,而是等调用next()方法才返回该元素。
生成器:Python使用生成器对延迟操作提供了支持。
优点:在需要的时候产生结果,而不是立即产生结果。不占内存,代码简洁。
Python两种不同的方式提供生成器:
1、生成器函数:常规函数定义,使用 yield 语句而不是return语句返回一个结果。在每个结果中间,挂起函数的状态,
以便下次重离开的地方继续执行结果。yield语句一次。
2、生成器表达式:类似于 推导,但是生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表。
def testlist():
for i in range(10000):
yield i
m=testlist()
for j in m:
print(j) #生成器中的元素
print(m) #输出的是生成器产生的对象地址。
def asd(N):
res=[]
for i in range(N):
res.append(i*i)
return res
for as in asd(10000000):
print (as)
def asd(N):
for i in range(N):
yield i*i
for as in asd(10000000):#这个就相当于调用了next方法
print(as)
a=(x**2 for x in range(5))
print(a)
得到生成器的第一种方式:将列表中的中括号替换成圆括号,就是一个生成器表达式,里面可以写推导。
生成器只要调用next()方法即可得到下一个值,到最后一个异常(stopiteration)退出
例:test=(x for x in rang(10))
next(test)或test.__next__()
第二种:在方法内使用yield做生成器,这样调用此方法,会得出一个结果:generator object。 然后也是可以调用next()。每到yield时,就会停止,返回当前这个值,可以一次次next()调用,看看运行过程
生成器:
1.语法上和函数类似:生成器函数和常规函数几乎是一样的。它们都是使用def语句进行定义,差别在于,生成器使用yield语句返回一个值,而常规函数使用return语句返回一个值。
2.自动实现迭代器协议:对于生成器,Python会自动实现迭代器协议以便应用到迭代背景中的(如for循环 sum函数)。由于生成器实现了迭代器协议,所以,我们调用它的next方法,并且,在没有值可以返回的时候,生成器自动产生stopiteration异常。
3.状态挂起:生成器使用yield语句返回一个值。yield语挂起该生成器函数的状态,保留足够的信息,以便之后从它离开的地方继续执行。
4.生成器只能遍历一次。
多态:
类属性:属于类的属性,在对象外面开辟空间,所有对象共有的
类方法:在方法上添加@classmethod 方法(cls) 类名.方法()或对象.方法()
例如:
@classmethod
def asd(cls)
可以通过类方法调用类属性,也可以通过对象调用类属性
静态方法:方法前加@staticmethod,方法() 类名.方法()或对象.方法()
静态方法没有参数,静态方法即和类没关系,也和对象没关系,也可以通过类和对象调用。
def __new__(cls):构造方法,生成新对象,在__init__()之前调用。单例:只有一个类,只能有一个对象