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

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

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

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

  • 相关阅读:
    Object-C,NSSet,不可变集合
    NYIST 860 又见01背包
    NYIST 1070 诡异的电梯【Ⅰ】
    HDU 1542 Atlantis
    HDU 4756 Install Air Conditioning
    CodeForces 362E Petya and Pipes
    HDU 4751 Divide Groups
    HDU 3081 Marriage Match II
    UVA 11404 Palindromic Subsequence
    UVALIVE 4256 Salesmen
  • 原文地址:https://www.cnblogs.com/shengg/p/8681322.html
Copyright © 2011-2022 走看看