zoukankan      html  css  js  c++  java
  • 第十一天:迭代器,生成器,面向过程的编程

    1.迭代器:迭代的工具
    什么是迭代?
    迭代是一个重复的过程,并且每次重复都是基于上一次的结果而来

    2.想要了解迭代器是什么?必须先了解一个概念,即什么是可迭代对象?

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

    举个列子:
    str='hello'

    list=[1,2,3]
    tup=(1,2,3)

    dic={'x':1}
    set={'a','b','c'}
    f=open('a.txt','w',encoding='utf-8')

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

    举两个列子:

    dic={'x':1,'y':2,'z':3}

    iter_dic=dic.__iter__()

    print(iter_dic.__next__())

    print(iter_dic.__next__())

    print(iter_dic.__next__())

    (只能输出三次,第四次报错,值已经被取完了)

    s1={'a','b','c'}

    iter_s1=s1.__iter__()
    print(iter_s1.__.next__())

    print(iter_s1.__.next__())

    print(iter_s1.__.next__())

    4.可迭代的对象对比迭代器对象?

    可迭代对象:str list tuple dict set file 

    1.获取可迭代对象的方式:无需获取,python 内置 str list tuple dict set file都是可迭代器的对象

    2.特点:

    内置有__iter__方法的都叫可迭代的对象,执行该方法会拿到一个迭代器对象

    迭代器对象:文件对象本身就是可迭代器对象

    1.获取迭代器对想的方式:

    执行可迭代对象的__iter__方法,拿到的返回值就是迭代器对象

    2.特点:

    内置有__next__方法,执行该方法会拿到迭代器对象的一个值

    内置有__iter__方法,执行该方法会拿到迭代器本身

    举个列子:

    # x='hello'
    # iter_x=x.__iter__()
    # iter_x.__next__
    # print(iter_x.__iter__()is iter_x)true迭代器对象执行__iter__方法得到的是迭代器本身
    # print(iter_x)<str_iterator object at 0x102240630>
    # print(iter_x.__iter__())<str_iterator object at 0x102240630>


    文件本身就是迭代器对象(f.__next__())

    3.迭代器的优缺点分析:
    3.1迭代器的优点:
     提供了一种可不依赖于索引的取值方式
     更加节省内存
    3.2迭代器缺点:
       取值麻烦,只能一次取一个,只能往后取

       并且是一次性的,无法用len获取长度

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

    l=open('a.txt','r',encoding='utf-8')

    for line in  l:

    print(line)

    for item in {'x':1,y:'2'}:
    print(line)

    二.生成器

    函数内包含有yield的关键字
    再调用函数,就不会执行函数体代码,拿到的返回值就是一个生成器对象

    def chicken()
       print('=====>first')

       yield 1

       print('=====>'sencond')
       yield 2

    obj=chicken()

    print(obj)

    生成器本质就是迭代器,也就是说生成器的玩法其实就是迭代器的玩法
    print(obj.__iter__()is obj)

    res=obj.__next__()

    print(res)

     1、iter_obj=obj.__iter__(),拿到迭代器

    2、出发iter_obj.__next__(),拿到该方法的返回值,赋值给item
    3、周而复始,直到函数内不在有yield,即取值完毕
    4、for会检测到StopIteration异常,结束循环
    for item in obj:
    print(item)

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

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

     obj=my_range()

     print(obj)

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

    for i in my_range():

    print(i)


    def my_range(start,stop,step=1):
    n=start
    while n < stop:
    yield n #yield 4
    n+=step #5

    三.面向过程的编程思想
        核心是‘过程’二字,过程即解决问题的关键,即先干什么,再干什么

        基于面向过程编写程序就好比在设计一条流水线,是一种机械方式的思维方式
    总结优缺点:

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

  • 相关阅读:
    MapInfo 文件格式说明
    一个经典编程面试题的“隐退”
    Polar 投影c#版本移植
    关于 tf.nn.softmax_cross_entropy_with_logits 及 tf.clip_by_value
    系列解读Dropout
    python删除所有的中文字符、非ASCII或非英文字符,检查字符串是否包含非ASCII
    Python使用split使用多个字符分隔字符串
    Convolutional Neural Networks for Visual Recognition
    【TensorFlow】tf.nn.conv2d是怎样实现卷积的?
    [TensorFlow] tf.nn.softmax_cross_entropy_with_logits的用法
  • 原文地址:https://www.cnblogs.com/shengg/p/8681322.html
Copyright © 2011-2022 走看看