day12迭代器、生成器、面向过程

1、迭代是一个重复的过程,并且每次都是基于上一次结果而来

可迭代的对象:在py中,但凡内置有_iter_方法的对象,都是可迭代的对象

l='abc'
l=[1,2,3]
l={'k':1,'k1':2}
l=(1,2,3,4)
l={1,2,3,4,5}


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

可迭代的对象VS迭代器对象?
可迭代的对象:str ,list,tuple,dict,set,file
1、获取可迭代对象的方式:无须获取,python内置str,list,tuple,dict,set,file都可以叫迭代的对象,执行该方法会拿到一个迭代器对象
特点:
内置_iter_方法的都可叫迭代的对象,执行该方法会拿到一个迭代器对象
迭代器对象:文件本身就是迭代器对象
1、获取迭代器对象的方式:
执行可迭代对象的_iter_方法,拿到的返回值就是迭代器对象
2、特点:
  内置有_next_方法,执行该方法会拿到迭代器对象中的一个值
  内置有_iter_方法,执行该方法会拿到迭代器本身

迭代器的优缺点分析:
迭代器的优点:
提供了一种可不依赖于索引的取值方式、迭代器更省空间
缺点:
取值麻烦,只能一个一个取,只能往后取,并且一次性的,无法用len获取长度

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

生成器:
函数内包含有yield关键字,
再调用函数,就不会执行函数体代码,拿到的返回值就是一个生成器对象
#生成器
def chicken():
print('--->first')
yield 1
print('-->second')
yield 2
print('-------->third')
yield 3
obj=chicken()
print(obj)
res=obj.__next__()
print(res)
res1=obj.__next__()
print(res1)
res2=obj.__next__()
print(res2)

生成器本身就是迭代器
iter_obj=obj._item_(),拿到迭代器
出发iter_obj._next_(),拿到该方法的返回值,赋给item
周而复始,真到函数内不在有yield,即取值完毕
for 会检测到stopiteration导常,结束循环

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

def chicken():
print('--->first')
yield 1
print('-->second')
yield 2
print('-------->third')
yield 3
obj=chicken()
print(obj)
res=obj.__next__()
print(res)
res1=obj.__next__()
print(res1)
res2=obj.__next__()
print(res2)

def my_range():
print('START..........')
n=0
while True:
yield n
n+=1
obj=my_range()

print(obj.__next__())
print(obj.__next__())

for i in obj:
print(i)

def my_range(start,stop,step):
n=start
while n<stop:
yield n
n+=step
for i in my_range(5,10,2):
print(i)

send用法,必须先初始化一次,让函数停在yield的位置
1、给yield传值
2、同_next_的功能
def eat(name):
print('%s ready to eat'%name)
while True:
food=yield
print('%s strart to eat %s'%(name,food))
dog1=eat('alex')
dog1.__next__()
dog1.send('11')
dog1.send('22')

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

优点:复杂的问题流程化,进而简单化
缺点:修改一个阶段,其他阶段都有可能需要做出修改,牵一发而动全身,即扩展性极差
应用:用于扩展性要求低的场景
原文地址:https://www.cnblogs.com/lg04551/p/8678232.html