zoukankan      html  css  js  c++  java
  • yield总结

    1、使用yield  i

    def my_generator(n):
        for i in range(n):
            temp = yield i
            print(f'我是{temp}')
    
    
    g = my_generator(5)
    
    print(next(g))      # 输出0
    print(next(g))      # 输出1
    print(g.send(100))  # 既把100传进去了,又保留了原来迭代应该输出的2
    print(next(g))      # 输出3
    print(next(g))      # 输出4
    
    '''
    0                #第一次迭代
    我是None          #第二次迭代
    1
    我是100          #第三次迭代
    2
    我是None         #第四次迭代
    3
    我是None         #第五次迭代
    4
    '''

    2、改为使用yield

    def my_generator(n):
        for i in range(n):
            temp = yield
            print(f'我是{temp}')
    
    
    g = my_generator(5)
    
    print(next(g))     
    print(next(g))
    print(g.send(100))
    print(next(g))
    print(next(g))
    
    '''
    None
    我是None
    None
    我是100
    None
    我是None
    None
    我是None
    None
    '''

    总结:

    yield语句的一般形式
      temp=yield expression (推荐:既可以返回迭代的值,也可以接受send传进去的参数并赋给temp)

      yield expression(也可以使用,只返回迭代的值)

      temp=yield (不推荐,)

      yield (不推荐,)


    send(arg)方法总结:

      (1)它的主要作用是,当我需要手动更改生成器里面的某一个值并且使用它,则send发送进去一个数据,然后保存到yield语句的返回值
      (2)send(arg)的返回值就是那个本来应该被迭代出来的那个值。 这样既可以保证我能够传入新的值,原来的应该被迭代出来的值也不会弄丢

    3、生成器抛异常

    def my_generator():
        try:
            yield 'a'
            yield 'b'
            yield 'c'
            yield 'd'
            yield 'e'
        except ValueError:
            print('方法内--触发“ValueError"了')
        except TypeError:
            print('方法内--触发“TypeError"了')
    
    
    g = my_generator()
    print(next(g))
    print(next(g))
    print('-------------------------')
    print(g.throw(ValueError))
    print('-------------------------')
    print(next(g))
    print(next(g))
    print('-------------------------')
    print(g.throw(TypeError))
    print('-------------------------')
    print(next(g))

     4、加上while true

    def my_generator():
        while True:
            try:
                yield 'a'
                yield 'b'
                yield 'c'
                yield 'd'
                yield 'e'
            except ValueError:
                print('方法内--触发“ValueError"了')
            except TypeError:
                print('方法内--触发“TypeError"了')
    
    
    g = my_generator()
    print(next(g))
    print(next(g))
    print('-------------------------')
    print(g.throw(ValueError))
    print('-------------------------')
    print(next(g))
    print(next(g))
    print('-------------------------')
    print(g.throw(TypeError))
    print('-------------------------')
    print(next(g))

     总结:在生成器中抛出异常,这个throw函数会返回下一个要迭代的值或者是StopIteration


    生成器的启动和关闭:
    启动
    第一:直接使用next(g),这会直接开始迭代第一个元素(推荐使用这个启动)
    第二:使用g.send(None)进行启动,注意第一次启动的时候只能传入None,如果传入其他具体的指则会报错哦!
    关闭
    如果一个生成器被中途关闭之后,在此调用next()方法,则会显示错误StopIteration
    在一个生成器中,如果没有return,则默认执行到函数完毕时返回StopIteration

    -

  • 相关阅读:
    进程间通信(管道和有名管道)
    BAT面试需要什么样的程序员?
    深入剖析Redis系列: Redis哨兵模式与高可用集群
    七大进程间通信和线程同步
    详解Redis 的持久化机制--RDB和AOF
    大型网站技术架构演进
    Coding Standard(编程规范)
    @RequestBody,415Unsupported Media Type错误
    排序算法
    单例设计模式
  • 原文地址:https://www.cnblogs.com/staff/p/15421347.html
Copyright © 2011-2022 走看看