• 【python 第七日】迭代器类和生成器进阶 __next__ __iter__


    迭代器中的throw

    放出异常,消耗一个yield

    def gen():
        while True: 
            try:
                yield 'normal value'
                yield 'normal value 2'
                print('here')
            except ValueError:
                print('we got ValueError here')
            except TypeError:
                break
    
    g=gen()
    print(next(g))
    print(g.throw(ValueError))
    print(next(g))
    print(g.throw(TypeError))
    
    #输出
    normal value
    we got ValueError here
    normal value   #第二个抛出异常,到这里,消耗了一个yield
    normal value 2
    Traceback (most recent call last):
      File "h.py", line 15, in <module>
        print(g.throw(TypeError))
    StopIteration

    迭代器中的yield from <iterator>

    def inner():
        for i in range(10):
            yield i
    def outer():
        g_inner=inner()    #这是一个生成器
        while True:
            res = g_inner.send(None)
            yield res
    
    g_outer=outer()
    while True:
        try:
            print(g_outer.send(None))
        except StopIteration:
            break

    #此时,我们可以采用yield from语句来减少我么你的工作量。 def outer2(): yield from inner() #当然 ,yield from语句的重点是帮我们自动处理内外层之间的异常问题,这里有2篇写的很好的文章,所以我就不再啰嗦了。

    杨辉三角形

    没用生成器函数,用的迭代器类,一种是直接写在next中,另外一个种是写到生成器yield,一定要加while True ,否则只有一个yield

    import  logging
    import sys

    logging.basicConfig(
    level= logging.INFO,
    stream = sys.stdout
    )
    class Fib:
    def __init__(self,max):
    print("__init__开始")
    self.max = max
    def __iter__(self):
    print("__iter__开始")
    self.l = [1]
    print("__iter__结束")
    return self

    def __next__(self):

    print("__next__开始,此时l为:",self.l,len(self.l))
    if len(self.l) > self.max :
    raise StopIteration
    x = self.l
    self.new_l = [1]
    for i in range(len(self.l)):
    if i < len(self.l) -1 :
    self.new_l.append(self.l[i]+self.l[i+1])
    else:
    self.new_l.append(self.l[i])
    self.l = self.new_l
    return x

    class Fib1:
    def __init__(self,max):
    print("__init__开始")
    self.max = max


    def __iter__(self):
    print("__iter__开始")
    self.ge = self.yie()
    self.l = [1]
    print("__iter__结束")
    return self

    def yie(self):
    while True: # 一定要加while True
    print("__yie__开始,此时l为:", self.l, len(self.l))
    if len(self.l) > self.max:
    raise StopIteration
    yield self.l
    self.new_l = [1]
    for i in range(len(self.l)):
    if i < len(self.l) - 1:
    self.new_l.append(self.l[i] + self.l[i + 1])
    else:
    self.new_l.append(self.l[i])
    self.l = self.new_l

    def __next__(self):
    logging.info("进入__next__,此时self.l:%s self.max:%s self.self.ge:%s"%(self.l, self.max, self.ge))
    return next(self.ge)

    a = iter(Fib1(10))
    print(a)
    print(next(a))
    print(next(a))
    print(next(a))
    print(next(a))


    #返回结果

    __init__开始
    __iter__开始
    __iter__结束
    <__main__.Fib1 object at 0x02C914D0>
    INFO:root:进入__next__,此时self.l:[1] self.max:10 self.self.ge:<generator object Fib1.yie at 0x02C8F330>
    __yie__开始,此时l为: [1] 1
    [1]
    INFO:root:进入__next__,此时self.l:[1] self.max:10 self.self.ge:<generator object Fib1.yie at 0x02C8F330>
    __yie__开始,此时l为: [1, 1] 2
    [1, 1]
    INFO:root:进入__next__,此时self.l:[1, 1] self.max:10 self.self.ge:<generator object Fib1.yie at 0x02C8F330>
    __yie__开始,此时l为: [1, 2, 1] 3
    [1, 2, 1]
    INFO:root:进入__next__,此时self.l:[1, 2, 1] self.max:10 self.self.ge:<generator object Fib1.yie at 0x02C8F330>
    __yie__开始,此时l为: [1, 3, 3, 1] 4
    [1, 3, 3, 1]


    #这里有未解决问题,用列表生成器生成杨辉三角的形式,这里不会赋值,求大神指教,17741779847
    l = [1]
    max =10
    for i in range(1,11):
    # new = [1]
    for j in range(len(l)-1,0,-1):
    l[j] = l[j] +l[j-1]
    l.append(1)
    print(l)
    l = [1]
    a = ([ l for j in range(len(l)-1, 0,-1) ] for i in range(max)) #这里两个问题,第一个如何生成类的生成器,第二个如何用列表生成器表示杨辉三角形,应该是2曾的

    print(next(a))
    print(next(a))
    print(next(a))

    支付宝     
    您的资助是我最大的动力!
    金额随意,欢迎来赏!
    微信

    如果,您希望更容易地发现我的新博客,不妨点击一下绿色通道的关注我

    如果,想给予我更多的鼓励,求打       付款后有任何问题请给我留言!!!

    ------------------------------------------------------------------------------------------
    作者:【周sir】
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
  • 相关阅读:
    李彦宏最新演讲:移动互联网的时代已经结束了
    表值函数 详解
    SQL中PIVOT 行列转换
    将WeX5部署到自己的Tomcat服务器上
    Cordova webapp实战开发:(2)认识一下Cordova
    Cordova webapp实战开发:(1)为什么选择 Cordova webapp?
    甲有5套房,不上班,靠收房租生活;乙有1套房,上班赚工资……(启示)
    Ubuntu 16.04下为Android编译OpenCV 3.1.0 Manager
    Dual Camera Info
    OpenCV 3.1
  • 原文地址:https://www.cnblogs.com/zhouguanglu/p/10238736.html
Copyright © 2020-2023  润新知