迭代 可迭代对象 迭代器的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 ...
随机推荐
- Android10_原理机制系列_Android消息机制(Handler)详述
概述 在Android中的多进程.多线程中提过,只有主线程(UI线程)可以更新UI,其他线程不可以,所以一般耗时操作放到子线程.子线程可以通过Handler将相关信息通知到主线程. Android的消 ...
- 面试官:小伙子,你给我说一下Java中什么情况会导致内存泄漏呢?
概念 内存泄露:指程序中动态分配内存给一些临时对象,但对象不会被GC回收,它始终占用内存,被分配的对象可达但已无用.即无用对象持续占有内存或无用对象的内存得不到及时释放,从而造成的内存空间浪费. 可达 ...
- Matlab 数值计算
本博客记录一些简单的计算 det(A):矩阵求行列式 A=[1,2;3,4]; det(A) ans=-2; inv(A):矩阵求逆 A=[1,2;3,4]; B=inv(A) B=[-2,1;1,5 ...
- tar解压提示:tar (child): 无法连接至 xxxx: 解析失败
如图提示: 错误原因:由于压缩文件中含有冒号导致 解决办法: 使用tar命令的–force-local选项
- jdk1.8hashmap常见的面试问题
1.HashMap原理,内部数据结构? 底层使用哈希表(数组加链表)来存储,链表过长会将链表转成红黑树,以实现在O(logn)时间复杂度内查找 2.讲一下HashMap中的put方法过程? 对key求 ...
- XOR性质
异或XOR的性质: 1. 交换律 2. 结合律 3. x^x = 0 -> 偶数个异或为0 4. x^0 = x -> 奇数个异或为本身 5. 自反性:a^b^b = a^0 =a
- C语言printf()函数的格式化字符串
原文链接:https://www.runoob.com/cprogramming/c-function-printf.html#include<stdio.h> #include<s ...
- 数据库:Flask-SQLAlchemy
一.安装以及使用 1.安装 安装 flask-sqlalchemy pip install flask-sqlalchemy 如果连接的是 mysql 数据库,需要安装 mysqldb pip ins ...
- 从内存泄露、内存溢出和堆外内存,JVM优化参数配置参数
内存泄漏 内存泄漏是指程序在申请内存后,无法释放已申请的内存空间,无用对象(不再使用的对象)持续占有内存或无用对象的内存得不到及时释放,从而造成内存空间的浪费.内存泄漏最终会导致OOM. 造成内存泄漏 ...
- [BJDCTF 2nd]xss之光
[BJDCTF 2nd]xss之光 进入网址之后发现存在.git泄露,将源码下载下来,只有index.php文件 <?php $a = $_GET['yds_is_so_beautiful']; ...