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循环遍历的,都是可迭代对象;

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

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

    迭代器

  • 相关阅读:
    120所国家重点建设大学(211工程和教育部直属)[国家一类本科大学]详细情况一览表
    VC画线几个常见方法
    中国地学35个国家重点实验室分布一览
    可执行文件加入Linux默认路径的办法
    SVN 常用命令 客户端
    ls(list) linux 功能说明
    Vim
    Linux添加FTP用户并设置权限
    tar [cxtzjvfpPN] 文件与目录
    linux etc/passwd 有关
  • 原文地址:https://www.cnblogs.com/lzh501/p/11298659.html
Copyright © 2011-2022 走看看