我是靠谱客的博主 传统山水,最近开发中收集的这篇文章主要介绍python 迭代器和可迭代对象_PYTHON-迭代器、可迭代对象,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

1.迭代:

通过重复执行的代码处理相似的数据集的过程,并且本次迭代的处理数据要依赖上一次的结果继续往下做,上一次产生的结果为下一次产生结果的初始状态,如果中途有任何停顿,都不能算是迭代。

#1) 非迭代例子

loop =0while loop < 3:print("Hello world!")

loop+= 1

#2) 迭代例子

loop =0while loop < 3:print(loop)

loop+= 1

2.容器:

容器仅仅只是用来存放数据的,我们平常看到的 l = [1,2,3,4]等等,好像我们可以直接从列表这个容器中取出元素,但事实上容器并不提供这种能力,而是可迭代对象赋予了容器这种能力。

3.可迭代对象(Iterable):

实现了__iter__()就行;

可迭代对象并不是指某种具体的数据类型,它是指存储了元素的一个容器对象。

一个可迭代对象是不能独立进行迭代的,Python中,迭代是通过for ... in来完成的。凡是可迭代对象都可以直接用for… in…循环访问,这个语句其实做了两件事:第一件事是调用__iter__()获得一个可迭代器,第二件事是循环调用__next__()。

常见的可迭代对象包括:a)   集合数据类型,如list、tuple、dict、set、str等;b)生成器(generator)

4.迭代器(Iterator):

迭代器可以看作是一个特殊的对象,每次调用该对象时会返回自身的下一个元素,从实现上来看,一个迭代器对象必须是定义了__iter__()方法和next()方法的对象。

系统的for i in 可迭代器or可迭代对象:... 这个最后有个StopIteration 异常来检验是否结束迭代;

>>> a = [1,2,3]>>> b =iter(a)>>>b

>>> b.__next__()1

>>> b.__next__()2

>>> b.__next__()3

>>> b.__next__()

Traceback (most recent call last):

File"", line 1, in b.__next__()

StopIteration

原因如下:

classB(object):def __next__(self):raiseStopIterationclassA(object):def __iter__(self):pass

return B()#return B()#A这个类实现了一个__iter__函数,返回的是B()的实例对象,其中B里面实现了__next__这个函数。

from collections.abc import *a=A()

b=B()print(isinstance(a, Iterable))#因为有__iter__ 所以其是一个可迭代对象Iterable

print(isinstance(a, Iterator))#因为没有__next__ 所以不是一个迭代器Iterator

print(isinstance(b, Iterable))#因为没有__iter__,所以不是一个可迭代对象

print(isinstance(b, Iterator))#因为没有__iter__ ,所以不是一个迭代器

#output

True

False

False

False>>>

这样B就行了:

classB(object):def __next__(self):raiseStopIterationdef __iter__(self):returnNoneclassA(object):def __iter__(self):returnB()from collections.abc import *a=A()

b=B()print(isinstance(a, Iterable))#使用 isinstance(obj, Iterable) 可以检测一个类是否已经注册到了 Iterable 或者实现了 __iter__() 函数,print(isinstance(a, Iterator))print(isinstance(b, Iterable))print(isinstance(b, Iterator))

#output:

True

False

True

True

raise:

try:

a= input("输入一个数:")#判断用户输入的是否为数字

if(nota.isdigit()):raise ValueError("a 必须是数字")exceptValueError as e:print("引发异常:",repr(e)) #repr() 函数将对象转化为供解释器读取的形式。

5.__getitem__(),让对象实现可迭代功能:

#任何Python序列都可迭代的原因是,他们都实现了__getitem__方法。其实,标准的序列也都实现了 __iter__方法。

>>>dir(list)

['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']

参考链接:

最后

以上就是传统山水为你收集整理的python 迭代器和可迭代对象_PYTHON-迭代器、可迭代对象的全部内容,希望文章能够帮你解决python 迭代器和可迭代对象_PYTHON-迭代器、可迭代对象所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(40)

评论列表共有 0 条评论

立即
投稿
返回
顶部