python3的可迭代对象与迭代器对象
可迭代对象与迭代器对象
通过一段简单的代码来理解这俩个概念
a = [1,2,3,4]
for i in a:
print(i)
这段代码很简单, 对 a 这个列表进行遍历, 然后打印输出每个元素, 那么遍历具体进行了那些操作呢?
- 首先需要确定 a(遍历的目标)要是一个 可迭代对象
- 如果 a 是一个 可迭代对象, 就由 a 的内置方法
__iter__()来生成一个 迭代器对象, 这里在 python2 里面 字符串是没有__iter__()方法的, 用__getitem__()来代替, 不过 python3 已经统一为__iter__()了 - 然后通过迭代器对象 调用
__next__()来遍历, Python2 中 通过迭代器对象来调用.next()方法
a = [1,2,3,4]
iterator = a.__iter__() # 通过可迭代对象的 __iter__() 来生成一个迭代器对象
print(next(iterator)) #调用内置函数的 next()
print(next(iterator)) #或者 next.__next__()
print(next(iterator))
print(next(iterator))
print(next(iterator))
输出结果:
1
2
3
4
Traceback (most recent call last):
File "/home/wshuo/Desktop/python3高级用法/test.py", line 7, in <module>
print(next(iterator))
StopIteration
当调用到最后的时候 抛出了一个 StopIteration 的报错, for循环就是通过这个报错来停止迭代的
下面一个小例子, 我们自己写一个 可迭代对象和迭代器对象
from collections import Iterable, Iterator
# 自定义了一个迭代器对象, 继承迭代器对象
class MeIterator(Iterator):
def __init__(self, num_list):
self.num_list = num_list
self.index = 0
def control(self,n):
s = n +1
return s
# 自定义 __next__()方法, 为了for 循环调用
def __next__(self):
if self.index == len(self.num_list):
raise StopIteration
result = self.control(self.num_list[self.index])
self.index += 1
return result
# 自定义一个可迭代对象,继承可迭代对象
class MeIterable(Iterable):
def __init__(self, num_list):
self.num_list = num_list
# 通过__iter__方法返回迭代器对象
def __iter__(self):
return MeIterator(self.num_list)
# 测试程序
for i in MeIterable([1, 2, 3]):
print(i)
输出结果:
2
3
4
这里其实也可以不去继承 Iterable 和 Iterator 这俩个类, 不过需要在你自定义的 生成器 里面 加上 __iter__() 方法, 然后返回自身, 因为不仅是 可迭代对象有这个接口, 迭代器也有这个接口, 而继承了 Iterator 就不需要写这个接口了
python3的可迭代对象与迭代器对象的更多相关文章
- python迭代-可迭代对象与迭代器对象
可迭代对象与迭代器对象 问题举例 某软件要求,从网络抓取各个城市的气温信息,并依次显示: 北京:15~22 上海:18~23 ...... 如果一次抓取所有城市气温信息再显示,显示第一个城市的气温时会 ...
- 可迭代对象,迭代器对象,for循环
迭代器:迭代的工具.迭代是更新换代,如你爷爷生了你爹,你爹生了你,迭代也可以说成是重复,并且但每一次的重复都是基于上一次的结果来的.如计算机中的迭代开发,就是基于软件的上一个版本更新.以下代码就不是迭 ...
- Python中的可迭代对象与迭代器对象
刚刚学习Python,对“可迭代对象”和"迭代器对象"的个人理解,不知道对不对. 1.几个概念 (1)迭代工具:包括for循环.列表解析.in成员关系测试.....等等在内的,用于 ...
- day 13 迭代器、可迭代对象、迭代器对象、生成器、生成器对象、枚举对象
迭代器大概念 # 迭代器:循环反馈的容器(集合类型)# -- 不同于索引取值,但也可以循环的从容器对象中从前往后逐个返回内部的值# 优点:不依赖索引,完成取值# 缺点:不能计算长度,不能指定位取值( ...
- day14带参装饰器,迭代器,可迭代对象 , 迭代器对象 ,for迭代器 , 枚举对象
复习 ''' 函数的嵌套定义:在函数内部定义另一个函数 闭包:被嵌套的函数 -- 1.外层通过形参给内层函数传参 -- 2.验证执行 开放封闭原则: 功能可以拓展,但源代码与调用方式都不可以改变 装饰 ...
- python学习Day14 带参装饰器、可迭代对象、迭代器对象、for 迭代器工作原理、枚举对象、生成器
复习 函数的嵌套定义:在函数内部定义另一个函数 闭包:被嵌套的函数 -- 1.外层通过形参给内层函数传参 -- 2.返回内部函数对象----> 延迟执行, 开放封闭原则: 功能可以拓展,但源代 ...
- python基础一 ------可迭代对象和迭代器对象
可迭代对象和迭代器对象:前者生成后者 比喻:10个硬币都可以一一数(迭代),放入到存钱罐(可以取钱的那种),那这个存钱罐就是一个迭代器对象 需求:从网络抓取各个城市气温信息,并依次显示若依次抓取较多的 ...
- Day 13 可迭代对象,迭代器对象,for循环迭代,生成器对象,枚举对象
一.迭代器概念:# 器:包含了多个值的容器# 迭代:循环反馈(一次从容器中取出一个值)# 迭代器:从装有多个值的容器中一次取出一个值给外界# ls = 'abcdef'ls = [1, 2, 3, 4 ...
- 8、如何实现可迭代对象和迭代器对象 9、如何使用生成器函数实现可迭代对象 10、如何进行反向迭代以及如何实现反向迭代 11、如何对迭代器做切片操作 12、如何在一个for语句中迭代多个可迭代对象
8.如何实现可迭代对象和迭代器对象 PS:注意重载Iterator方法的时候,需要和原来的方法名一样,否则创建实例时会报错 from collections import Iterator,Itera ...
- python_如何实现可迭代对象和迭代器对象?
什么是可迭代对象? 列表.字符串 for循环的本质? for循环要确保in后面的对象为可迭代对象,如何确保? iter() 方法得到一个迭代器对象 不停.__next__() 方法对迭代器对象进行迭代 ...
随机推荐
- java8 新特性 -Optional的常见用法
1. Optional 一. 简介 Opitonal是java8引入的一个新类,目的是为了解决空指针异常问题.本质上,这是一个包含有可选值的包装类,这意味着 Optional 类既可以含有对象也可以为 ...
- Windows 2012 R2上搭建IIS管理用户的隔离模式FTP
Windows 2012 R2上搭建IIS管理用户的隔离模式FTP Windows自带的FTP现在可以提供基于非OS用户的管理,这提高了安全性.即使FTP用户名和密码泄露,也不会对操作系统造成进一步的 ...
- 5种kafka消费端性能优化方法
摘要:带你了解基于FusionInsight HD&MRS的5种kafka消费端性能优化方法. 本文分享自华为云社区<FusionInsight HD&MRSkafka消费端性能 ...
- 组合总和 II
组合总和 II 题目介绍 给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates ...
- 【前端必会】Prettier,有了ESlint,还要Prettier
介绍 已经安装了ESLint为什么还要Prettier,主要是让ESLint专注于语法相关的验证,检查潜在问题.而代码格式化则有Prettier来接管 对比参考: https://baijiahao. ...
- PHP全栈开发(七):PHP与MySQL存储交互(2.插入、读取)
<?php $servername = "localhost"; $username = "root"; $password = "beijin ...
- 邻接矩阵bfs
#include<bits/stdc++.h> using namespace std; int a[11][11]; bool visited[11]; void store_graph ...
- 痞子衡嵌入式:RT-MFB - 一种灵活的i.MXRT下多串行NOR Flash型号选择的量产方案
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是一种灵活的i.MXRT下多串行NOR Flash型号选择的量产方案. 对于以 i.MXRT 这类没有内部 NVM (Non-Volati ...
- 二手商城集成jwt认证授权
------------恢复内容开始------------ 使用jwt进行认证授权的主要流程 参考博客(https://www.cnblogs.com/RayWang/p/9536524.html) ...
- RAID5 IO处理之条带读代码详解
除了对齐读流程中读失败通过条带重试的场景会进入到条带读,当IO覆盖范围超过一个chunk时也会进入条带读(如向chunk为4K的RAID下发起始位置为1K大小为4K的IO),接下来我们就这部分逻辑进行 ...