迭代 可迭代对象 迭代器的bj
1.迭代的概念
迭代是重复反馈过程的活动,其目的通常是为了逼近所需目标或结果。每一次对过程的重复称为一次“迭代”,而每一次迭代得到的结果会作为下一次迭代的初始值。
2.可迭代对象
- 可以被for循环遍历获取的对象为可迭代对象
- 具备__iter__方法的对象为可迭代对象
3.可迭代对象的判断
- isinstance :提供判断某个对象是否属于某个类,如果属于返回True,如果不属于返回False
- for循环来判断
- 如果对象中具备__iter__方法的话,就是可迭代对象
3.自定义类生成实例对象演示
# 导入模块
from collections.abc import Iterable
# 什么是可迭代对象
class Mylist:
def __init__(self):
self.items = list()
def add(self, item):
self.items.append(item)
m = Mylist()
# 如果是可迭代对象,返回True,否则返回False
print(isinstance(m, Iterable))
4.具备__iter__方法的类
# 什么是可迭代对象
class Mylist:
def __init__(self):
self.items = list()
def add(self, item):
self.items.append(item)
def __iter__(self):
pass
m = Mylist()
# 如果是可迭代对象,返回True,否则返回False
print(isinstance(m, Iterable))
5.iter()函数和__next__()函数
- iter()函数:可以获取可迭代对象的迭代器
- 调用iter函数会触发__iter__魔法方法
- next()函数:对一个可迭代对象的迭代器调用该方法,可以返回该对象的下一条数据。
- 调用next函数会触发__next__魔法方法
6.__iter__方法返回迭代器
# 导入模块
from collections.abc import Iterable
# 什么是可迭代对象
class Mylist:
def __init__(self):
self.items = list()
def add(self, item):
self.items.append(item)
def __iter__(self):
# 局部iter方法此时该对象仅仅为可迭代对象,还不能进行for循环遍历
# __iter__必须返回一个具备__iter__方法和__next__方法的对象
# 只要具备了__iter__方法和__next__方法,那么这个对象叫做迭代器对象
return MyIterator
class MyIterator:
def __iter__(self):
pass
def __next__(self):
pass
mi = MyIterator()
m = Mylist()
# 如果是可迭代对象,返回True,否则返回False
# print(isinstance(m, Iterable))
m.add(1)
m.add(2)
m.add(3)
for i in m:
print(i)
# iter()函数 __iter__方法 iter(对象) --> 返回值
#
#
#
#
# next()函数 __next__方法 next(返回值)
7.迭代器的概念
- 具备了__iter__方法
- 具备了__next__方法
8.总结
- 可迭代对象:具备__iter__方法的对象为可迭代对象
- 如何能够被for‘循环:__iter__具有返回值,返回的是一个迭代器
- 迭代器:具备__iter__方法和__next__方法的对象
- 只要是迭代器肯定是迭代对象 √
- 只要是可迭代对象就是迭代器 ×
1.代码实现
# 定义一个类
# 怎么样才能成为可迭代对象?
# __iter__方法需要返回什么东西?
class MyList:
def __init__(self):
self.items = list()
def add(self, item):
self.items.append(item)
# 要想成为可迭代对象类,必须具备__iter__方法
def __iter__(self):
# 省略
# 需要在iter方法内返回个什么东西
# iter方法到底需要返回一个什么东西
# 这个对象是个什么 --> 迭代器
return MyIterator(self.items)
class MyIterator:
def __init__(self, obj):
self.mes = obj
self.current_num = 0
def __iter__(self):
pass
def __next__(self):
# 索引越界
if self.current_num < len(self.mes):
result = self.mes[self.current_num]
self.current_num += 1
return result
else:
raise StopIteration
# a = MyIterator()
# 通过类生成实例对象
m = MyList()
m.add(1)
m.add(2)
m.add(3)
m.add(4)
# m对象具备使用for循环的方法吗?
# iter next
for i in m:
print(i)
2.斐波那契数列
n = int(input("请输入:"))
class Mun:
def __init__(self):
self.num1 = list()
def fbnq(self):
a = 0
b = 1
i = 0
while i < n:
self.num1.append(a)
a, b = b, a+b
i += 1
def __iter__(self):
return DieDaiQi(self.num1)
class DieDaiQi:
def __init__(self,obj):
self.mes = obj
self.current_num = 0
def __iter__(self):
pass
def __next__(self):
if self.current_num < len(self.mes):
result = self.mes[self.current_num]
self.current_num += 1
return result
else:
raise StopIteration
m = Mun()
m.fbnq()
for i in m:
print(i)
迭代 可迭代对象 迭代器的bj的更多相关文章
- python 可迭代对象 迭代器 生成器总结
可迭代对象 只要有魔法方法__iter__的就是可迭代对象 list和tuple和dict都是可迭代对象 迭代器 只要有魔法方法__iter__和__next__的就是可迭代对象 生成器 只要含有y ...
- python14 1.带参装饰器 | wrapper 了了解 # 2.迭代器 ***** # 可迭代对象 # 迭代器对象 # for迭代器 # 枚举对象
## 复习 '''函数的嵌套定义:在函数内部定义另一个函数 闭包:被嵌套的函数 -- 1.外层通过形参给内层函数传参 -- 2.验证执行 开放封闭原则: 功能可以拓展,但源代码与调用方式都不可以改变 ...
- Day 13 可迭代对象,迭代器对象,for循环迭代,生成器对象,枚举对象
一.迭代器概念:# 器:包含了多个值的容器# 迭代:循环反馈(一次从容器中取出一个值)# 迭代器:从装有多个值的容器中一次取出一个值给外界# ls = 'abcdef'ls = [1, 2, 3, 4 ...
- 11.Python初窥门径(函数名,可迭代对象,迭代器)
Python(函数名,可迭代对象,迭代器) 一.默认参数的坑 # 比较特殊,正常来说临时空间执行结束后应该删除,但在这里不是. def func(a,l=[]): l.append(a) return ...
- Python中的可迭代对象/迭代器/For循环工作机制/生成器
本文分成6个部分: 1.iterable iterator区别 2.iterable的工作机制 3.iterator的工作机制 4.for循环的工作机制 5.generator的原理 6.总结 1.i ...
- Python进阶(三)----函数名,作用域,名称空间,f-string,可迭代对象,迭代器
Python进阶(三)----函数名,作用域,名称空间,f-string,可迭代对象,迭代器 一丶关键字:global,nonlocal global 声明全局变量: 1. 可以在局部作用域声明一 ...
- 可迭代对象&迭代器&生成器
在python中,可迭代对象&迭代器&生成器的关系如下图: 即:生成器是一种特殊的迭代器,迭代器是一种特殊的可迭代对象. 可迭代对象 如上图,这里x是一个列表(可迭代对象),其实正如第 ...
- for循环迭代可迭代对象
模仿for循环迭代可迭代对象,# for i in Iterable:# iterable >>> 迭代器.iterator# 可迭代对象 iterable# 迭代器.iterato ...
- 如何在一个for语句中迭代多个对象(2.7)
如何在一个for语句中迭代多个对象 总结: 并行迭代使用zip(l1, l2, l3) 每次迭代从3个列表里各取一个数据 串行迭代使用itertools.chain(l1, l2, l3) 相当于把3 ...
随机推荐
- 二叉堆python实现
二叉堆是一种完全二叉树,我们可以使用列表来方便存储,也就是说,用列表将树的所有节点存储起来. 如下图,是小根堆方式的二叉堆,假设父节点的下标为p,则他的左孩子下标为2P+1,右孩子下标为2P+2 cl ...
- zabbix 用Telegram报警!!!
第一步:先在Telegram 注册个机器人!!! @BotFather在Telegram中添加联系人并按"开始",然后键入: /newbot输入你要新建的机器人名称在电报中@你的机 ...
- Linux安装MySQL5.7(CentOS)
1.下载解压 1.1 MySql 5.7.26下载地址: https://dev.mysql.com/downloads/mysql/5.7.html#downloads 1.2 解压 tar -xv ...
- 精尽MyBatis源码分析 - MyBatis-Spring 源码分析
该系列文档是本人在学习 Mybatis 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释(Mybatis源码分析 GitHub 地址.Mybatis-Spring 源码分析 GitHub ...
- angular11源码探索[DoCheck 生命周期和onChanges区别]
网站 https://blog.thoughtram.io/ https://juristr.com/ https://www.concretepage.com/angular/ https://ww ...
- QBXT 提高组储备营 2020.夏 游记
DAY 1 是第一天呐!老师好强!讲得好仔细!连我都全懂了![doge] 突然对后面几天充满了期待-- 复习内容:二分,排序,贪心,搜索(好评) 新知识:Huffman树及Huffman编码,对拍,二 ...
- Windows操作系统深入解析原理
Windows运用程序编写插口(API)是对于Windows电脑操作系统大家族的客户方式系统软件程序编写插口.在32位版本号的Windows营销推广之前,31位版本号Windows电脑操作系统的程序编 ...
- ResHacker 用命令行方式修改 windows PE文件版本号
由于工作需要在詹金斯(genkins)集成环境打包,打包避免不了需要修改版本号,写入版本号最简单的方式通过修改windows rc文件 这就意味着,每次构建新版本前需要修改一次源文件 这个在用詹金斯集 ...
- HTML-webstorm添加快捷键
快速输入标签: 先输入标签p,按Tab键变成<p></p>,光标会在标签中间 输入内容后按end键 快速复制粘贴光标所在的一整行内容Ctrl+D 快速删除光标所在的行 Ctrl ...
- UPX使用教程
UPX是一个通用可执行文件压缩器,由于其具有: 压缩率高:压缩效果优于zip/gzip: 解压速度快:在奔腾133上即可达到大约10MB/秒: 压缩的可执行文件没有额外的内存开销: 安全:可以列表,检 ...