博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python可迭代对象与迭代器
阅读量:6689 次
发布时间:2019-06-25

本文共 1437 字,大约阅读时间需要 4 分钟。

  1. 可迭代对象

    字面意思分析:可以重复的迭代的实实在在的东西。

    list,dict(keys(),values(),items()),tuple,str,set,range, 文件句柄(待定)

    专业角度: 内部含有'__iter__'方法的对象,就是可迭代对象。

    内置函数:dir() print(dir(str))

    判断一个对象是否是可迭代对象:

    print('__iter__' in dir(str))# True 是可迭代对象# False 不是可迭代对象

    优点:

    1. 直观。
    2. 操作方法较多。

    缺点:

    1. 占内存。
    2. 不能迭代取值(索引,字典的key)。
  2. 迭代器

    字面意思:可以重复迭代的工具。

    专业角度: 内部含有'__iter__'并且含有"__next__"方法的对象,就是迭代器

    可迭代对象转化成迭代器:

    l1 = [1, 2, 3, 4, 5]# 内置函数iter()obj = iter(l1)
    # 迭代器可以迭代取值。利用next()进行取值l1 = [1, 2, 3, 4, 5]# 内置函数iter()obj = iter(l1)# print(obj)print(next(obj))print(next(obj))print(next(obj))print(next(obj))print(next(obj))

    迭代器优点:

    1. 非常节省内存。迭代器在内存中相当于只占一个数据的空间:因为每次取值都上一条数据会在内存释放,加载当前的此条数据。
    2. 惰性机制。next一次,取一个值,绝不过多取值。

    迭代器缺点:

    1. 不直观。不能直观的查看里面的数据。
    2. 操作不灵活。取值时不走回头路,只能一直向下取值
    3. 效率相对低。

    特性:

    l1 = [22, 33, 44, 55, 66, 77]obj = iter(l1)for i in range(3):    print(next(obj))# 结果 22 33 44 for i in range(2):    print(next(obj))# 结果 44 55   迭代器特性,取值到哪个位置就停在哪个位置,下次再取接着往后

    利用while循环,模拟for循环内部循环可迭代对象的机制。

    1. 先要将可迭代对象转化成迭代器。

    2. 利用next对迭代器进行取值。

    3. 利用异常处理try一下防止报错。

      l1 = [1, 2, 3, 4, 5]obj = iter(l1)while 1:    try:   # 异常处理        print(next(obj))    except StopIteration:        break
  3. 可迭代对象与迭代器的对比

    可迭代对象:是一个私有的方法比较多,操作灵活(比如列表,字典的增删改查,字符串的常用操作方法等),比较直观,但是占用内存,而且不能直接通过循环迭代取值的这么一个数据集。

    应用:当你侧重于对于数据可以灵活处理,并且内存空间足够,将数据集设置为可迭代对象是明确的选择。

    迭代器:是一个非常节省内存,可以记录取值位置,可以直接通过循环+next方法取值,但是不直观,操作方法比较单一的数据集。

    应用:当你的数据量过大,大到足以撑爆你的内存或者你以节省内存为首选因素时,将数据集设置为迭代器是一个不错的选择。(可参考为什么python把文件句柄设置成迭代器)。

转载于:https://www.cnblogs.com/changyifei-8/p/11053033.html

你可能感兴趣的文章
MySQL主从的一致性校验及修复
查看>>
Skype For Business 2015实战系列5:安装后端数据库
查看>>
Microsoft Security Essentials 中文版正式发布
查看>>
JSF Note
查看>>
自定义支持多行显示的RadioGroup
查看>>
tty终端截屏软件FbGrab安装和使用
查看>>
Linux内核网络参数
查看>>
初尝Mcafee之终结篇:管理架构概述【09】
查看>>
成功恢复UNIX误删除数据库文件(NODE已被清除)
查看>>
自定义控件之圆形颜色渐变进度条--SweepGradient
查看>>
Canvas裁剪和Region、RegionIterator
查看>>
双色汉诺塔【分离型】
查看>>
【驱动】linux设备驱动·入门
查看>>
android 中文 api (72) —— BluetoothSocket[蓝牙]
查看>>
(Mediator)中介者模式的Java实现(加修改)
查看>>
思科网络模块和接口卡(语音&广域网)的名称标识
查看>>
我为什么关注node.js
查看>>
3.3. Forms
查看>>
如何设置Windows 8开始画面中瓷贴最大行数
查看>>
Irrlicht引擎使用2之中文显示
查看>>