可迭代对象

什么是对象:

Python中,一切皆对象。一个变量,一个列表,一个字符串,文件句柄,函数等等都可称为一个对象。一个对象就是一个实例,就是实实在在的东西。

什么是迭代

迭代就是一个重复的过程,但还不是单纯的重复,就像是父亲,自己,儿子,孙子的关系,都是复制,但结果是不一样的。还有使用的APP,微信,抖音等隔一段时间就会基于上一次做一些更新,那么这就是迭代。

结论:

可迭代对象从字面意思就是一个可以重复取值的实实在在的东西。或者是可以被for循环的对象叫做可迭代对象。

不可迭代的有:

在Python中,有很多可迭代对象,那么就说说哪些不是:int,bool这两种类型不是可迭代的。

查看是否是可迭代对象:

在Python中,但凡内部含有iter方法,且返回一个迭代器(生成器)的可被定为是可迭代对象。

class Foo(object):
def __iter__(self,*args,**kwargs):
yield 1
yield 2
yield 3
obj1 = Foo()
for i in obj1:
print(i)
class Foo(object):
def __iter__(self):
return iter([1,2,3]) #可以是字典,列表,元组,集合
obj1 = Foo()
for i in obj1:
print(i)

除了直接看源码以外,可以使用dir()来判断源码内是否有iter方法。

dir()会将数据类型的方法以列表中含有字符串的形式进行输出。

 s = 123
print('__iter__' in dir(s)) #False

s1 = '123'
print('__iter__' in dir(s1)) #True

s2 = (1,2,3,4,5)
print('__iter__' in dir(s2)) #True

可迭代对象的优缺点:

优点:可直观的查看里面的数据

缺点:占用内存,可迭代对象不能迭代取值。(除去索引,key以外)

其中可迭代对象不能迭代的问题,是可以通过for循环来取值的。但其实for循环在底层做了一个小小的转化,就是将迭代对象转换成迭代器,然后进行取值。

迭代器:

是一个可以迭代取值的工具。专业点就是看类型中有没有iter和next方法,有就是一个迭代器。

__iter__ and __next__

有哪些对象是可迭代器呢:

s1 = 123
s2 = '123'
s3 = (1,2,3,4,5)
s4 = [1,2,3,4]
s5 = {1,2,3,4,5}
s6 = {'name':'xuan',}
f = open('test.txt')

print('__iter__' in dir(s1)) #False
print('__iter__' in dir(s2)) #True
print('__iter__' in dir(s3)) #True
print('__iter__' in dir(s4)) #True
print('__iter__' in dir(s5)) #True
print('__iter__' in dir(s6)) #True
print('__iter__' in dir(f)) #True print('__next__' in dir(s1)) #False
print('__next__' in dir(s2)) #False
print('__next__' in dir(s3)) #False
print('__next__' in dir(s4)) #False
print('__next__' in dir(s5)) #False
print('__next__' in dir(s6)) #False
print('__next__' in dir(f)) #True

可以看到,只有文件句柄是迭代器。

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

那么如何将可迭代对象转换成迭代器呢:

l1 = [1,2,3,4,5,6]
obj1 = l1.__iter__()
print(obj1)
#或
obj2 = iter(l1)
print(obj2)

可迭代对象取值:

可以使用iter来转换为迭代器,然后使用next来取值。当取值用完,任然要取的时候,就会报StopIteration的错误,

l1 = [1,2,3,4,5,6]
obj1 = l1.__iter__()
print(obj1.__next__())
print(obj1.__next__())
print(obj1.__next__())
print(obj1.__next__())
print(obj1.__next__())
print(obj1.__next__())
print(obj1.__next__())
print(obj1.__next__())

会了这个以后,我们就可以使用while来循环取值了。

l1 = [1,2,3,4,5,6]
obj1 = l1.__iter__()
while True:
try:
print(next(obj1))
except StopIteration:
break

迭代器和可迭代对象的对比:

可迭代对象:

私有的方法比较多,像列表和字典中的增删改查。比较直观,但是占用内存,而且不能直接通过循环迭代取值。当你侧重于对数据可灵活处理,并且内存空间足够,将数据集设置为可迭代对象是明确的选择。

迭代器:

是一个非常节省内存,可以记录取值位置,可以直接通过循环+next方法取值,但是不直观,操作方法比较单一的数据集。当你数据量过大,大到足以撑爆你的内存或者你以节省内存为首选因素时,将数据集设置为迭代器是一个不错的选择。

总结:

字面上讲,迭代器就是迭代取值的工具。

从专业角度上讲,在Python中,内部含有iter方法并且含有next方法的对象就是迭代器了。

迭代器的优点:

节省内存:迭代器在内存当中相当于只占一个数据的空间,因为每一个取值,都会把上一条数据内存释放后再加载当前的此条数据。

惰性机制:next一次取一个值,绝不过多取值。

缺点:

不能直观的查看里面的数据

取值时不走回头路,智能一直向下取值。

Python——迭代器&可迭代对象的更多相关文章

  1. python 迭代器/生成器/迭代对象

    生成器: 带有yield的函数 迭代器:带有next 方法的对象,可以作为内建函数next的参数 迭代对象:带有__iter__方法的对象,__iter__方法返回迭代器 -------------- ...

  2. python14 1.带参装饰器 | wrapper 了了解 # 2.迭代器 ***** # 可迭代对象 # 迭代器对象 # for迭代器 # 枚举对象

    ## 复习 '''函数的嵌套定义:在函数内部定义另一个函数 闭包:被嵌套的函数 -- 1.外层通过形参给内层函数传参 -- 2.验证执行 开放封闭原则: 功能可以拓展,但源代码与调用方式都不可以改变 ...

  3. Python生成器,迭代器,可迭代对象

    在了解Python的数据结构时,容器(container).可迭代对象(iterable).迭代器(iterator).生成器(generator).列表/集合/字典推导式(list,set,dict ...

  4. what's the python之可迭代对象、迭代器与生成器(附面试题)

    可迭代对象 字符串.列表.元祖.集合.字典都是可迭代的,数字是不可迭代的.(可以用for循环遍历取出内部元素的就是可迭代的) 如何查看一个变量是否为可迭代: from collections impo ...

  5. Python的可迭代对象、迭代器和生成器

    可迭代对象(Iterable) 这些可以直接作用于for循环的对象统称为可迭代对象:Iterable. 我们已经知道,可以直接作用于for循环的数据类型有以下几种: 一类是集合数据类型,如list.t ...

  6. Python 生成器, 迭代器, 可迭代对象的区别

    1.可迭代对象 在python中, 一切皆对象, 但凡是可以用for循环进行遍历取值的对象都可以称之为可迭代对象, 可迭代对象在程序的一个执行周期中,可以无限轮次的进行循环遍历 2.迭代器 a.一个可 ...

  7. 深入理解python中可迭代对象,迭代器,生成器

    英文原文出处:Iterables vs. Iterators vs. Generators 在python学习中,通常会陷入对以下几个相关概念之间的确切差异的困惑中: a container(容器) ...

  8. Python之可迭代对象、迭代器、生成器

    在使用Python的过程中,很容易混淆如下几个关联的概念: 1.容器(container) 2.可迭代对象(Iterable) 3.迭代器(Iterator) 4.生成器(generator) 5.生 ...

  9. PythonI/O进阶学习笔记_8.python的可迭代对象和迭代器、迭代设计模式

     content: 1.什么是迭代协议 2. 什么是迭代器(Iterator)和可迭代对象(Iterable) 3. 使用迭代器和可迭代对象 4. 创建迭代器和可迭代对象 5. 迭代器设计模式   一 ...

随机推荐

  1. pycharm安装pyinstaller将pygame打包成exe

    首先,使用pycharm自带的下载包工具,File-Settings-Project Interpreter,如图: 安装完成后,发现安装到了Python根目录下,我的在C:\python34\Scr ...

  2. python中的一些算法

    两个基础知识点:递归和时间复杂度 递归 递归函数的特点:自己调用自己,有结束条件,看下面例子: def fun1(x): """无结束条件,报错""& ...

  3. VC++6.0/VC6使用c99的stdint.h

    如果使用https://github.com/mattn/gntp-send/blob/master/include/msinttypes/stdint.h会报错: error C2733: seco ...

  4. [LeetCode] 227. Basic Calculator II 基本计算器 II

    Implement a basic calculator to evaluate a simple expression string. The expression string contains ...

  5. SLA 99.99%以上!饿了么实时计算平台3年演进历程

    作者介绍 倪增光,饿了么BDI-大数据平台研发高级技术经理,曾先后就职于PPTV.唯品会.15年加入饿了么,组建数据架构team,整体负责离线平台.实时平台.平台工具的开发和运维,先后经历了唯品会.饿 ...

  6. 机器学习技法实现(一):AdaBoost- Decision Stump (AdaBoost - 决策树的基于Matlab的实现)

    经过前面对AdaBoost的总结,下面要基于Matlab实现AdaBoost-Stump进行二维平面数据点的分类的实验. 一. 实验原理 参看 http://blog.csdn.net/lg12591 ...

  7. vue-cli构建的项目手动添加eslint配置

    一.package.json里配置添加 1.scripts里添加快捷eslint检查命令 "lint": "eslint --ext .js,.vue src" ...

  8. sort_buffer_size, Sort_merge_passes关系

    对于事务性工作负载是通常最快这个大小设置为32K,并且也是允许的最小尺寸.您应该谨慎使用它设置为较大的值,因为这可以很容易地降低性能. 如果所有的数据进行排序不适合在指定缓冲区大小的MySQL第一种类 ...

  9. list<Integer>,Integer[],int[]之间的互转(jdk1.8)

    偶然在开发过程中需要将int[] 转成 List<Integer>,采用了遍历的方式,写的代码实在太多. List<Integer> list = new ArrayList& ...

  10. python大数据挖掘和分析的套路

    大数据的4V特点: Volume(大量):数据巨大. Velocity(高速):数据产生快,每一天每一秒全球人产生的数据足够庞大且数据处理也逐渐变快. Variety(多样):数据格式多样化,如音频数 ...