迭代器(iterator) 和 生成器(Generator)

1 迭代器
1.1 定义

   迭代器是指能用next(it)函数取值的对象(实例)

1.2 说明

   1 用iter函数可返回一个可迭代对象的迭代器

   2 迭代器是访问可迭代对象的一种方式

   3 迭代器只能往前,不能后退

1.3 示例

  

L = [1,1,2,3,5,8]

it = iter(L)

for i in it:

print(i)

执行结果:

1 1 2 3 5 8

next(it)

L = [1,1,2,3,5,8]

it = iter(L)

# for i in it:

#     print(i,end=" ")

print(next(it))

print(next(it))

print(next(it))

print(next(it))

print(next(it))

print(next(it))

print(next(it))     #此行抛出   StopIteration

L = [1, 1, 2, 3, 5, 8]

it = iter(L)

 

try:

    while True:

        print(next(it), end='\t')

except StopIteration:

print("取值结束")

执行结果

1 1     2     3     5     8     取值结束

2 函数
2.1 iter(x)

从一个对象x中返回一个迭代器,x必须是能提供一个迭代器的对象

2.2 next(it)

从it迭代器中获取下一个记录,如果无法获取下一条数据则对象触发StopIteration 异常

3 Generator生成器

Generator  python2.5及以后的版本才有

3.1 定义

生成器是能够提供迭代器的对象(实例)#创建迭代器

3.2 生成器函数

含有yield语句的函数是生成器函数

注:yield  译 生成或产生

3.3 yeild语句
3.3.1 语法

   yield表达式

3.3.2 说明

yield用于def函数中,目的是将此函数作为生成器函数使用

yield 用来生成数据,供迭代器next(it)函数调用

3.3.3 示例

示例1

def myyield():

    yield 2

    yield 3

    yield 5

    yield 7

在红线之前不会执行myyield函数内的print语句

    print('生成器函数调用结束')

 

 

 


print(myyield()) #打印一个生成器地址,换句话说此返回一个生成器对象

                #生成器对象是可迭代的

 

it = iter(myyield())

try:

在此处try语句,则将处于死循环

因为每次捕捉到异常后又转为正常状态,永远无法停止循环了

    while True:

        print(next(it))

except StopIteration:

print("无下一个数值了")

执行结果

<generator object myyield at 0x7f0d1b6aaf68>

2

3

5

7

生成器函数调用结束

无下一个数值了

 

 

 

def myyield():

    yield 2

    yield 3

    #下一句StopIteration异常的对象值,且以后的

    #yield语句不会执行了,就此结束

    return '朕执行后下面语句就不要执行了'

这几句代码不管是try语句还是没有try语句都不会执行,这是return的作用,并且如果超出生成器对象的值范围则返回return后面的语句

 

 

    yield 5

    yield 7

    print('生成器函数调用结束')

 

 

it = iter(myyield())

try:

    while True:

        print(next(it))

except StopIteration as st:

    print("捕捉到StopIteration异常")

print(st)

执行结果

2

3

捕捉到StopIteration异常

朕执行后下面语句就不要执行了

def myyield():

    yield 2

    yield 3

    #下一句StopIteration异常的对象值,且以后的

    #yield语句不会执行了,就此结束

    return '朕执行后下面语句就不要执行了'

    yield 5

    yield 7

    print('生成器函数调用结束')

 

 

it = iter(myyield())

while True:

print(next(it))      

执行结果:

2

3

Traceback (most recent call last):

  File "yield.py", line 17, in <module>

    print(next(it))

StopIteration: 朕执行后下面语句就不要执行了

def myrange(stop):

    i = 0

    while True:

        if stop == i:

            break

        yield i

        i += 1

       

 

print(myrange(10))

 

for x in myrange(10):

print(x)

 

执行结果:

<generator object myrange at 0x7fcfc8127f68>

1  2  3  4  5  6  7  8  9

 

 

 

 

 

i = 0

 

 

def yieldName():

    global i

    while True:

        if i == 10:

            break

        yield i

        i += 1

 

 

it = iter(yieldName())

print(next(it))  #0

print(next(it))  #1

print(next(it))  #2

print(next(it))  #3

'''前n个斐波那契数'''

def fab(n):

    '''前n个斐波那契数'''

    x, a, b = 0, 0, 1

    while n > x:

        yield b

        a, b = b, a + b

        x = x + 1

 

for i in fab(10):

    print(i)

3.4 生成器的执行

   当取下一个数时生成器才会产生下一个数,这就不用直接把所有的数生成出来放在一块等着来取了

3.5 生成器表达式
3.5.1 语法:

          (表达式 for 变量 in 可迭代对象 [if 真值表达式])

   注:if 子句可以省略

3.5.2 作用:

          用推导式形式生成一个新的生成器(可迭代对象)

3.5.3 示例

   >>>g = (x for x in range(10) if x%2==1)

>>> g

<generator object <genexpr> at0x7f77954b8bf8>

很像元组推导式

3.6 生成器函数和普通函数之间的不同

return语句:

普通函数到return直接返回

生成器函数中的return语句会触发StopIteration异常

执行流程的不同:

1普通函数调用到return语句直接返回,不在进入

2生成器函数遇到yield就返回,只能用next()函数值,每次调用next(it)时会再次进入生成器函数

3.7 生成器表达式

   (表达式 for 变量 in可迭代对象)

   此表达式用于返回一个迭代器

 

 

 

4 迭代工具函数
4.1 作用

   是生成一个个性化的可迭代对象

4.2 zip(iter [,iter2[,····]])函数

返回一个zip对象,此对象用于生成一个元组,此元组的个数由最小的可迭代对象决定

  

numbers = [10086,10010,10000,95588]

names = ['移动','电信','联通']

 

zip_obj = zip(numbers,names)

 

for no,name in zip_obj:

print(name,"的客服电话",no)

执行结果

移动的客服电话 10086

电信的客服电话 10010

联通的客服电话 10000

numbers = [10086,10010,10000,95588]

names = ['移动','电信','联通']

 

zip_obj = zip(numbers,names)

 

for no,name in zip_obj:

    print(name,"的客服电话",no)

 

#zip案例1 应用与生成字典

d = dict(zip(numbers,names))

print(d)

执行结果

移动的客服电话 10086

电信的客服电话 10010

联通的客服电话 10000

{10000: '联通', 10010: '电信', 10086: '移动'}

 

 

4.3 enumerate(iterabel[,start])函数
4.3.1 作用

生成带索引的迭代器,返回的迭代类型为索引-值对(index-value)对,默认索引从零开始,也可以用start指定

4.3.2 示例

这个参数可省略,缺省值是0,也可以是自己定义的定义的任意整数值

names = ['张飞', '关羽', '孔明']

 

for no, n in enumerate(names,1):

print('第', no, '号人物', n)

执行结果

1 号人物张飞

2 号人物关羽

3 号人物孔明


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值