Python中迭代器和生成器

一 迭代器

  • 迭代是访问集合元素的一种方式。
  • 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
  • 迭代器有两个基本的方法:iter() 和 next()。
li=[2,3,4,5,6]
it=iter(li)
print(next(it))    #有几个next就会执行几次
print(next(it))
#当然也可以使用for进行遍历
# for i in it:
#     print(i)

在这里插入图片描述

二 生成器

在 Python 中,使用了 yield 的函数被称为生成器(generator),生成器是一个返回迭代器的函数
生成器最快实现的方式:通过列表生成式改写. 一边循环, 一边计算的机制

def isprime(num):
    for i in range(2,num):
        if num%i==0:
            return False
        else:
            return True
primeli=(i for i in range(2,100) if isprime(i))
print(next(primeli))       #有几个next就执行几次
print(next(primeli))
print(next(primeli))

在这里插入图片描述
当然也可以像迭代器一样使用for循环

三 yield

斐波那契数列:(F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*))
指的是这样一个数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,
610,987,1597,2584,4181,6765,10946,17711,28657,46368…
解释: yield: 当函数中包含yield关键字,返回值是一个生成器, 如果要执行函数内容.需要调用next方法或者for循环.
运行过程: 当执行next方法时, 遇到yield程序停止, 直到执行下一次next方法时,从上一次停止的yield处继续执行,遇到yield停止运行.
return: 遇到return函数执行结束;

def fib(num):  #num为生成的数量
    """将来显示几个fib数列"""
    # a代表第一个数,b代表第二个数, count代表已经显示的fib个数,当前为0
    a,b,count=0,1,0
    while count<num:
        yield b
        a,b=b,a+b
        #已经显示的次数加1
        count+=1
res=fib(100)
print(next(res))
print(next(res))
print(next(res))
print(next(res))
print(next(res))

在这里插入图片描述
注意:有几个next就执行几次

生成器fib()执行的过程分析:

  • 执行语句 f = fab(100) 时,并不会马上执行 fib() 函数的代码块,而是首先返回一个 iterable 对象(即生成器)
  • 在 for 循环语句执行时或者next(),才会执行 fib() 函数的代码块。
  • 执行到语句 yield b 时,fib() 函数会返回一个迭代值,直到下次迭代前,程序会回到 yield b 的下一条语句继续执行,然后再次回到 for 循环,如此迭代直到结束。
  • 看起来就好像一个函数在正常执行的过程中被 yield 中断了数次,每次中断都会通过 yield 返回当前的迭代值。
  • 由此可以看出,生成器通过关键字 yield 不断的将迭代器返回到内存进行处理,而不会一次性的将对象全部放入内存,从而节省内存空间。
def fun():
    print('step1')
    yield 'yield1'
    print('step2')
    yield 'yield2'
    print('step3')
    res=yield 'yield3'    #res='hello'
    print('生成器接受一个值:',res)
    yield 'yield4'
#1.函数中有yield,返回值是一个生成器
g=fun()
print(g)
#2.生成器函数默认不执行函数内容,当遇到next(g),才执行函数内容
#3.执行函数时,一直执行,遇到yield停止,默认情况下不显示yield后边的内容,
#如果要显示,执行print(next(g))
next(g)              #会停在yield位置
print(next(g))     #print会显示yield 这一句后面的内容
print(next(g))
#4.如果需要给生成器函数传值
    # 1)必须有变量接收传递的值: res=yield 'yield'
    # 2)通过g.send('hello')       #send会重复上一次'yield'语句
    # 3)send方法,给yield所在位置传值,接收值之后,直到遇到yield停止
g.send('hello')

在这里插入图片描述

四 生成器之迷你聊天机器人

生成器可以使用的方法:

  • next(g)
  • g.send(’ '), 给生成器传递值;
    给yield所在位置发送一个数据, 直到遇到下一个yield停止.
def robot():
   res=''
   while True:
       recieve=yield res
       if 'age' in recieve:
           res='年龄保密'
       elif 'name' in recieve:
           res='My name is Tom'
       elif 'sex' in recieve:
           res='boy'
       else:
           res='我不知道你在说什么'
def main():
   #生成器对象
   Robot=robot()
   next(Robot)
   while True:
       send_data=input('汤姆>>:')
       if send_data=='q' or send_data=='bye':
           print('不聊了,再见...')
           break
       print(Robot.send(send_data))  #send_data给Robot传值
main()

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值