20161219py笔记:属性/迭代器/生成器
1、属性的由来
>>>为什么需要属性?请看一段代码:
class Rectangle:
def __init__(self):
self.width=0
self.height=0
def setSize(self,size):
self.width,self.height=size
def getSize(self):
return self.width,self.height
这段代码中,我们把setSize、getSize称为访问器,只有通过访问器才能访问(width,height)这对元组。
如果访问器很多,用起来就很麻烦。现在有个方法,能把这些访问器打包处理,让我们只调用1个就可以。这个方法叫做属性。
2、属性的分类
>>>property函数
class Rectangle(object):
def __init__(self):
self.width=0
self.height=0
def setSize(self,size):
self.width,self.height=size
def getSize(self):
return self.width,self.height
size=property(getSize,setSize)#注意,这是位置参数,里面的参数位置是非常重要的
>>>r=Rectangle
>>>r.width=5
>>>r.height=10
>>>r.size#如果没有property函数,这里需要r.getSize()才能调用
(5,10)
>>>r.size=100.200#如果没有property函数,这里需要r.setSize()才能调用
>>>r.width
100
3、迭代器就是具有next的方法
实现方法:
class Fibs:
def __init__(self):
self.a=0
self.b=1
def next(self):
self.a,self.b=self.b,self.a+self.b
return self.a
def __iter__(self):#这就创建了一个迭代器
return self
4、生成器
定义:任何包含yield的函数称为生成器
构成:生成器是由两部分构成的,生成器的函数和生成器的迭代器。生成器的函数是由def定义的,包含yield部分;生成器的迭代器是这个函数的返回部分。生成器被调用的时候,不会被执行,而是返回一个迭代器。每请求生成一个值,就会执行生成器中的代码。
用途
>>>可将嵌套list里的元素都剥离到一个list中。
nested=[[1,2],[3,4],[5]]
def flatten(nested):
for i in nested:
for e in i:
yield e
循环生成器
(i*2 for i in range(10))
跟列表推导式使用方法类似,区别在于使用(),生成的可迭代的
递归生成器
>>>当嵌套列表只有2层时,可用用途中的2个for进行遍历,但是当嵌套列表有n层时,就需要用递归。递归在这种方式下非常简洁:
def flatten(nested):
try:
for sublist in nested:
for element in flatten(sublist):#递归函数,体会一下,这样子让无论是多少层都可以遍历
yield element
except TypeError:#如果是单层列表,就会引发TypeError,这样子就可以直接遍历
yield nested
#这个式子本来是没问题的,但是当nested是字符串时,就会引发陷入死循环。所以需要在这段代码里加一个检测nested是否是string的方法。
检测字符串
需检测的内容+'',若无TypeError,说明是字符串
生成器的方法
生成器的send方法不能直接用,需要将生成器先挂起,即用next执行一下,见下面的代码:
def repeater():
while True:
new=(yield value)
if new is not None:
new=value
>>>r=repeater(42)
>>>r.next()
>>>r.send('dasf')