python高级编程(8) - 迭代器和生成器

迭代器和生成器

一,什么是迭代协议

  1. 迭代器是用来访问集合元素内部的一种方式,一般用来遍历数据

  2. 迭代器和访问下表的访问方式不一样,迭代器是不能返回的,迭代结束就没有值了,迭代器提供了一种惰性生成数据的方式

    from collections import Iterable, Iterator
    

二,迭代对象和迭代器区别

可迭代对象 :实现了 __ iter __() 这个魔法方法

迭代器:实现了 __ next ____ iter __ 这两个魔法方法

__ next __
  返回下一个可用的元素,如果没有元素了,抛出 StopIteration异常

__ iter __
  返回 self,以便在应该使用可迭代对象的地方使用迭代器,例如在 for 循环中。

内置的 iter 函数有以下作用。

(1)检查对象是否实现了 __iter__ 方法,如果实现了就调用它,获取一个迭代器。

(2)如果没有实现 iter 方法,但是实现了 __getitem__ 方法,Python 会创建一个迭代器,尝试按顺序(从索引 0 开始)获取元素。

(3)如果以上两者都没有,抛出异常

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TUWmIWOG-1592057987258)(D:\Python\Python笔记\流畅的Python\assets.png)]

序列能够迭代的原因:实现了 __ getitem __()

  • 迭代器和可迭代对象的关系Python 从可迭代对象中获取迭代器

四,生成器的使用

Userlist里面查看pythonlist的源码

from collections import UserList

五,python读取大文件

读取大文件数据,比如说一个T

  1. 有很多行的时候,使用文件句柄

    f = open()
    for line in f:
    	pass
    
  2. 所有数据连成一行(使用生成器)

    uwgesg{|}jegnjgj;sgnsjnegjnsjrn;ghnsdbjlsljdrnlkghesw{|}g561rhd16hd23hwsewdhg5sdg{|}dnwankd;kalfklan;lgnjegjakjdajkvandvlkjaegi{|}564456566g65egsg{|}dwadwadawd
    
    def my_read_lines(f, split_sign):
        buf = ""
        while True:
            while split_sign in buf:
                pos = buf.index(split_sign)
                yield buf[:pos]
                buf = buf[pos + len(split_sign):]
            chunk = f.read(4096*10)
            if not chunk:
                # 已经读到了文件结尾
                yield buf
                break
            buf += chunk
    
    with open(r'text.txt', 'r', encoding='gbk') as f:
        for line in my_read_lines(f, '{|}'):
            print(line)
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值