zoukankan      html  css  js  c++  java
  • day13 生成器 三元运算 列表解析

    本质上来说生成器迭代器都是一种数据类型,如果你直接打印生成器是无法得出值的,会得到一串内存地址,即一个对象
    想要得到生成器的值必须要用for或者next,list等来获取


    生成器
    生成器就是一个可迭代对象
    本质上就是一种数据类型
    表现形式有两种
    生成器函数: 使用yield 代替 return,但是可以返回多次值
    调用之后函数内的代码不执行,返回生成器
    每从生成器中取一个值就执行一段,遇到yield就停止
    如何从生成器取值:
    for: 如果没有break就可一直取到最后
    next:每次取一个,首次使用时激活生成器
    send:不能用在第一个,取下个值会给上个位置传一个新的值
    数据类型强制转换: 会一次把所有的数据读到内存中
    生成器表达式
    (条件成立的放在生成器的值 for i in 可迭代的 if 条件)
      优点
    生成器延迟计算,一次返回一个值,大数据量处理很好用
    保存状态
    提高代码可读性

    基本的生成器函数
    1 def test():
    2     yield 1
    3     yield 2
    4     yield 3
    5 g = test()
    6 print(g)                # <generator object test at 0x00000000027F4E58>
    7 print(g.__next__())        # 1
    8 print(next(g))            # 2 
    生成器的一次性
    1 def test():
    2     for i in range(4):
    3         yield i
    4 t = test()
    5 t1 = (i for i in t)
    6 print(list(t1))        # [0, 1, 2, 3]  生成器是第一次性的。
    7 print(list(t1))        # []            生成器是第一次性的。再次使用就无法获取了
    迷惑操作
    1 def test():
    2     for i in range(4):
    3         yield i
    4 t = test()
    5 t1 = (i for i in t)
    6 t2 = (i for i in t1)    # 生成器在产生的时候,并不会有任何的操作
    7                         # 生成器是按需取值,因此一开始建立并没有使用,是无值的
    8 print(list(t1))         # [0, 1, 2, 3] 生成器被遍历使用了,才会被消耗掉
    9 print(list(t2))            # []
    生成器表达式
    1 laomuji = ("鸡蛋%s" % i for i in range(10)) # 生成器表达式
    2 print(laomuji)               # <generator object <genexpr> at 0x0000000002814E58>
    3 print(laomuji.__next__())   # 鸡蛋0
    4 print(next(laomuji))        # 鸡蛋1


    列表解析
    数据量比较大的时候不要用,很笨重

      原有的正常操作,比较多代码而且很啰嗦
    1 egg_list = []
    2 for i in range(10):
    3     egg_list.append("鸡蛋%s" %i)
    4 print(egg_list)
      使用列表解析后
    1 l = ["鸡蛋%s" %i for i in range(5) ]
    2 l1 = ["鸡蛋%s" %i for i in range(5) if i>2 ]
    3 # l2 = ["鸡蛋%s" %i for i in range(10) if i>5 else i] # 不存在4元表达式
    4 print(l)    # ['鸡蛋0', '鸡蛋1', '鸡蛋2', '鸡蛋3', '鸡蛋4']
    5 print(l1)    # ['鸡蛋3', '鸡蛋4']
    6 # print(l2)    # SyntaxError: invalid syntax

  • 相关阅读:
    webstorm 对 vue的设置
    chrome的adblock插件报DevTools failed to parse SourceMap
    textContent和innerText属性的区别
    心得体悟帖---200417(做人做事一定要有策略,人和人之间的交互都是博弈,对每个人本能的防御机制)
    心得体悟帖---200417(最坏的结局)
    心得体悟帖---200417(好好整理下外形,对提升信心特别有帮助)
    树莓派系统的常用的命令
    树莓派
    fastjson中转字符串时格式化、显示null值等
    JSONPath
  • 原文地址:https://www.cnblogs.com/shijieli/p/9705181.html
Copyright © 2011-2022 走看看