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

    '''
    通过列表推导式,可以直接创建一个列表
    但是受到内存的限制,列表的容量肯定是有限的
    那么现在我们要创建一个100W元素的列表,应该用一个什么方法
    如果列表的元素可以推理出来,用到哪里推到哪里,不断释放资源就不会浪费内存
    这样就不需要创建一个完整的列表
    一边循环一遍创建的方式就是生成器
    '''

    # 得到生成器的方式有几种:
    # 1.通过列表推导式 [x for x in range(1000000000000)] ,[x for x in range(10000) if x%3 = 0]这种的不算
    # 得到生成器generator 把方括号变成小括号 a = (x for x in range(10000) if x%3 = 0) 这种就行
    # 那么如何取出里面的元素?需要的时候帮你产生一个
    # (1)print(a.__next__()) 不参加参数的话就是调用一次,也就是产生一次
    # (2)用系统自带的next next(a) 这种方式也可以
    # 但是如果是(1)和(2)里面结合的话 就是都可以使用 ,但是也是有一次算一次,不会因为重新用了新方法而从头开始
    # 如果调用的次数超过异常的那么可以用try 和 except 来进行
    # 在可能产生异常的代码 进行try处理

    # 2.借助函数完成
    # 斐波那契函数
    # 只要函数中出现了yield那么就是一个生成器了
    # def func():
    # n = 0
    # while True:
    # n += 1
    # yield n # 这个yield 是一个关键,告诉底层这是一个生成器
    '''
    步骤:
    1.定义一个函数,函数中使用yield关键字
    2.调用函数,接受调用的结果
    3.得到的结果就是生成器
    4.借助__next__() 和next()
    yield = return n + 暂停
    '''

    # 斐波那契函数:
    # def fib(length):
    # a, b = 0, 1
    # n = 0
    # while n < length:
    # yield b
    # a, b = b, a + b
    # n += 1
    # return 'ab' 这一行的作用就是在生成器没有更多的产生的时候就会return这个值,以报错信息的方式告我们的

    # g = fib(10)
    # print(g)
    # print(next(g))
    # print(next(g))
    # print(next(g))
    # print(next(g))
    # print(next(g))
    # print(next(g))
    # print(next(g))


    # def gen():
    # i = 0
    # while i < 5:
    # temp = yield i
    # print('temp:',temp)
    # i+=1
    # return '没有更多的了'
    #
    # g = gen()
    # print(next(g))
    # print(next(g))
    # print(next(g))
    # g.send(None)
    # g = g.send('哈哈')
    # print(g)

    '''
    生成器方法:
    __next__():获取下一个元素
    send(value):获得下一个元素,同时可以往里面送数据 注意:第一次调用必须传一个空值
    '''

    # 携程(进场---线程----携程)
    # 迅雷下载的时候 默认是开十个线程
    def task1(n):
    for i in range(n):
    print('正在搬砖第{}块'.format(i))
    yield None
    def task2(n):
    for i in range(n):
    print('正在听第{}歌'.format(i))
    yield None

    g1 = task1(10)
    g2 = task2(10)

    for i in range(10):
    g1.__next__()
    g2.__next__()

  • 相关阅读:
    Codeforces 1255B Fridge Lockers
    Codeforces 1255A Changing Volume
    Codeforces 1255A Changing Volume
    leetcode 112. 路径总和
    leetcode 129. 求根到叶子节点数字之和
    leetcode 404. 左叶子之和
    leetcode 104. 二叉树的最大深度
    leetcode 235. 二叉搜索树的最近公共祖先
    450. Delete Node in a BST
    树的c++实现--建立一棵树
  • 原文地址:https://www.cnblogs.com/SmartCat994/p/12306924.html
Copyright © 2011-2022 走看看