• 【python笔记】第十一节 生成器和迭代器


    💕💕💕 博主昵称:摆烂阳💕💕💕

    🥰博主主页跳转链接
    👩‍💻博主研究方向:web渗透测试 、python编程
    📃 博主寄语:希望本篇文章能给大家带来帮助,有不足的地方,希望友友们给予指导

    一、递归函数

    递归:如果一个函数内部调用了自己那么就叫递归。

    def f():
        print("你好,我叫aa")
        f()
    f()
    
    • 1
    • 2
    • 3
    • 4

    1.如果要定义递归函数,必须要有出口,因为无限递归会导致内存溢出
    2.设计一个出口,不断的向出口接近

    def f(x):
        print("你好,我叫aa")
        if x == 10:
            return  # 结束函数
        f(x + 1)
    
    
    f(1)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    案例:求987654321 的结果,就是9的阶乘

    n! = n * (n-1)!
    
    9的阶乘 = 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1
    9的阶乘 = 9 * 8!
    8的阶乘 = 8 * 7!
    7的阶乘 = 7 * 6!
    6的阶乘 = 6 * 5!
    5的阶乘 = 5 * 4!
    4的阶乘 = 4 * 3!
    3的阶乘 = 3 * 2!
    2的阶乘 = 2 * 1!
    
    f(x) = x * f(x-1) # 阶乘公式
    
    
    def f(x):
        if x == 1:
            return 1
        return x * f(x - 1)
    print(f(5))
     f(5) = 5 * f(4)
          5 * 4 * f(3)
          5 * 4 * 3 * f(2)
         5 * 4 * 3 * 2 * f(1)  # f(1) = 1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    二、生成器

    在 Python 中,使用了 yield 的函数被称为生成器(generator)。跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。 在调用生成器运行的过程中,每次遇到yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next () 方法时从当前位置继续运行。

    生成器:相当于存储一种厨师

    # s = [x for x in range(10000000)]
    
    f = (x for x in range(10))
    
    print(next(f)) # 输出f的第1个值
    print(next(f)) # 输出f的第2个值
    print(next(f)) # 输出f的第3个值
    ....
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    一次性做出所有菜

    for i in f:
        print(i)
    
     
    
    def f():
        print("f1")
        yield 1  # 挂起
        print("f2")
        yield 2  # 挂起
    
    def g():
        print("g1")
        yield 1
        print("g2")
        yield 2
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    可以使用生成器 多个任务 交叉执行

    g1 = f()
    g2 = g()
    next(g1)
    next(g2)
    next(g1)
    next(g2)
    # f1 g1 f2 g2
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    生成器的两种创建方式

    1.(i for i in range(1,10))
    2.yiled 关键字实现

    def f():
        print("f1")
        yield 1  # 挂起
        print("f2")
        yield 2  # 挂起
        print("f3")
        yield 3
    g = f()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    迭代遍历的本质:

    不断通过 i = next(g)

    for i in g:
        print(i)
    
    • 1
    • 2

    for i in 可迭代对象

    从现象来说,只要是可以for循环的都是可迭代对象
    从本质来说,是内置有iter方法的是可迭代对象

    能for循环是因为有一个__iter__()方法
    可迭代对象:对象拥有iter方法的

    三、迭代器

    在Python中,迭代器是遵循迭代协议的对象。 使用iter ()从任何序列对象中得到迭代器(如 list, tuple, dictionary, set 等)。

    生成器就是迭代器

    迭代器需要满足两个条件:

    1.有iter方法
    2.有next方法

    l = [1,2,3,4]
    l.__iter__()
    iter(l) # 本质上就是  l.__iter__()
    
    iter : 返回一个迭代器对象
             
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    for循环内部本质3个事情

    1.调用可迭代对象的iter方法返回一个迭代器
    2.不断调用迭代器的next方法
    3.处理异常

    本章小结

    本文是本人以前笔记,博主主页跳转链接
    如果有哪里不对的话欢迎各位大佬指出问题,本人也是初学python,希望可以和各位朋友一起学习进步。

    点击跳转到博主python专栏:
    如果有喜欢web安全的朋友,请在web渗透专栏中进行查看
    点击跳转到博主web渗透专栏

  • 相关阅读:
    java设计模式---策略模式
    Win Go开发包安装配置、GoLand配置
    Ubuntu下 Docker、Docker Compose 的安装教程
    apifox使用文档之环境变量 / 全局变量 / 临时变量附apifox学习路线图
    ESP8266-Arduino网络编程实例-Web页面调节LED(基于PWM)
    MySQL-索引详解
    git-命令行显示当前目录分支
    [STL]map与set
    产品代码都给你看了,可别再说不会DDD(三):战略设计
    为什么各大厂自研的内存泄漏检测框架都要参考 LeakCanary?因为它是真强啊!
  • 原文地址:https://blog.csdn.net/qinshuoyang1/article/details/126475712