python系列九:python3迭代器和生成器

#!/usr/bin/python
import sys

'''
迭代器是一个可以记住遍历的位置的对象。
迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
迭代器有两个基本的方法:iter() 和 next()。
字符串,列表或元组对象都可用于创建迭代器
'''
list1 = [1,2,3,4,5]
it1 = iter(list1)    # 创建迭代器对象
#迭代器对象可以使用常规for语句进行遍历
for x in it1:
    print(x, end = ",")
    
#列表自己也可以使用for循环进行遍历
for x in list1:
    print(x, end = ":")

#也可以使用while循环进行遍历,使用 next() 函数
it2 = iter(list1)
'''
while True:
    try:
        print(next(it2))   # 输出迭代器的下一个元素
    except StopIteration:
        sys.exit()
'''
        
        
'''
在 Python 中,使用了 yield 的函数被称为生成器(generator)。
跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。
在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回yield的值。
并在下一次执行 next()方法时从当前位置继续运行。
'''
def fibonacci(n):    # 生成器函数 - 斐波那契
    a, b, count = 0, 1, 0
    while True:
        if count > n:
            return
        yield a
        a, b = b, a + b
        print(a, b)
        count += 1
    
f = fibonacci(10)     # f 是一个迭代器,由生成器返回生成

while True:
    try:
        print(next(f), end = ":")
    except StopIteration:
        break;
        #sys.exit()

#没有yield时,函数只是简单执行,没有返回迭代器f
def fibonacci2(n):    # 生成器函数 - 斐波那契
    a, b, count = 0, 1, 0
    while True:
        if count > n:
            return
        #yield a
        a, b = b, a + b
        print(a, b)
        count += 1
    
f = fibonacci2(10)     # f 是一个迭代器,由生成器返回生成

'''
while True:
    try:
        print(next(f), end = " ")       #TypeError: 'NoneType' object is not an iterator
    except StopIteration:
        sys.exit()
'''

'''
什么情况下需要使用 yield?
一个函数 f,f 返回一个 list,这个 list 是动态计算出来的(不管是数学上的计算还是逻辑上的读取格式化),
并且这个 list 会很大(无论是固定很大还是随着输入参数的增大而增大),
这个时候,我们希望每次调用这个函数并使用迭代器进行循环的时候一个一个的得到list的每个元素
而不是直接得到一个完整的list来节省内存,这个时候 yield 就很有用。
'''
def f(n):
    a, b, count = 0, 1, 0
    L = []
    while True:
        if count > n:
            return
        L.append(b)
        a, b = b, a + b
        count += 1
    return L   #返回一个n个数的list,当这个n很大的时候,会非常的占用内存。

fun = f(1000)
'''
while True:
    try:
        print(next(fun), end = " ")   #这样我们实际上是先生成了一个1000个元素的 list:f,然后我们再去使用这个f。#TypeError: 'NoneType' object is not an iterator
    except StopIteration:
        sys.exit()
'''

#因为我们实际使用的是list的遍历,也就是list的迭代器。那么我们可以让这个函数f每次只返回一个迭代器——一个计算结果,
#而不是一个完整的 list,运行方式是每次的调用都在 yield 处中断并返回一个结果,然后再次调用的时候再恢复中断继续运行。
def f(n):
    a, b, count = 0, 1, 0
    while True:
        if count > n:
            return
        yield b
        a, b = b, a + b
        count += 1
    return L   #返回一个n个数的list,当这个n很大的时候,会非常的占用内存。

fun = f(10)
while True:
    try:
        print(next(fun), end = " ")   #这样我们实际上是先生成了一个1000个元素的 list:f,然后我们再去使用这个f。
    except StopIteration:
        sys.exit()

原文地址:https://www.cnblogs.com/hejing-swust/p/8244611.html