迭代器来这吧

目录

一,简介迭代对象

二.简介迭代器(iterator)

三.总结


一,简介迭代对象

1.首先我们引入一个函数叫isintance()

isintence(要判断的对象,判断前面的的对象是否为该类型的成员)

我是这样理解的,就是判断前一个是不是后面的对象的成员,为什么这样说(python一切皆对象)

其返回的是true/flase 如果是就返回true,反之返回flase

代码演练:

# 首先我们要说isinstance是不需要导入的

print(isinstance(123, int))
# true

print(isinstance('123', str))
# true

这里我们介绍isinstance()函数的用法

2.然后我们引入一个可迭代对象的概念及(iterable:可遍历的)

我们应该知道遍历是什么意思,通俗的解释就是 挨个查看每个元素的经历的过程就叫遍历,可能有点空洞,我们下面用代码解释一下

代码演练:

# 遍历

for i in 'stdjhdajjs':
    print(i)
'''
s
t
d
j
h
d
a
j
j
s
'''
# 没错,字符串是可以便利的,这样我们可以看出来其实就是挨个查看
# 一个  对象  的所包含的元素

那我们其实就可以看看字符串是不是iterable

判断方法如下:当然这个Iterable是需要导包的      from collections.abc import Iterable

代码演练:

# 1.导包
from colections.abc import Iterable

str = 'stdjhdajjs'
print(isinstance(str, Iterable))
# true

list = ['张三', '李四']
print(isinstance(list, Iterable))
# true
# 字典,元组也是可以的

a = 123
print(isinstance(a, Iterable))
# flase

for i in list:
    print(i)
'''
'张三'
'李四'
'''

我们发现可迭代对象都是一些有成员的非原子的(及可以再分的),我们还发现其实可迭代对象都可以循环遍历,有这么多对象都可以迭代那其他对象可不可以呢???  比如实例对象,类对象。。。,

总结:我们借助isinstance函数可以查看对象是否是可以迭代的,而可以迭代的对象是拥有可再分成员的对象(而exp:str),或者是有成员的的对象,(exp:list),有个共同点都可以用循环遍历

二.简介迭代器(iterator)

1.判断实例对象是否可以迭代

上面我们提到的是否实例对象可以迭代下面我们用代码演示一下,上面我们提到过可以迭代的对象就可以用循环遍历

代码演示:

class AAA(object):
    def __init__(self):
        self.lists = ['张三', '李四']


# 创建实例对象
aaa = AAA()
for i in aaa.lists:
     print(i)


'''
'张三'
'李四'
'''
for i in aaa:
     print(i)
# error



print(isintance(aaa, Iterable))
#flase

事实证明他们都不是,唉就这样结束了?

可曾听说过类的魔法方法O.o?

2.__iter__方法简介

通俗的将就是当你的类中定义了__iter__方法就会有神奇的事情发生(magic...)

# 1.导包
from collections.abc import Iterable
class AAA(object):
    def __init__(self):
        self.lists = ['李四', '张三']
    
    def __iter__(self):
        pass

# 创建实例对象
aaa = AAA()
print(isinstance(aaa, Iterable))
# true

print(isinstance(AAA, Iterable))
# false

for name in aaa:
    print(name)
# TypeError: iter() returned non-iterator of type 'NoneType'

哇,成功了,实例对象竟然是可以迭代的,而类对象却不是,遗憾,可我们用循环去遍历的时候出现的错误,TypeError: iter() returned non-iterator of type 'NoneType'----->大致翻译为 iter()方法被返回了一个无类型的非迭代器,哦,天哪,它需要返回值O.o?而且还得是个迭代器

3.迭代器的引入

上面说到我们找到了实例对象可以拥有可迭代属性,通过一个方法,但方法选哟返回一个迭代器,迭代器顾名思义就是具有迭代属性以及迭代方法的功能强大的模块,我们重新创一个类,而这里又会提到一个魔法方法(magic)__next__

代码演示:

# 1.导包
from collections.abc import Iterable
from collections.abc import Iterator
class AAA(object):
    def __init__(self):
        self.lists = ['李四', '张三']
    
    def __iter__(self):
        return BBB()   # 这里着重解说一下,这是直接返回类BBB创建的实例对象

class BBB(object):
    def __iter__(self):
        pass
    def __next__(self):
        pass

# 创建实例对象
aaa = AAA()

print(isinstance(aaa, Iterable))
# true

iterator = iter(aaa)
print(isinstance(iterator, Iterator))
# true   

for name in aaa:
    print(name)
'''
此处输出无数个none
'''

上面的代码中提到一个iter()函数,用来返回一个迭代器对象成功说明,该对象是个迭代器,解决了迭代器的问题,我们其实刚开始就有个需求,就是我们通过迭代实例对象,来打印出来‘张三’,‘李四’,可现在是none,是因为我们定义的next方法中没有定义返回值的方法

代码演示:

# 1.导包
from collections.abc import Iterable
from collections.abc import Iterator
class AAA(object):
    def __init__(self):
        self.lists = ['李四', '张三']
    
    def __iter__(self):
        return BBB(self.lists)   # 这里着重解说一下,这是直接返回类BBB创建的实例对象

class BBB(object):
    def __init__(self, names):
        self.names =  names
        self.current_num = 0
    def __iter__(self):
        pass
    def __next__(self):
        if self.current_num <= len(self.names)
            print(self.names[self.current_num])
            self.current_num += 1


# 创建实例对象
aaa = AAA()

for name in aaa:
    print(name)
'''
李四
张三
none
....
'''

最后的结果是输出完李四张三一直输出none,这各现象表明,我们的而迭代方法并没有结束信息返回,当我们迭代完了,应该抛出一个异常,而这个异常就是StopIteration异常,他会帮我们在迭代的对象结束后返回一个异常,使得for循环截至

代码演示:

# 1.导包
from collections.abc import Iterable
from collections.abc import Iterator
class AAA(object):
    def __init__(self):
        self.lists = ['李四', '张三']
    
    def __iter__(self):
        return BBB(self.lists)   # 这里着重解说一下,这是直接返回类BBB创建的实例对象

class BBB(object):
    def __init__(self, names):
        self.names =  names
        self.current_num = 0
    def __iter__(self):
        pass
    def __next__(self):
        if self.current_num <= len(self.names)
            print(self.names[self.current_num])
            self.current_num += 1
        else:
            raise StopIteration


# 创建实例对象
aaa = AAA()
for name in aaa:
    print(name)
'''
李四
张三
'''

结束发现是我们要答案,但是我们又发现这两个类有很多相同的方法,我们能不能把这简化为一个类,让他实现迭代器

代码演示:

# 1.导包
from collections.abc import Iterable
from collections.abc import Iterator

class AAA(object):
    def __init__(self):
        self.lists = ['李四', '张三']
        self.current_num = 0
    
    def __iter__(self):
        return self   # 这里就是要满足返回的对象有iter,next方法,索性直接返回自己

    def __next__(self):
        if self.current_num <= len(self.names):
            print(self.names[self.current_num])
            self.current_num += 1
        else:
            raise StopIteration


# 创建实例对象
aaa = AAA()
for name in aaa:
    print(name)
'''
李四
张三
'''

结果一置,说明想法是对的,

三.总结

说到这里,迭代器就是一个包含特殊属性的类建立的实例对象,这个类中要包含__iter__来保证对象具有迭代属性的,而__next__方法是用来真

正实现循环中遍历时显示什么的方法,说到这里上面的提到魔法属性是有自己的调用规则的,不需要你专门去调用,就像创建实例对象时会自己调用__init__方法

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值