zoukankan      html  css  js  c++  java
  • python -- 生成器

    一、生成器(generator)

    在Python中,使用了yield的函数被称为生成器。

    生成器是一种特殊的迭代器,只能用于迭代操作。

    生成器中保存的是算法,每次调用next(),就计算出下一个元素的值,直到计算到最后一个元素,没有更多元素时,抛出StopIteration异常。

    不需要去创建一个完整而庞大的列表,一边循环一边计算,在数据量特别大的时候,能节约大量的内存。

    生成器也是可迭代对象,正确方法是使用for循环来遍历,并且不需要去关心StopIteration异常的处理。

    但是使用for循环遍历生成器时,拿不到生成器return的返回值。

    如果想要拿到返回值,就必须得捕获StopIteration错误,然后取出错误实例中的value值。(try ..... except)

    # -----------------------------------------
    # 生成器(generator):使用了yield的函数
    # -----------------------------------------
    # 偶数生成器
    def even():
    print('2')
    yield 2
    print('4')
    yield 4
    print('6')
    yield 6
    print('8')
    yield 8

    return 'OK'


    # 生成一个生成器对象
    e = even()
    # 用while语句+next()方法遍历生成器
    while True:
    try:
    # 使用next生成并取出一个元素
    print('while:', next(e))
    except StopIteration as e:
    print('迭代结束!')
    # 生成器的返回值包含在StopIteration实例的value中
    print(e.value)
    break

    # 用for...in语句遍历生成器
    for e in even():
    print('for:', e)
    print()


    # 自定义一个生成器
    def my_yield(n):
    num = 0
    while n > 0:
    num += 1
    yield n * 2
    n -= 1
    return '生成了%d个值' % num


    # 用for...in语句遍历生成器
    for i in my_yield(5):
    print("for遍历值:", i)
    print()

    # 用while语句+next()方法遍历生成器
    yy = my_yield(5)
    while True:
    try:
    print("while遍历值:", next(yy))
    except StopIteration as e:
    print(e.value)
    break
  • 相关阅读:
    ORACLE 变量定义
    AcWing1082 数字游戏(数位dp)
    AcWing1081 度的数量(数位dp)
    UCF Local Programming Contest 2017 I题 Rotating Cards(贪心+树状数组)
    AcWing1048 鸡蛋的硬度(浅谈两种解法的思考方向)
    CF713C Sonya and Problem Wihtout a Legend (经典dp)
    CF269B Greenhouse Effect (dp LIS)
    CF463D Gargari and Permutations (LCS)
    AcWing987 最长公共子序列
    CF721C Journey (dp+拓扑)
  • 原文地址:https://www.cnblogs.com/Teachertao/p/11229200.html
Copyright © 2011-2022 走看看