迭代 可迭代对象 迭代器的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 ...
随机推荐
- MySQL 四种隔离级别详解,看完吊打面试官
转发链接:https://zhuanlan.zhihu.com/p/76743929 什么是事务 事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消.也就 ...
- 支付宝电脑网站支付 alipay.trade.page.pay
只涉及支付接口 其他接口没有使用 支付宝官方文档:https://docs.open.alipay.com/270/105899/ 支付接口文档 https://docs.open.alipay.co ...
- PowerPoint无法正常加载MathType的解决方法
MathType是一款十分便捷的数学公式编辑器,可以和很多办公软件和网站兼容使用,我们日常用的比较多的也就是Office和WPS,更具体的说是Word\Excel\PPT等等一系列办公常用软件. 不过 ...
- jQuery 第十章 工具方法-高级方法 $.ajax() $.Callbacks() .....
$.ajax() $.Callbacks() $.Deferred() .then() $.when() ---------------------------------------------- ...
- JDBC【1】-- 入门之增删改查
目录 1.jdbc是什么 2.使用IDEA开发 2.1 创建数据库,数据表 2.2 使用IDEA创建项目 1.jdbc是什么 JDBC(Java DataBase Connectivity,java数 ...
- Java集合【6.1】-- Collection接口源码详解
目录 一.Collection接口简介 二.Collection源码分析 三.Collection的子类以及子类的实现 3.1 List extend Collection 3.2 Set exten ...
- 交换机三种端口模式Access、Hybrid和Trunk
以太网端口有 3种链路类型:access.trunk.hybird 什么是链路类型? vlan的链路类型可以分为接入链路和干道链路. 1.接入链路(access link)指的交换机到用户设备的链路, ...
- 三万字无坑搭建基于Docker+K8S+GitLab/SVN+Jenkins+Harbor持续集成交付环境
写在前面 最近在 K8S 1.18.2 版本的集群上搭建DevOps环境,期间遇到了各种坑.目前,搭建环境的过程中出现的各种坑均已被填平,特此记录,并分享给大家! 文章和搭建环境所需要的yml文件已收 ...
- 【2014广州市选day1】JZOJ2020年9月12日提高B组T4 字符串距离
[2014广州市选day1]JZOJ2020年9月12日提高B组T4 字符串距离 题目 Description 给出两个由小写字母组成的字符串 X 和Y ,我们需要算出两个字符串的距离,定义如下: 1 ...
- 记STM32F103C8T6+STLINK下载器在Keil中的设置
调试代码为: /************************************** * 文件名 :main.c * 描述 :获取CPU的96bit ID 和 flash的大小,并通过USAR ...