python迭代器与生成器介绍

一:迭代器

       可迭代的对象(Iterable):在python中,但凡内置有__iter__方法的对象,都是可迭代的对象

       迭代器(Iterator):迭代取值工具,可迭代的对象执行__iter__方法得到的返回值就是迭代器对象

       可迭代的对象:str,list,tuple,dict,set,file(这些对象都是python内置的)
           特点:
           内置有__iter__方法的都叫可迭代的对象,执行该方法会拿到一个迭代器对象

迭代器:可以被next()函数调用并不断返回下一个值的对象;可迭代对象调用iter()方法后生成迭代器对象。

迭代器表示的是一个数据流;可以使用isinstance()函数来判断一个对象是否是Iterable/Iterator。

       迭代器对象:文件对象本身就是迭代器对象
           1、获取迭代器对象的方式:
           执行可迭代对象的__iter__方法,拿到的返回值就是迭代器对象
           迭代器对象执行__iter__方法,返回的是它本身
           2、特点:
           内置有__next__方法,执行该方法会拿到迭代器对象中的一个值
           内置有__iter__方法,执行该方法会拿到迭代器本身

       for循环原理分析:
       1、for 循环称之为迭代器循环,in后跟的必须是可迭代的对象
       2、for循环执行时会对in后面的对象使用__iter__方法,拿到对应的迭代器对象
       3、然后调用迭代器对象的__next__方法,拿到一个返回值赋值给变量,执行一次循环体
       4、周而复始,直到取完所有的值,for循环会检测到异常自动结束循环

二:生成器

       在Python中,有种一边循环一边计算的机制,称为生成器:generator

两种实现生成器的方式:

1,使用生成器表达式:

#创建一个生成器,只需把列表生成式的[]改成()
a = (x * x for x in range(1,11))
print(a)          #<generator object <genexpr> at 0x000002528FB61BF8>
#可以通过next()函数获得generator的下一个返回值
# print(next(a))       #1
# print(next(a))       #4
# print(next(a))       #9
 
#一般使用for循环来取值
for i in a:
    print(i)

2,构造使用yield关键字返回值的函数:
       函数内包含有yield关键字,调用函数时,不会执行函数体代码,而是拿到一个返回值,该返回值就是一个生成器对象
       生成器本质上也是一个迭代器

def chicken():
    print('=====>first')
    yield 1
    print('=====>sencond')
    yield 2
    print('=====>third')
    yield 3

       yield小结:
       1、为我们提供了一种自定义迭代器的方式,可以在函数内用yield关键字,调用函数拿到的结果就是一个生成器,即也是一个迭代器
       2、yield可以像return一样用于返回值,区别是return只能返回一次值,而yield可返回多次,因为yield可以保存函数执行的状态

#写一个生成器,即自定义一个迭代器
def my_range(start,end,step):
    n = start
    while n < end:
        yield n   #函数内有yield
        n += step
for item in my_range(2,22,5):
    print(item)
def send_food(name):
    while True:
        food = yield
        print('%s is eating %s' %(name,food))
sf = send_food('mydog')
sf.__next__()       #必须初始化一次,让函数停在yield的位置
sf.send('bond')    #send有两方面的功能:1、给yield传值;2、同__next__的功能,每次取得迭代器中的一个值

三:面向过程编程

       1,面向过程的编程思想
           核心是'过程'二字,过程即解决问题的步骤,即先干什么,再干什么。。。。
           基于面向过程编写程序就好比在设计一条流水线,是一种机械式的思维方式。

       2,总结优缺点:
           优点:复杂的问题流程化,进而简单化
           缺点:修改一个阶段,其他阶段都有可能需要做出修改,牵一发而动全身,即扩展性极差
           应用:用于扩展性要求低的场景

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值