迭代器.py

迭代器:

from collections import Iterable

迭代器

迭代是python最强大的功能之一,是访问集合元素的一种方式。

字符串,列表或元组对象都可用于创建迭代器:

字符串,列表或元组==>(Iterable object)可迭代对象

迭代器是一个可以记住遍历的对象的上一个位置。

迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问结束。迭代器只能往前不会后退。

迭代器有两个基本的方法:__Iter__()和__next__()。

__Iter__方法:返回迭代器自身。可以通过python内建函数__Iter__()调用.

__next__方法:当next方法被调用的时候,迭代器会返回他的下一个值,如果next方法被调用,但迭代器没有

只可返回,就会引发一个StopIteration异常。该方法可以通过python内建函数next()调用。

迭代器内部持有一个状态,该状态用于记录当前迭代所在的位置,

以方便下次迭代的时候获取正确的元素。迭代器有一种具体的迭代器类型,比如list_iter, set_iterator。可迭代对象实现了__iter__方法,该方法返回一个迭代对象。

内建函数iter()可以从迭代对象中获得的迭代器。

迭代对象:list tuple dict str set

it=iter(list)  # 创建迭代对象

创建一个迭代器有三种方法,其中前两种分别是:

1.为容器对象添加__iter__()和__next__()方法

2.__iter__()返回迭代器本身self,__next__()则返回每次调用next()或迭代时的元素

#自定义一个迭代器
class Container:
    def __init__(self,start,end):
        self.start=start
        self.end=end
    def __iter__(self):
        print('调用了__iter__(self)方法')
        return self #返回迭代器 对象本身
    def __next__(self):
        if self.start<self.end:
            i=self.start
            self.start=self.start+1
            return i
        else:
            raise StopIteration()
Cont=Container(0,10)
for i in Cont:
    print(i)

输出结果:

调用了__iter__(self)方法
0
1
2
3
4
5
6
7
8
9

2.内置函数Iter()将可迭代对象转化为迭代器

3.就是生成器(generator)。生成器通过yield语句快速生成迭代器,省略了复杂的__iter__()&__next__()方式

生成器:

第一种方式:将列表[]改为(),里面可以写推到

生成器只要通过next()方法即可得到下一个值,到最后一个后一场(StopIteration)退出

用表达式做生成器

例:

text=(x for x in range(10))

next(text) 或text.__next__()

#生成器:generater
#第一种创建方式:推导
nums=(x for x in range(10))
print(nums)
print(next(nums))
print(next(nums))
print('请王老师吃饭真开心。。')
print(next(nums))
print(nums.__next__())

输出结果:

<generator object <genexpr> at 0x055CFD80>
0
1
请王老师吃饭真开心。。
2
3

第二种方式:斐波那契 :将print换成yield,每次生成一个值

但是调用方法时没有结果

在方法内使用yield做生成器,这样调用此方法时,会得出一个结果:generator object ...

然后也是可以调用next()

每到yield时,就会停止,返回当前这个值,可以一次一次next()调用,看看运行过程

生成器可以被循环迭代,知道循环结束

import collections

print(isinstance([],collections.Iterable)) #True

print(isinstance(iter([]),collections.Iteraror)) #True

print(isinstance(iter([]),collections.Iterarable)) #True

#斐波那契
#1,1,2,3,5,8,13,21,34,55,89
fei=[]
for i in range(20):
    if i>1:
        fei.append(fei[i-1]+fei[i-2])
    else:
        fei.append(1)
    print(fei[i],end=' ')

输出结果:

1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 
fei=[]
def feibonaqi():
    for i in range(20):
        if i>1:
             fei.append(fei[i-1]+fei[i-2])
        else:
             fei.append(1)
    yield(fei[i])
print(feibonaqi())

输出结果:

<generator object feibonaqi at 0x0563ED80>






猜你喜欢

转载自blog.csdn.net/hsy_666/article/details/80384315