zoukankan      html  css  js  c++  java
  • 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')

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

    优点:复杂的问题流程化,进而简单化
    缺点:修改一个阶段,其他阶段都有可能需要做出修改,牵一发而动全身,即扩展性极差
    应用:用于扩展性要求低的场景
  • 相关阅读:
    GNU C的定义长度为0的数组
    Ubuntu如何启用双网卡
    DQN 文章第一篇
    awk用法
    Linux下C结构体初始化
    Linux kernel中的list怎么使用
    从美剧中学(1)
    Python @property 属性
    p40_数据交换方式
    3.TCP协议
  • 原文地址:https://www.cnblogs.com/lg04551/p/8678232.html
Copyright © 2011-2022 走看看