迭代器、生成器、面向对象

迭代器
  什么是迭代器()iterator
    器指的某种工具
    迭代指的是更新换代的过程,例如应用程序的版本更新从1.0变成1.1再1.2
    迭代的目的是要根据上一个结果,产生下一个结果,这是一个重要的过程,但不是单纯的重复
    迭代器就是,一种根据上一个结果得到下一个结果的工具,简单地说就是一种获取数据的工具
  可迭代对象
    指的就是可以使用迭代器取出数据的对象
    如何判断一个对象是否可迭代,就看这个对象是否提供迭代器,通过对象调用__iter__()来获取迭代器
  所有的容器类型(包括字符串)都是可迭代的
  迭代器的使用
    1.通过调用对象的__iter__()方法得到迭代器
    2.调用迭代器的__next__()的方法获取每一个值
  如何判断一个对象是不是迭代器?
    迭代是为了取值,取值使用next方法,那么只要对象具备next方法就称之为迭代器
    其中文件类型比较特殊,它既是迭代器,又是可迭代对象
  迭代器总结:
    迭代器是一种通用的取值工具
    只有具备__iter__()方法的对象才能被迭代器取值,称之为可迭代对象
    迭代器是为了取值,只要具备next方法的就是迭代器
    python中迭代器同时具备iter方法和next方法 调用iter将返回迭代器自身
    每一种数据类型内部的迭代器实现都各不相同
  为什么用迭代器
  统一取值方式
dic ={'a':1,'b':2,'c':3}
iter_dic=dic.__iter__()
print(iter_dic)#<dict_keyiterator object at 0x000001DB0E9D67C8>
print(iter_dic.__iter__() is iter_dic)#True

print(iter_dic.__next__())
print(iter_dic.__next__())
print(iter_dic.__next__())
print(iter_dic.__next__())#抛出异常StopIteration,或者说结束
有了迭代器后
iter_dic=dic.__iter__()
while True:
try:
k=next(iter_dic)
print(dic[k])
except StopIteration:
break
如何使用
for 循环
for k in dic:
print(dic[k])
for 循环的工作原理
  1.执行in后对象的dic_inter__()方法,得到一个迭代器对象inter__dic
  2.执行next(iter_dic),将得到的值赋值给k,然后执行循环体代码
  3.重复过程2,直到捕捉到异常StopIteration,结束循环
    要获取数据首先要有数据
    保存数据的方式有很多,如下

    目前每种数据类型,取值方式不统一这就有问题了,万一后续增加新的数据类型,还得学习新的取值方式
    每种类型还不同,最好的解决方案是:提供一种通用的取值方式使其可以搭配任何数据类型,
    msg=’hello word‘
    带有__开头__结尾的方法都是内置的特殊方法
生存器
generator
  生存数据的工具
  生成是从无到有的过程
  工具可以直接看成函数,我们可以自己定义一个函数来生成数据,但是每次执行
  函数都只能产生一次数
  生成器的目的就是可以多次不断的生成数据
  在python中生成器就是一个函数
  但是函数内部具备至少一个yield关键字
  反过来只要函数中出现yield那么该函数就是一个生成器
yield关键字
  一旦函数中出现了yield,调用函数时就不会立即执行函数体,并且会返回一个生成器对象
  当调用生成器的next方法时会执行函数体,但是如果执行期间遇到了yield函数就会暂停执行
  每一次调用next都是从上一次yield的位置继续往下执行,同时会将yield后的数据返回给调用者
yield与return的区别
  都能返回一个值
  不同之处在于return只返回一次值,只要执行return函数就整体结束了
  而yield可以返回多个值,并且会返回后将函数暂停住
  生成器就是迭代器
  生成器同时具备iter和next 函数,足以证明就是一个迭代器,所以直接使用for来遍历
  迭代器就是通过生成器实现的

迭代器,生成器,for之间的关系
  for的原理是使用迭代器取值
  迭代器是通过生成实现的

了解知识点
  yield的特殊用法
    当你的生成器中需要外界数据参与时生成器如何接受外界的数据
    闭包和参数都能传数据到生成器中,但是都只能接收一次值,如果想要多次传值就需要
  send函数用于向生成器发送数据,但是要注意必须先进行初始化,也就是先调用一次__next__()方法
def eater(name):
print('%s开始吃饭了'%name)
food_list=[]
while True:
food=yield food_list
print('%s吃了%s'%(name,food))
food_list.append(food)
chihuo=eater('sjh')
chihuo.send(None)#对于表达式形式的yield,在使用时,第一次必须传None,chihuo.send(None)等同于next(chihuo)
chihuo.send('排骨年糕')
chihuo.send('半熟芝士蛋糕')
迭代器?
  for循环的实现原理
  内部就是子啊获取迭代器,不断的调用next帮你到,知道没有值可取为止
  可迭代对象就是拥有iter的对象

生成器
  为了不断的产生数据
  迭代器就是通过生成器实现的
面向过程编程
  是一种编程的思想,同样的在编程界不知有这一种编程思想,还有面向对象编程
  编程思想没有高低之分,只有适合与不适合
  你要思考的是什么样的应用程序应该采用哪种编程思想

  核心在于过程,指的是在编程时时刻想着过程
  过程指的就是,第一步干什么第二步干什么,完成这个任务需要哪些步骤
  以及每个步骤要干什么
面向过程编程思想的优点与缺点
  优点:可以将一个复杂的大问题,拆分简单的小问题,将复杂的问题简单化,流程化。
  缺点:牵一发需要动全身,扩展性极差,正因如此,才有了新的编程思想,即面向对象
  使用场景:对于一些对罗战星不高的应用程序,建议采用面向过程,列如系统内核,shell脚本程序等等
        后期我们开发的应用程序大多都是直接面向用户的,需求变化非常繁琐,所以这时候就要用到面向对象




















原文地址:https://www.cnblogs.com/ShenJunHui6/p/10277268.html