Python中的迭代器、生成器
from collections import Iterable, Iterator
1. 可迭代(iterable)对象
参考官网链接
class I:
def __init__(self, v):
self.v = v
def __iter__(self):
return iter([self.v]) # 返回的应该是迭代器对象
i = I(2)
print(isinstance(i, Iterable), isinstance(i, Iterator)) # True False
print(iter(i)) # <list_iterator object at 0x00000000021C8358>
class I:
def __init__(self, v):
self.v = v
def __getitem__(self, item):
if item > self.v:
raise IndexError
return item
i = I(2)
print(isinstance(i, Iterable), isinstance(i, Iterator)) # False False
print(iter(i)) # <iterator object at 0x0000000001DFCD30>
2. 迭代器(iterator)
参考官网链接
class I:
def __init__(self, v):
self.v = v
def __iter__(self):
return self
def __next__(self):
if self.v < 10:
self.v += 1
return self.v
raise StopIteration
i = I(2)
print(isinstance(i, Iterable), isinstance(i, Iterator)) # True True
print(iter(i)) # <__main__.I object at 0x00000000021E0898>
3. 生成器(generator)
参考官网链接
class I:
def __init__(self, v):
self.v = v
def __iter__(self):
yield 1
i = I(2)
print(isinstance(i, Iterable), isinstance(i, Iterator)) # True False
print(iter(i)) # <generator object I.__iter__ at 0x00000000022204C0>
4. 总结
- 只要实现了__iter__方法或者__getitem__方法, 就是iterable, 但Iterable只检测__iter__方法是否实现, 参见官网链接。推荐使用iter是否返回迭代器判断可否可迭代。
- __getitem__方法的返回有特殊要求, 参见官网链接。
- 实现了__iter__和__next__方法就是一个iterator。参见pep234。
- generator是返回一个generator iterator的函数。与普通函数的不同在于函数中包含 yield 表达式。
5. 其他参考
Python中的迭代器、生成器的更多相关文章
- python中的迭代器 生成器 装饰器
什么迭代器呢?它是一个带状态的对象,他能在你调用next()方法的时候返回容器中的下一个值,任何实现了__iter__和__next__()(python2中实现next())方法的对象都是迭代器,_ ...
- python中的迭代器&&生成器&&装饰器
迭代器iterator 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束. 迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退.另外, ...
- python is、==区别;with;gil;python中tuple和list的区别;Python 中的迭代器、生成器、装饰器
1. is 比较的是两个实例对象是不是完全相同,它们是不是同一个对象,占用的内存地址是否相同 == 比较的是两个对象的内容是否相等 2. with语句时用于对try except finally 的优 ...
- python中的迭代器与生成器
迭代器 迭代器的引入 假如我现在有一个列表l=['a','b','c','d','e'],我想取列表中的内容,那么有几种方式? 1.通过索引取值 ,如了l[0],l[1] 2.通过for循环取值 fo ...
- Python中的迭代器和生成器
本文以实例详解了python的迭代器与生成器,具体如下所示: 1. 迭代器概述: 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后 ...
- Python中的列表生成器,迭代器的理解
首先,思考一个问题,比如,我们想生成0-100的列表,我们怎么做? 当然,可以写成 list1=[1,2,3...,100] 可以看出,这种方法不适合生成长的列表,那么Python中就可以利用已有的列 ...
- python中的迭代器和生成器学习笔记总结
生成器就是一个在行为上和迭代器非常类似的对象. 是个对象! 迭代,顾名思意就是不停的代换的意思,迭代是重复反馈过程的活动,其目的通常是为了逼近所需目标或结果.每一次对过程的重复称为一次“迭代”,而 ...
- 终于理解Python中的迭代器和生成器了!
迭代器和生成器 目录 迭代器和生成器 可迭代对象和迭代器 基础概念 判断 for循环本质 不想用for循环迭代了,如何使用迭代器? 列表推导式 生成器Generator 概念 如何实现和使用? 生成器 ...
- python 中的迭代器和生成器简单介绍
可迭代对象和迭代器 迭代(iterate)意味着重复,就像 for 循环迭代序列和字典那样,但实际上也可使用 for 循环迭代其他对象:实现了方法 __iter__ 的对象(迭代器协议的基础). __ ...
- python杂记-4(迭代器&生成器)
#!/usr/bin/env python# -*- coding: utf-8 -*-#1.迭代器&生成器#生成器#正确的方法是使用for循环,因为generator也是可迭代对象:g = ...
随机推荐
- Toast不消失问题
在实现一个功能的时候,遇到了Toast一直不消失的问题,因此,对Toast进行了一些研究. 先描述问题:有一个activity和一个thread,都有各自的handler.activity启动thre ...
- react-native-table-component, react-native 表格
使用 react-native-table-component, 加上 FlatList 组件,实现可以下拉刷新,上拉加载的demo import React, { Component } from ...
- django 之 ContentType的使用
1. ContentType 是干什么用的呢: 1. ContentType: 主要的作用就是Django orm的创建表的时候,可以方便多表查询使用,简化多表查询的过程 2.ContentType ...
- Maven项目强制更新,解决Failed to read artifact descriptor for xxx.jar问题
导入的maven项目pom.xml现红叉 分析原因:在maven本地仓库中找不到相应的jar包. 解决方案:让maven强制更新依赖. 项目右击菜单,Maven -> Update Projec ...
- Win10下VirtualBox安装流程
一.VirtualBox简介 VirtualBox 是一款开源的虚拟机软件,最初由美国SUN公司开发,后来SUN被Oracle收购,VirtualBox 更名为Oracle VirtualBox .不 ...
- SQL Server并发操作单个表时发生在page页面级的死锁
最近遇到的死锁问题都发生在并发操作单张表上,比较有意思,就模拟了重现了一下.根据非聚集索引为条件,删除某一个表的数据,类似于这么一个语句,delete from table where noclust ...
- ArcGIS 要素类平移工具-arcgis案例实习教程
ArcGIS 要素类平移工具-arcgis案例实习教程 联系方式:谢老师,135-4855-4328,xiexiaokui#qq.com 目的:对整个要素类,按指定偏移距离,进行整体平移. 优点:使用 ...
- CSS 背景图像 background属性简写
background属性简写 background属性可以像margin padding属性一样,有简写方法,它的简写顺序是: background-color background-image ba ...
- CSS属性相关
·一.宽和高 width属性可以为元素设置宽度. height属性可以为元素设置高度. 块级标签才能设置宽度,内联标签的宽度由内容来决定. 二.字体属性 1.文字字体 font-family可以把多个 ...
- 获取BDC 消息文本的2种方式
第一种 LOOP AT MESSTAB. MOVE MESSTAB-MSGNR TO MSGNO. CALL FUNCTION 'WRITE_MESSAGE' EXPORTING MSGID = ME ...