zoukankan      html  css  js  c++  java
  • 推导式,生成器,迭代器

    推导式

    列表推导式

    不用推导式时,创建一个列表的操作:

    list_a = []

    for i in range(1,101):

      list_a.append(i)

    使用列表推导式:

    list_b = [i for i in range(1,101)]

    字典推导式

    用字典推导式时,创建一个字典的操作:

    a = "c='bi;p=153;s=0;id=d0;bd=123"

    dict_a = {i.split("=")[0]:i.split("=")[1] for i in a.split(";")}

    生成器

    在上面的推导式表达式中,我们可以看到,列表推导式的表达式是[],字典推导式的表达式是{},那么当推导式的表达式是()时,会得到什么结果呢?

    ()--我们称为生成器表达式,通过()表达式得到的结果是一个生成器对象

    如:

    generator_a = (i for i in range(1,11))

    generator_a就是一个生成器,我们可以通过list(generator_a)得到一个列表,通过tuple(generator_a)得到一个元组

    如果我们想从生成器里面取出一个元素,可以使用内置函数:next(genertaor_a),每次从上一次取出的元素位置往后再取出一个元素,如果生成器里的元素被取完了,那么会报错:StopIteration:

    除了()表达式来生成一个生成器外,还可以在函数中用一个关键字yield来得到一个生成器对象

    如:

    def func():

      yield 100

      print("hello world")

      yield 1001

      yield 100001

    res = func()

    上面函数如果没有yield这个关键字,那么res为None,因为函数没有return,

    那么像上面的函数一样有yield这个关键字的时候,res就是一个生成器对象,如上面的函数,我们如果想要得到值1001,那么我们可以这样做:

    1,先将生成器对象转化成列表或者元组:res_list = listlist(res)或者res_tuple = tuple(res),然后取下标值如:res_list[1]或者res_tuple[1]得到1001;

    2,使用next(res)方法先得到100,再使用一次next(res),就能得到1001了;

    方法2的原理是:生成器每执行一次next()方法都会在yield关键字那里停下,直到再调用一次next()方法后,它才会在上一次停下的位置重新运行,直到下一个yield关键字又停下,如果后面没有yield关键字了,还使用next()函数取值,那么就会报错:StopIteration;

    迭代器和可迭代对象:

    可迭代对象:可以通过for循环遍历的,都是可迭代对象;

    迭代器:实现了迭代器协议的可迭代对象

    生成器的作用:可以节约内存,提高性能

    迭代器

  • 相关阅读:
    聊聊es6中的解构
    JavaScript 中的面向对象编程
    TypeScript 中的类型保护
    7个你应该知道的 JavaScript 原生错误类型
    使用JavaScript策略模式校验表单
    nodejs如何解决高并发?
    nodejs核心模块有哪些?
    Dungeon Master
    Gold Balanced Lineup
    poj 2513Colored Sticks
  • 原文地址:https://www.cnblogs.com/lzh501/p/11298659.html
Copyright © 2011-2022 走看看