码迷,mamicode.com
首页 > 编程语言 > 详细

[Python3]迭代器和生成器

时间:2017-09-10 09:58:07      阅读:211      评论:0      收藏:0      [点我收藏+]

标签:创建   coding   只读   bsp   文件   blog   cci   def   style   

迭代器

迭代是Python最强大的功能特色,是遍历访问序列元素的一种方式。

迭代器的特性是:

  • 可以记住当前遍历位置

  • 只能往前遍历,不能后退

  • 从序列的第一个元素开始访问,直至所有元素被访问完

  • 有两个基本方法: iter() 和 next()

  • 字符串、列表或元组对象可以用于创建迭代器

下面看以下实例:

# -*- coding:utf-8 -*-
__author__ = 谷白

import sys

if __name__ == "__main__":
    seq_tuple = (1, 2, 3, 4, 5)    
    
    # 创建迭代器
    seq_it = iter(seq_tuple)
    
    # 访问打印第一个元素
    print("第一个元素:%s" % next(seq_it))    
    
    # 访问打印第二个元素
    print("第二个元素:%s" % next(seq_it))    
    
    # 访问打印第三个元素
    print("第三个元素:%s" % next(seq_it))    
    
    # 使用for循环来遍历迭代器对象
    print("\nfor循环遍历迭代器对象: ")
    for_it = iter(seq_tuple)
    for x in for_it:
        print(x, end= )    
        
    # 使用while结合next遍历迭代器对象
    print("\n\nwhile & next遍历迭代器对象: ")
    while_it = iter(seq_tuple)    
    while True:
        try:            
            print(next(while_it))
        except StopAsyncIteration:
            sys.exit()

 

运行结果如下:

第一个元素:1
第二个元素:2
第三个元素:3

for循环遍历迭代器对象: 
1 2 3 4 5 

while & next遍历迭代器对象: 
1
2
3
4
5
Traceback (most recent call last):
  File "E:/code/python/sample/迭代器.py", line 32, in <module>
    print(next(while_it))
StopIteration

 

请注意上述才异常抛出,因为这里已经遍历超出了序列的边界了。

生成器

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

与普通函数不同的是:生成器返回的是一个迭代器的函数,只能用于迭代操作,直接理解就是:生成器就是功能更强大的迭代器。

在调用生成器的过程中,每次遇到yield时,函数就会暂停并保存当前运行状态,返回yield的值,并在下一次执行next() 方法时从当前位置继续运行。

下面我们通过使用生成器来实现斐波那契数列:

# -*- coding:utf-8 -*-

__author__ = 谷白

import sys

# 生成器函数
# 实现斐波那契数列
def fibonacci(n):
    # 初始化变量
    a, b, count = 0, 1, 0

    while True:        
        if count > n:     
            return

        yield a

        a, b = b, a + b
        count = count + 1

if __name__ == "__main__":    
    # 初始化生成器函数,产生一个生成器函数
    f = fibonacci(10)    
    
    while True:    
        try:
            print(next(f), end= )        
        except StopAsyncIteration:
            sys.exit(0)

运行结果如下:

0 1 1 2 3 5 8 13 21 34 55 Traceback (most recent call last):
  File "E:/code/python/sample/生成器.py", line 30, in <module>
    print(next(f), end= )
StopIteration

 

注:上述输出有异常抛出,是正常的。

实践提升题

大家可以尝试利用生成器函数去读大文件,例如10G的文件,你可以利用生成器函数,每次只读100M进行处理,处理完后再读取下一个100M,如此迭代下去。

[Python3]迭代器和生成器

标签:创建   coding   只读   bsp   文件   blog   cci   def   style   

原文地址:http://www.cnblogs.com/igubai/p/7499995.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!