迭代器:
是访问集合元素的一种方式。
迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
字符串,列表或元组对象都可用于创建迭代器。
1:迭代器协议:对象需要提供next()方法,它要么返回下一个对象,要么引起一个Stoplteration异常,以终止迭代。
2:可迭代对象:实现next()方法的对象。
3:协议是一种约定,可迭代对象实现迭代器协议,Python的内置工具(如for循环,sum,min,max函数等)使用迭代器协议访问对象。
例:def test():
for i in range(10):
print('--------')
yield i #到这里之后得到一个生成器对象,把当前生成器对象挂起,等下次循环在往下走。
print(i)
print('*********')
m=test()
m.__next__()
m.__next__()
m.__next__()
结果:
--------
0
*********
--------
1
*********
--------
生成器:
1:语法上和函数类似:生成器函数和常规函数几乎是一样的。它们都是使用def语句进行定义,差别在于,生成器使用yield语句返回一个值,而常规函数使用return语句返回一个值。
2:自动实现迭代器协议:对于生成器,Python会自动实现迭代器协议,以便应用到迭代背景中(如for循环,sum函数)。由于生成器自动实现了迭代器协议,所以,我们可以调用它的next方法,并且,在没有值可以返回的时候,生成器自动产生StopIteration异常。
3:状态挂起:生成器使用yield语句返回一个值。yield语句挂起该生成器函数的状态,保留足够的信息,以便之后从它离开的地方继续执行。
例子:使用生成器返回自然数的平方(注意返回的是多个值):
def diedai(N):
for i in range(N):
yield i*i
for item in diedai(100):
print(item)
使用普通函数:
def diedai(N):
res=[]
for i in range(N):
res.append(i*i)
return res
for item in diedai(100):
print(item)
可以看到,使用生成器函数代码量更少,内存占量更少。
得到生成器:
第一种方式:将列表[]改为(),里面可以写推导。
例:test=(x for x in range(10))
next(test)或test.__next__()
第二种方式:用yield做生成器,得到一个结果,然后也是调用next()
用生成器实现裴波那切序列:
def getfei():
a,b=0,1
print(b)
for i in range(10):
a,b=b,a+b
yield b
a=getfei()
for i in a:
print(i)
多态:
类属性:属于类的成员,在对象外面开辟空间,属于对象共有的。
类方法:在方法上添加@classmethod。
类名.方法()或对象.方法()
@classmethod
def cmethod(cls):
print('这是一个类方法...')
可以通过类方法调用类属性,也可以通过对象调用类属性。
静态方法:在方法上加@staticmethod。
类名.方法()或对象.方法()
@staticmethod
def smethod():
print('这是一个静态方法...')
静态方法没有参数,既和类没关系,也和对象没关系,也可以通过类和对象调用。
def __new__(cls):#用来创建对象,而且必须有返回值。在__init__()之前调用。
return object.__new__(cls)
可以用id(cls)看地址。
当有属性时,需要在__new__()中也添加属性。
单例:
class SingleSimple():
instance=None
def __new__(cls, *args, **kwargs):
if cls.instance==None:
cls.instance=object.__new__(cls)
return cls.instance
def __init__(self,name):
print('正在初始化对象...')
self.name=name
s=SingleSimple('abc')
m=SingleSimple('bcd')
print(s.name)
print(m.name)
结果:
正在初始化对象...
正在初始化对象...
bcd
bcd
是访问集合元素的一种方式。
迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
字符串,列表或元组对象都可用于创建迭代器。
1:迭代器协议:对象需要提供next()方法,它要么返回下一个对象,要么引起一个Stoplteration异常,以终止迭代。
2:可迭代对象:实现next()方法的对象。
3:协议是一种约定,可迭代对象实现迭代器协议,Python的内置工具(如for循环,sum,min,max函数等)使用迭代器协议访问对象。
例:def test():
for i in range(10):
print('--------')
yield i #到这里之后得到一个生成器对象,把当前生成器对象挂起,等下次循环在往下走。
print(i)
print('*********')
m=test()
m.__next__()
m.__next__()
m.__next__()
结果:
--------
0
*********
--------
1
*********
--------
生成器:
1:语法上和函数类似:生成器函数和常规函数几乎是一样的。它们都是使用def语句进行定义,差别在于,生成器使用yield语句返回一个值,而常规函数使用return语句返回一个值。
2:自动实现迭代器协议:对于生成器,Python会自动实现迭代器协议,以便应用到迭代背景中(如for循环,sum函数)。由于生成器自动实现了迭代器协议,所以,我们可以调用它的next方法,并且,在没有值可以返回的时候,生成器自动产生StopIteration异常。
3:状态挂起:生成器使用yield语句返回一个值。yield语句挂起该生成器函数的状态,保留足够的信息,以便之后从它离开的地方继续执行。
例子:使用生成器返回自然数的平方(注意返回的是多个值):
def diedai(N):
for i in range(N):
yield i*i
for item in diedai(100):
print(item)
使用普通函数:
def diedai(N):
res=[]
for i in range(N):
res.append(i*i)
return res
for item in diedai(100):
print(item)
可以看到,使用生成器函数代码量更少,内存占量更少。
得到生成器:
第一种方式:将列表[]改为(),里面可以写推导。
例:test=(x for x in range(10))
next(test)或test.__next__()
第二种方式:用yield做生成器,得到一个结果,然后也是调用next()
用生成器实现裴波那切序列:
def getfei():
a,b=0,1
print(b)
for i in range(10):
a,b=b,a+b
yield b
a=getfei()
for i in a:
print(i)
多态:
类属性:属于类的成员,在对象外面开辟空间,属于对象共有的。
类方法:在方法上添加@classmethod。
类名.方法()或对象.方法()
@classmethod
def cmethod(cls):
print('这是一个类方法...')
可以通过类方法调用类属性,也可以通过对象调用类属性。
静态方法:在方法上加@staticmethod。
类名.方法()或对象.方法()
@staticmethod
def smethod():
print('这是一个静态方法...')
静态方法没有参数,既和类没关系,也和对象没关系,也可以通过类和对象调用。
def __new__(cls):#用来创建对象,而且必须有返回值。在__init__()之前调用。
return object.__new__(cls)
可以用id(cls)看地址。
当有属性时,需要在__new__()中也添加属性。
单例:
class SingleSimple():
instance=None
def __new__(cls, *args, **kwargs):
if cls.instance==None:
cls.instance=object.__new__(cls)
return cls.instance
def __init__(self,name):
print('正在初始化对象...')
self.name=name
s=SingleSimple('abc')
m=SingleSimple('bcd')
print(s.name)
print(m.name)
结果:
正在初始化对象...
正在初始化对象...
bcd
bcd