前言

迭代器、生成器、装饰器都有一个“器”,但他们之间没有什么关系。

迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。

迭代器有两个基本的方法:iter() 和 next()

一、迭代器优点

  • 从容器类型中一个一个的取值,会把所有的值都取到。
  • 节省内存空间,迭代器并不会在内存中再占用一大块内存,而是随着循环 每次生成一个,每次next每次给我一个,如下:

明显 list 占用内存空间比 range(0,50)大,只有 是可迭代对象的时候 才能用for,for循环本质就是迭代器

当我们遇到一个新的变量,不确定能不能for循环的时候,就判断 __iter__ 它是否可迭代

 二、迭代器介绍

1、dir 查看可调用方法:print(dir(list))

可以看到:int、bool 数据类型是没有 iter() 方法的。

print(dir(list))                    # 查看某数据类型拥有的所有可调用方法
print(dir([])) # [] == list
print('__iter__' in dir(int))
print('__iter__' in dir(bool))
print('__iter__' in dir(list))
print('__iter__' in dir(dict))
print('__iter__' in dir(set))
print('__iter__' in dir(tuple))
print('__iter__' in dir(enumerate([])))
print('__iter__' in dir(range(1)))

2、结论:

  • 只要含有 __iter__ 方法的都是可迭代的
  • 发现只要是能被 for 循环的数据类型,就一定拥有 __iter__ 方法
  • 一个数据类型执行了 __iter__() 方法之后的返回值就是一个迭代器

3、拥有 __iter__ 方法,可通过 __next__ 方法从迭代器中一个一个的取值,但不可逆。

# 通过 next 就可以从迭代器中一个一个的取值
ls = [1, 2, 3]
res = ls.__iter__() # 一个一个取值,不可逆
print(res.__next__()) #
print(res.__next__()) #
print(res.__next__()) #
print(res.__next__()) # list 只有 3个元素,所以这里会报错

4、实例验证迭代器是不是一定含有这两个方法:iter() 和 next()

图一:两个方法存在

图二:注释 next() 方法,不是迭代器,但可迭代

图三:注释 iter() 方法,都不是迭代器,或可迭代

from collections import Iterable, Iterator
class A:
''' # 内部含有__next__和__iter__方法的就是迭代器,缺一都不行 '''
def __iter__(self):pass
def __next__(self):pass res = A()
print(isinstance(res, Iterator)) # 迭代器
print(isinstance(res, Iterable)) # 可迭代

迭代器是可记住遍历位置的对象,你要多少就给你多少,美滋滋!欢迎来QQ交流群一起学习:482713805

python-20-迭代器是个什么东西?的更多相关文章

  1. python之迭代器与生成器

    python之迭代器与生成器 可迭代 假如现在有一个列表,有一个int类型的12345.我们循环输出. list=[1,2,3,4,5] for i in list: print(i) for i i ...

  2. python函数-迭代器&生成器

    python函数-迭代器&生成器 一.迭代器 1 可迭代协议 迭代:就是类似for循环,将某个数据集内的数据可以“一个挨着一个取出来” 可迭代协议: ① 协议内容:内部实现__iter__方法 ...

  3. python基础——迭代器

    python基础——迭代器 我们已经知道,可以直接作用于for循环的数据类型有以下几种: 一类是集合数据类型,如list.tuple.dict.set.str等: 一类是generator,包括生成器 ...

  4. python基础—迭代器、生成器

    python基础-迭代器.生成器 1 迭代器定义 迭代的意思是重复做一些事很多次,就像在循环中做的那样. 只要该对象可以实现__iter__方法,就可以进行迭代. 迭代对象调用__iter__方法会返 ...

  5. Python:迭代器的简单理解

    一.什么是迭代器 迭代,顾名思义就是重复做一些事很多次(就现在循环中做的那样).迭代器是实现了__next__()方法的对象(这个方法在调用时不需要任何参数),它是访问可迭代序列的一种方式,通常其从序 ...

  6. 第十六篇 Python之迭代器与生成器

    一.迭代器 一. 递归和迭代 生活实例说明什么是递归和迭代 A想去腾达大厦,问B怎么走路,B 说我不知道,我给你问问C,C也不知道,C又去问D,D知道,把路告诉了C,C又告诉B,B最后告诉A, 这就是 ...

  7. python——iterator迭代器|iterator详解——20140918|

    -----------------------------------------------------------------------------前言--------------------- ...

  8. 搞清楚 Python 的迭代器、可迭代对象、生成器

    很多伙伴对 Python 的迭代器.可迭代对象.生成器这几个概念有点搞不清楚,我来说说我的理解,希望对需要的朋友有所帮助. 1 迭代器协议 迭代器协议是核心,搞懂了这个,上面的几个概念也就很好理解了. ...

  9. Python之迭代器,生成器

    迭代器 1.什么是可迭代对象 字符串.列表.元组.字典.集合都可以被for循环,说明他们都是可迭代的. from collections import Iterable l = [1,2,3,4] t ...

  10. Python之迭代器及生成器

    一. 迭代器 1.1 什么是可迭代对象 字符串.列表.元组.字典.集合 都可以被for循环,说明他们都是可迭代的. 我们怎么来证明这一点呢? from collections import Itera ...

随机推荐

  1. Windows版Redis主从配置

    一.下载 从github上下载Redis的zip包,地址:https://github.com/MicrosoftArchive/redis/releases Redis本身不支持windows,这是 ...

  2. ubuntu “快捷方式”

    1.创建.Desktop文件 sudo gedit /usr/share/applications/pycharm.desktop 2.建立pycharm.desktop [Desktop Entry ...

  3. Datagrip 快捷键和常用插件持续更新一集一些使用技巧

    快捷键 Ctrl+Enter:执行选中的SQL语句 Ctrl+Shift+左右箭头:调整列宽度(选中行,可以调整所有列的宽度) Ctrl+N / 双击Shift :全局搜索,点击可直接进入表 Ctrl ...

  4. python函数2(返回值、传递列表...)

    python函数2(返回值.传递列表...) 1.返回值 1.1.返回简单的值 #返回简单值 def get_formatted_name(first_name,last_name): "& ...

  5. gRPC初识

    RPC算是近些年比较火热的概念了,随着微服务架构的兴起,RPC的应用越来越广泛.本文介绍了RPC和gRPC的相关概念,并且通过详细的代码示例介绍了gRPC的基本使用. RPC是什么 在分布式计算,远程 ...

  6. meta的作用

    一.先明白几个概念 phys.width: device-width: 一般我们所指的宽度width即为phys.width,而device-width又称为css-width. 其中我们可以获取ph ...

  7. oracle怎么建立本地连接

    sqlplus连接oracle数据库(连接本地oracle数据库和连接远程的oracle数据库) 虽然我们现在平时都是使用PLSQL Developer这个软件工具了,但是我们还是要了解sqlplus ...

  8. Private Variable and Private Method - Python 私有变量 和 私有方法

    Private Variable and Private Method Python 不象 Java 那样, 通过 private 关键字创建私有属性, python 通过更简洁的实现了'私有属性', ...

  9. Method Resolve Order (MRO) - 类对象属性的解析顺序

    Method Resolve Order (MRO) - 类对象属性的解析顺序 Python 支持多重继承, 此时就需要解决按照何种顺序来解析属性的问题.类的继承关系在一个特殊的类属性中指定(__mr ...

  10. Vscode使用

    一. Vscode使用 1. 点击最下方的错误警告显示条,出现四个选项最后一个为终端命令(dos命令) 2. 提交代码输入提交信息,打勾提交,选择类似刷新按钮进行推送 3. 同步代码点击类似刷新按钮即 ...