• 迭代器生成器


    回顾:

      函数的递归调用

        函数在调用阶段间接或直接又调用了自己

      递归:

        回溯:重复的过程,但每次重复过程后下一次重复的过程的问题的复杂度会减低,最终要有一个结束条件。

        递推:基于回溯的结果,一步一步往上推

      二分法:

        算法:高效率解决问题的方法

        二分法必须基于一个有顺序的容器类型

        判断某个值在不在容器里面

        每次截取上一次容器类型一半进行比较

      三元表达式:

        结果一 if 条件 else 结果二

        只有结果为2个可能性的情况下就可以用三元表达式

      匿名函数

        没有名字的函数

        关键字lambda

        lambda 形参:返回值

        1.当场定义当场调用

        (lambda 形参:返回值)()

        2.给匿名命名

        func = lanbda 形参:返回值

        func()

        3.匿名函数通常是配合其他函数一起使用的(内置函数,自定义函数)

      常见的内置函数

        max:内部基于for循环的,先一个一个将传入的容器类型的元素一个个取出,如果没有指定key(key对应着一个函数)那么就根据取出的元素一个个进行比较得出最大的值。如果指定了key,那么max会将元素交给这个函数,拿函数的返回值进行比较,但出来的结果还是传入的结果

        min:同上,求出最小值

        sum:求和

        map:映射关系,一个个成对应map(匿名函数,容器对象)

        filter:过滤

        zip:拉链,也是一一对应,返回出来的是一个元祖

        sorted:排序,里面可以指定rerverse=True可以使其反转,默认是False

        reduce:是将多个值变成一个值,reduce(匿名函数,对象,默认值)不指定默认值的话那么就拿容器的第一和第二个进行比较

    今日内容:

    迭代器:

      迭代:就是更新换代的过程,但迭代有个前提就是每次迭代都是基于上一次迭代的结果

      所以说迭代器就是重复过程的工具

      可迭代对象:

        内置有__iter__方法的对象就是可迭代对象

      迭代器对象:

        内置有__iter__方法和__next__方法的就是迭代器对象

      迭代器对象里面的调用__iter__方法得到的是自身,然后可迭代对象调用__iter__方法得到的结果就是迭代器对象

    count =0

    while count < 3:

      print(111)

      count+=1

    这个就可以说是一个迭代器

    迭代器对象调用__next__方法可以进行取值

    迭代器对象一定是可迭代对象,但可迭代对象一定不是迭代器对象

    迭代器优缺点:

    优点:不依赖索引取值,减少内存空间,不会内存溢出

    缺点:不能取出指定的元素,取完后会报错,需要try处理。

    特点:只能依次往后进行取值,不能后退

    迭代器的取值:

    ls = [1,2,3,4]

    iter_l = ls.__iter__() 生成一个迭代器对象

    print(iter_l.__next__())进行取值

    print(iter_l.__next__())

    print(iter_l.__next__())

    print(iter_l.__next__())

    print(iter_l.__next__()) 如果已经去完了就会报错stopiteration

    for 循环的本质:

    for循环的in后面的跟着的是一个可迭代对象

    for循环执行的步骤:

      1.将in后面的可迭代对象执行__iter__方法转换成迭代器对象

      2.调用__next__方法进行迭代取值

      3.进行异常处理

    生成器:

      其本质上也是一个迭代器,但是一个自定义的迭代器。

      其内部有yield的关键字

      如果在函数内部有yield关键字,那么这个函数在函数名加括号调用的时候,不会执行其函数体代码,会将其转换成一个生成器,这也可以说是,生成器初始化,将函数变成一个迭代器

    例子:

    def func():
        print('2222')
        yield
        print('33333')
        yield
        ..........
    
    
    res = func()生成器初始化

    这样在res.__next__()就可以进行取值,但会返回一个None,yield后面可以跟值,yield后面跟的值,就是调用__next__()获取到的您可以得到的值。

    yield后面可以跟多个值,返回的会打包成一个元祖。

    另外yield会暂停函数的运行状态。

    yield表达式:

    yield支持外界传参
    def dog(name):
        print('%s 准备开吃'%name)
        while True:
            food = yield
            print('%s 吃了 %s'%(name,food))
    
    
    g = dog('owen')
    g.__next__()  #必须将代码运行至yield才能够为其传值
    然后用关键字send从外界为其传值
    g.send('火腿')  #给yield的左边变量传参,触发了__next__方法
    g.send('大鸡腿')

    yield总结:

      1.能够将自定义的函数变成一个生成器,提供了一种自定义生成器的方式

      2.yield能够将函数的运行状态给暂停住

      3.能够支持外界给其传参,关键字send

      4.yield可以有返回值

    与return的异同点:

    相同之处:都有返回值,并能够返回多个值

    不同点:yield能够暂停函数的运行状态,并且yield可以返回多次值,但return只能返回一次值,并且立即结束函数。yield可以有外界进行传参

    内置函数:

    chr():是将数字转为ascill表对应的字符

    ord():是将字符转为ascill表对应的数字

    div():是返回当前对象名称空间的里面的可调用的名字

    divmod()是分页器

    callable()是可以判断是不是一个可调用(加括号可以执行其相应的功能)的对象

    all()里面的对象只要有一个为False那么将为false

    any()里面的对象只要有一个为true,那么就都为true

    help()查看对象里面的注释内容

    exec():字符串执行python代码,支持多行,并且只要是支持python语法的都能够被执行,并且会将执行代码过程中产生的名字放入某个名称空间里面

    eval():字符串执行python代码,但不支持语法,只能做简单的表达式

    isinterance判断对象是不是什么类型(object,类型)

    str()转为字符串

    int()转为整型

    面向过程概念:

    面向过程就是一条流水线式的写代码,就是先干这个在干那个,一步一步往下面走。

    优点:就是将复杂的问题流程化,将其简单化了

    缺点:可扩展性低,若果后期要加功能,那么的话又要重新来编辑,复用性低,维护性低。

    建议是在写好不用去更改的场景下去使用面向过程,如linux的内核,就是写好后不用去更改的场景

  • 相关阅读:
    兼容IE的滚动条自定义样式
    vue从入门到开发--4--处理http请求
    vue从入门到开发--3-基础语法
    Oracle 扩容表空间
    Oracle 整库备份还原
    Oracle 相关命令
    更改mysql数据库根目录
    关于文件系统
    挂载iscsi存储
    挂载nfs存储
  • 原文地址:https://www.cnblogs.com/xinfan1/p/11190337.html
Copyright © 2020-2023  润新知