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的更多相关文章

  1. python 可迭代对象 迭代器 生成器总结

    可迭代对象 只要有魔法方法__iter__的就是可迭代对象  list和tuple和dict都是可迭代对象 迭代器 只要有魔法方法__iter__和__next__的就是可迭代对象 生成器 只要含有y ...

  2. python14 1.带参装饰器 | wrapper 了了解 # 2.迭代器 ***** # 可迭代对象 # 迭代器对象 # for迭代器 # 枚举对象

    ## 复习 '''函数的嵌套定义:在函数内部定义另一个函数 闭包:被嵌套的函数 -- 1.外层通过形参给内层函数传参 -- 2.验证执行 开放封闭原则: 功能可以拓展,但源代码与调用方式都不可以改变 ...

  3. Day 13 可迭代对象,迭代器对象,for循环迭代,生成器对象,枚举对象

    一.迭代器概念:# 器:包含了多个值的容器# 迭代:循环反馈(一次从容器中取出一个值)# 迭代器:从装有多个值的容器中一次取出一个值给外界# ls = 'abcdef'ls = [1, 2, 3, 4 ...

  4. 11.Python初窥门径(函数名,可迭代对象,迭代器)

    Python(函数名,可迭代对象,迭代器) 一.默认参数的坑 # 比较特殊,正常来说临时空间执行结束后应该删除,但在这里不是. def func(a,l=[]): l.append(a) return ...

  5. Python中的可迭代对象/迭代器/For循环工作机制/生成器

    本文分成6个部分: 1.iterable iterator区别 2.iterable的工作机制 3.iterator的工作机制 4.for循环的工作机制 5.generator的原理 6.总结 1.i ...

  6. Python进阶(三)----函数名,作用域,名称空间,f-string,可迭代对象,迭代器

    Python进阶(三)----函数名,作用域,名称空间,f-string,可迭代对象,迭代器 一丶关键字:global,nonlocal global 声明全局变量: ​ 1. 可以在局部作用域声明一 ...

  7. 可迭代对象&迭代器&生成器

    在python中,可迭代对象&迭代器&生成器的关系如下图: 即:生成器是一种特殊的迭代器,迭代器是一种特殊的可迭代对象. 可迭代对象 如上图,这里x是一个列表(可迭代对象),其实正如第 ...

  8. for循环迭代可迭代对象

    模仿for循环迭代可迭代对象,# for i in Iterable:# iterable >>> 迭代器.iterator# 可迭代对象 iterable# 迭代器.iterato ...

  9. 如何在一个for语句中迭代多个对象(2.7)

    如何在一个for语句中迭代多个对象 总结: 并行迭代使用zip(l1, l2, l3) 每次迭代从3个列表里各取一个数据 串行迭代使用itertools.chain(l1, l2, l3) 相当于把3 ...

随机推荐

  1. Jrebel & Xrebel 在线激活方法 (亲测可用)

    一开始用eclipse的时候虽然这是一个狂吃内存的家伙,但是调试代码是真的舒服,修改过的代码可以不用重启热加载,后来转idea,虽然idea很完美但是也有不足的地方,比如代码调试就不能热加载. 还好有 ...

  2. Java中常量池详解

    在Java的内存分配中,总共3种常量池: 转发链接:https://blog.csdn.net/zm13007310400/article/details/77534349 1.字符串常量池(Stri ...

  3. 标准库之time,random,sys,os

    # import time # print(time.time()) # 时间戳 # print(time.mktime(time.localtime())) # 结构化时间转换为时间戳 # prin ...

  4. CDR排钻教程-CorelDRAW服装设计中的排钻技术

    服装设计一直都是一个很火热的行业,也是一个比较高端的行业,随着时代的步伐,以前的人都是用手绘的方式来设计服装,现在不一样了,电脑可以说普及到了每一个家庭,让软件以更快的速度,更准确的数据来设计服装中的 ...

  5. 让mac电脑更简单运行Windows软件的CrossOver,优势知多少?

    如今,一些iPhone和iPad机型拥有Face ID功能,此功能作用允许用户通过面部识别来解锁设备.该功能还不能在Mac上使用,但是国外媒体于7月27日报道称,在公测第三版的macOS Big Su ...

  6. 五. Webpack详解

    1. 什么是Webpack 1.1 引入 什么是webpack?这个webpack还真不是一两句话可以说清楚的. 我们先看看官方的解释:At its core, webpack is a static ...

  7. WireShark抓包分析以及对TCP/IP三次握手与四次挥手的分析

    WireShark抓包分析TCP/IP三次握手与四次挥手 Wireshark介绍: Wireshark(前称Ethereal)是一个网络封包分析软件.功能十分强大,是一个可以在多个操作系统平台上的开源 ...

  8. python大数问题

    python不需要特殊的声明,可以直接进行大数运算 验证:

  9. Java多线程中的虚假唤醒和如何避免

    先来看一个例子 一个卖面的面馆,有一个做面的厨师和一个吃面的食客,需要保证,厨师做一碗面,食客吃一碗面,不能一次性多做几碗面,更不能没有面的时候吃面:按照上述操作,进行十轮做面吃面的操作. 用代码说话 ...

  10. JavaScript使用中的一些小技巧

    任何一门技术在实际中都会有一些属于自己的小技巧.同样的,在使用JavaScript时也有一些自己的小技巧,只不过很多时候有可能容易被大家忽略.而在互联网上,时不时的有很多同行朋友会总结(或收集)一些这 ...