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')

 

posted @ 2016-12-19 21:36  饶慕洵  阅读(150)  评论(0编辑  收藏  举报