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

    回顾:

      函数的递归调用

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

      递归:

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

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

      二分法:

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

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

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

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

      三元表达式:

        结果一 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的内核,就是写好后不用去更改的场景

  • 相关阅读:
    Session的使用与Session的生命周期
    Long-Polling, Websockets, SSE(Server-Sent Event), WebRTC 之间的区别与使用
    十九、详述 IntelliJ IDEA 之 添加 jar 包
    十八、IntelliJ IDEA 常用快捷键 之 Windows 版
    十七、IntelliJ IDEA 中的 Maven 项目初体验及搭建 Spring MVC 框架
    十六、详述 IntelliJ IDEA 创建 Maven 项目及设置 java 源目录的方法
    十五、详述 IntelliJ IDEA 插件的安装及使用方法
    十四、详述 IntelliJ IDEA 提交代码前的 Code Analysis 机制
    十三、IntelliJ IDEA 中的版本控制介绍(下)
    十二、IntelliJ IDEA 中的版本控制介绍(中)
  • 原文地址:https://www.cnblogs.com/xinfan1/p/11190337.html
Copyright © 2011-2022 走看看