• python中的生成器


    前言

    列表推导式

    列表推导式可以帮助我们快速得到一个我们需要的列表

    得到一个1到20的列表

    1. a = [x for x in range(1,21)]
    2. print(a)

    [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]

    得到一个1到20内的偶数列表

    1. a = [x for x in range(1,21) if x%2 == 0]
    2. print(a)

    [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]

    得到九九乘法表

    1. a = [x*y for x in range(1,10) for y in range(1,10)]
    2. print(a)

    [1, 2, 3, 4, 5, 6, 7, 8, 9, 2, 4, 6, 8, 10, 12, 14, 16, 18, 3, 6, 9, 12, 15, 18, 21, 24, 27, 4, 8, 12, 16, 20, 24, 28, 32, 36, 5, 10, 15, 20, 25, 30, 35, 40, 45, 6, 12, 18, 24, 30, 36, 42, 48, 54, 7, 14, 21, 28, 35, 42, 49, 56, 63, 8, 16, 24, 32, 40, 48, 56, 64, 72, 9, 18, 27, 36, 45, 54, 63, 72, 81]

    列表生成器

    列表生成器的语法与列表推导式的语法很相似,只需要将[ ]换成()

    语法:( i for i in range(1,10))

    它返回的是对象

    1. a = (i for i in range(1,7))
    2. print(a)

    at 0x0000013F8FB0DB30>

    因此我们想要拿到其中的元素需要使用next()

    next()相当于一个指针,并且不会回退直到抛出异常

    1. a = (i for i in range(1,7))
    2. print(next(a))
    3. print(next(a))
    4. print(next(a))
    5. print(next(a))
    6. print(next(a))
    7. print(next(a))
    8. print(next(a))

    1
    2
    3
    4
    5
    6
    Traceback (most recent call last):
      File "E:\PyCharm\python\text.py", line 8, in
        print(next(a))
    StopIteration

    Process finished with exit code 1

    生成器函数

    普通函数:

    1. #斐波那契数列
    2. def febonacci(num):
    3. a = []
    4. index = 0
    5. first = 1
    6. second = 1
    7. while index < num:
    8. a.append(first)
    9. first,second = second,first+second
    10. index += 1
    11. print(a)
    12. if __name__ == "__main__":
    13. febonacci(10)

    [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]

    生成器函数:

    1. #斐波那契数列
    2. def febonacci(num):
    3. index = 0
    4. first = 1
    5. second = 1
    6. while index < num:
    7. yield first
    8. first,second = second,first+second
    9. index += 1
    10. if __name__ == "__main__":
    11. res = febonacci(10)
    12. i = 0
    13. while i < 10:
    14. i += 1
    15. print(next(res))

    1
    1
    2
    3
    5
    8
    13
    21
    34
    55

    具有 yield 关键字的函数被直接调用的时候,函数本身不会被调用,而是将函数转换为生成器进行返回, 调用的时候需要使用next ()
    yield 的作用
    具有 return 的功能,返回函数值并且记住上一次的位置,再次执行的时候从上一次结束的位置开
    生成器:当一个函数出现 yield 的时候,那么这个函数在被调用的过程中返回的是一个对象

  • 相关阅读:
    Vue iview form表单验证失效
    Nginx服务之Rewrite
    阻塞队列BlockingQueue
    【Android】【实践】
    k8s的服务Service暴露应用
    国标视频融合云平台EasyCVR视频汇聚平台关于远程控制的详细介绍
    OpenGL ES EAGLContext 和 EGLContext
    实现Object.create()
    记录一个困难
    【JDBC Part 1】概述、获取连接、CRUD
  • 原文地址:https://blog.csdn.net/Thewei666/article/details/126919275