python3基础---生成器

2017-09-22  本文已影响0人  HopCoder
def createNum():
    print('-----start----')
    a,b = 0,1
    for i in range(5):
        print('----- 1 ----')
        yield b
        print('----- 2 ----')
        a,b = b,a+b
        print('----- 3 ----')
    print('------stop------')

调用结果

  1. createNum() #没有任何打印

  2. a = createNum() # a此时就是一个生成器
    print(a)

<generator object createNum at 0x102981728>
  1. next(a)
-----start----
----- 1 ----
  1. next(a)
----- 2 ----
----- 3 ----
----- 1 ----

添加了yield b之后,每次调用next(a)循环都会在yield 处停止,只到下一次调用生成器时,才会继续往下执行代码
next(a) 等价于 a.next()

send

def createNum():
    i = 0
    while i < 5:
        temp = yield i
        print(temp)
        i += 1


a = createNum()
next(a) # 没有任何打印
next(a) # 打印None

next(a) # 打印None
next(a) # 打印None
a.send('hahaha') # hahaha
#说明send函数是在给yield i这个模块代码赋值。

注意事项:如果不调用next(a)或者a.next(),直接调用send('haha') 对yield赋值导致程序崩溃,愿意在于send找不到yield,正确的方式是send(None)

元类(type)

类也是对象,我们可以动态的创建它们
type叫做元类 ,使用type可以创建类

Person2 = type("Person2",(),{"num":0})
p1 = Person2()
print(p1.num)

创建一个带函数的类
def printNum(self):
        print("----num--%d---"%self.num)
Person3 = type("Person3",(),{"printNum":printNum})
p3 = Person3()
p3.num = 100
p3.pringNum()

创建一个继承的类
Man = type("Man",(Person,){})
xiaoming = Man()
xiaoming.eat()

元类就是用来创建类的东西,元类就是类的类
Myclass = MetaClass() #使用元类创建出的一个对象,这个对象称为"类"
MyObject = MyClass() #使用“类”来创建出实例对象

MyClass = type('MyClass',(),{})

可以使用 _ _ class _ _ 来判断是元类
MyClass._ class _

_ _ metaclass _ _属性

class Foo(object):
    __metaclass__ = something... 代码..
    #something... 代码..  使用元类创建类的代码。也就是说__metaclass__属性决定了class类的创建
上一篇 下一篇

猜你喜欢

热点阅读