zoukankan      html  css  js  c++  java
  • 迭代器

    一、迭代器

    什么是迭代器?

    迭代:更新换代(重复)的过程,每次的迭代都必须基于上一次的结果

    迭代器:迭代取值的工具

    为什么要用

    迭代器给你提供了一种不依赖于索引取值的方式

    1 l = [1,2,3,4,5]
    2 n = 0
    3 while n < len(s):
    4         print(s[n])
    5         n += 1

    需要迭代取值的类型:

    字符串、列表、元组、字典、集合

    二、可迭代对象

    只有内置有__iter__方法的都叫做可迭代对象

    基本数据类型中是可迭代对象的有:str、list、tuple、dict、set

    文件对象(执行内置的__iter__之后还是本身,没有任何变化):文件对象本身就是迭代器对象。

    三、迭代器对象

    1.内置有__iter__方法

    2.内只有__next__方法

    ps:迭代器一定是可迭代对象

    而可迭代对象不一定是迭代对象

     1 l = [1,2,3,4]
     2 
     3 iter_l = l.__iter__()
     4 
     5 #迭代器取值 调用__next__
     6 
     7 print(iter_l,__next__())
     8 
     9 print(iter_l,__next__())
    10 
    11 #如果值取完了再想获取,就直接报错了

    与前面不同的是,文件打开本身就有迭代。

    文件打开过程:f1 = open('xxx.txt','r',encoding = 'utf-8')

    调用f1内置的__iter__方法

    iter_f = f1.__iter__()

    PS:迭代器对象无论执行多少次__iter__方法得到的还是迭代器对象本身

    为了防止报错,我们针对这个报错功能有一个异常处理:

    1 d = {'name':'jason','password':'123','hobby':'泡m'}
    2 iter_d = d.__iter__()
    3 while True:
    4     try:
    5         print(iter_d.__next__())
    6     except StopIteration:
    7         print('无法再获取更多')
    8         break

    迭代器取值特点:只能一次往后取值,不能后退

    四、for循环内部的本质

    1.将in后面的对象调用__iter__转换成迭代器对象

    2.调用__next__迭代取值

    3.内部有异常捕获StopIteration,当无法再取值时,自动结束循环。

    可迭代对象:内置有__iter__方法

    迭代器对象:既内置有__iter__方法也内置有__next__方法

    迭代取值优缺点:

    优点:1.不依赖于索引值

               2.内存中永远只占一份空间,不会导致内存溢出

    缺点:1.不能够获取指定的元素

               2.取完之后会报StopIteration错

    五、生成器

    生成器:用户自定义的迭代器,本质就是迭代器

     1 def func():
     2     print('first')
     3     yield 666 #函数内部如果有yield关键字,那么加括号执行时,并不会触发函数代码题的运行
     4     print('second')
     5     yield 777
     6     print('third')
     7     yield 888
     8     print('forth')
     9     yield 999
    10     yield
    11     yield
    12 #yield后面跟的值就是调用迭代器__next__方法你能得到的值
    13 #yield既可以返回一个值也可以返回多个值,并且多个值也是按照元组的形式返回
    14 g = func() #生成器初始化,将函数变成迭代器
    15 print(g)
    16 print(g.__next__())
    17 print(g.__next__())
    18 print(g.__next__())
    19 print(g.__next__())
    20 print(g.__next__())
    21 print(g.__next__())

    自制range方法:

    def my_range(start,end,step=1):
        while start < end:
            yield start
            start += step
    
    for i in my_range(1,20,2):
        print(i)

    yield 支持外接为其传值:

    def dinner(name):
        print('%s开始吃'%name)
        while True:
            food = yield
            print('%s吃了%s'%(name,food))
    g = dinner('jason')
    g.__next__() #必须先将代码运行至yield,才能够为其传值
    g.send('海底捞') #给yield左边的变量传参,触发了__next__方法
    g.send('黄焖鸡米饭')

    yield

    1.帮你提供了一种自定义生成器方式

    2.会帮你将函数的运行状态暂停住

    3.可以返回值

    比较return与yield之间的异同点:

    相同点:都可以返回值,而且都可以返回多个值

    不同点:1.yield可以多次的返回值,而return只能返回一次后终止函数

                  2.yield还可以接受外部传入的值

    生成器表达式:

    res = (i for i in range(1,10) if i !=4)
    print(res)

    生成器不会主动执行任何一行代码,必须通过__next__触发代码的运行。

    六、常用内置方法

    1.abs()绝对值

    print(abs(-11))

    2.all()  any()

    1 l = [0,1,2]
    2 print(all(l)) #只要有一个为Falese就返回False
    3 print(any(l)) #只要有一个位是True就返回True

    3.globals() local()

    globals():返回全局变量

    local():返回局部变量,要在局部中使用

    4.callable()

    判断是否可调用

    1 l = [1,2,3]
    2 def index():
    3     pass
    4 print(callable(l))
    5 print(callable(index))

    5.chr() ord()

    chr():将数字转换成ascii码表对应的字符

    ord():将字符按照ascii码表转换成字符对应的数字

    6.dir()

    获取当前对象空间里面的名字

    7.divmod()分页器

    1 total_num,more = divmod(1000,12)
    2 if more:
    3     total_num+=1
    4 print('总页数:',total_num)

    8.enumerate枚举

    1 l = ['a','b']
    2 for i,j in enumerate(l,1):
    3     print(i,j)

    9.eval() exec()

    识别字符串中的代码,并执行。但是eval不支持逻辑代码,只支持一些简单的python代码

    10.isintance()

    isintance后面统一该方法判断对象是否属于某个数据类型

    1 n = [1,2,3,4]
    2 print(isinstance(n,list))

    11.pow()

    print(pow(2,3))

    即计算2的3次方的结果

    12.round对数字进行四舍五入

    print(round(3.35))

    七、面向过程编程

    面向过程编程:就类似于设计一条流水线

    好处:将复杂的问题流程化,从而变得简单

    坏处:可扩展性差,一旦需要修改,整体会受到影响

     

     

     

     

  • 相关阅读:
    基于Delphi的三层数据库系统的实现方法
    用数据表创建树_delphi教程
    多层数据库开发十三:剖析几个数据库应用程序
    多层数据库开发十二:使用数据控件
    多层数据库开发九:查询数据库
    第十一章 TClientDataSet
    用python做线性规划
    Python-sympy科学计算与数据处理(求极限及其它功能)
    Python-sympy科学计算与数据处理(方程,微分,微分方程,积分)
    Python-sympy科学计算与数据处理(数学表达式)
  • 原文地址:https://www.cnblogs.com/spencerzhu/p/11191843.html
Copyright © 2011-2022 走看看