关于Python的进阶(后续更新)...

Generators

生成器也是迭代器的一种,但是你只能迭代它们一次.原因很简单,因为它们不是全部存在内存里,它们只在要调用的时候在内存里生成:

>>> mygenerator = (x*x for x in range(3))

>>> for i in mygenerator:

...    print(i)

014

生成器和迭代器的区别就是用()代替[],还有你不能用for i in mygenerator第二次调用生成器:首先计算0,然后会在内存里丢掉0去计算1,直到计算完4.

Yield

Yield的用法和关键字return差不多,下面的函数将会返回一个生成器:

>>> def createGenerator():

...    mylist = range(3)

...    for i in mylist:

...        yield i*i

...>>> mygenerator = createGenerator() # 创建生成器

>>> print(mygenerator) # mygenerator is an object!

<generator object createGenerator at 0xb7555c34>

>>> for i in mygenerator:

...     print(i)

014

在这里这个例子好像没什么用,不过当你的函数要返回一个非常大的集合并且你希望只读一次的话,那么它就非常的方便了.

要理解Yield你必须先理解当你调用函数的时候,函数里的代码并没有运行.函数仅仅返回生成器对象,这就是它最微妙的地方:-)

然后呢,每当for语句迭代生成器的时候你的代码才会运转.

现在,到了最难的部分:

当for语句第一次调用函数里返回的生成器对象,函数里的代码就开始运作,直到碰到yield,然后会返回本次循环的第一个返回值.所以下一次调用也将运行一次循环然后返回下一个值,直到没有值可以返回.

一旦函数运行并没有碰到yeild语句就认为生成器已经为空了.原因有可能是循环结束或者没有满足if/else之类的.

枚举

from enum import Enum

Animal = Enum('Animal', 'ant bee cat dog')

或者等价于:

class Animals(Enum):

    ant = 1

    bee = 2

    cat = 3

    dog = 4

关于全局变量

globvar = 0

def set_globvar_to_one():

    global globvar    # 需要用global修饰一下globvar

    globvar = 1

def print_globvar():

    print globvar     # 如果要读globbar的值的话不需要用global修饰

set_globvar_to_one()

print_globvar()       # 输出 1

Super()和__init__()方法

我试着理解super()方法.从表面上看,两个子类实现的功能都一样.我想问它们俩的区别在哪里?

class Base(object):

    def __init__(self):

        print "Base created"

class ChildA(Base):

    def __init__(self):

        Base.__init__(self)

class ChildB(Base):

    def __init__(self):

        super(ChildB, self).__init__()

print ChildA(),ChildB()

 

super()的好处就是可以避免直接使用父类的名字.但是它主要用于多重继承,这里面有很多好玩的东西.如果还不了解的话可以看看官方文档

注意在Python3.0里语法有所改变:你可以用super().__init__()替换super(ChildB, self).__init__().(在我看来非常nice)

 

posted @ 2017-03-12 15:00  SherLock9791  阅读(182)  评论(0)    收藏  举报