• chapter3.4解析式、生成器


    解析式

    列表解析

        eg: new = [(i+1)**2 for i in range(10)]

    语法

      [返回值 for 元素 in 可迭代对象 if条件]

      中括号[],内部for循环,if条件语句可选。返回元素是返回的元素,使用print返回的是None。不要使用冒号  ':'

      返回新列表
    列表解析式是一种语法糖
      编译器会优化,不影响效率。减少程序员工作量,减少出错。简化代码,可读性增强


    构造新列表

    [expr for item in iterable if cond1 if cond2]

    if 两层是可以使用and代替的

    打印20以内的偶数同时也是3的倍数

    [i for i in range(1,20) if not i % 2 if i % 3 == 0]
    
    [i for i in range(1,20) if not i % 2 and i % 3 == 0]

      以上两个的效果相同

    [(x,y) for x in 'abcde' for y in range(3)]
    [[x,y] for x in 'abcde' for y in range(3)]
    [{x,y} for x in 'abcde' for y in range(3)]

    以上三条都会生成12个元素,注意列表内生成的每一个元素是集合的话,不会互相影响,

    for 循环两层可以先判断第一个,再判断第二个

    [(i,j)for i in range(7) if i>4 for j in range(16,22) if j>18]
    [(i,j)for i in range(7) for j in range(16,22) if i>4 if j>18]

    以上两个都可以运行,但将代码块分开可以看出,第一个先判断 i 再循环 j ,第二个先循环两个,再判断,顺序不同

    列表解析式可以理解为依次缩进的代码块,一旦有elif,else就不能用

    生成器表达式

    语法

      (返回值 for 元素 in 可迭代对象 if条件)

      列表解析式的括号变成小括号

      返回生成器

    generator object

    生成器表达式 :按需计算,惰性求值、延迟计算,列表解析式立即返回值

    生成器是可迭代对象,但迭代器不一定是生成器,都是可迭代对象
    生成器是由生成器表达式形成

    生成器

      可迭代对象  iterable
      迭代器  iterator

    生成器,不能反复迭代,拨一下转一下,不能求长度len

    生成器是可迭代对象,迭代时超界就结束

    next() 返回下一个值,到尾部就返回stopIteration,可以试出是否为生成器,next后只能放迭代器

    iter(lst)   生成迭代器,将列表转换为迭代器

    和列表解析式对比

    计算方式  生成器表达式延迟计算,列表解析式立即计算

    内存占用  列表占内存,取速度块,返回新列表。  生成器节省空间,如果函数复杂,取较慢,要一个一个来,合起来比较时间相近。

    计算速度  从产生时间看,列表速度慢于生成器的速度。生成器没有长度,只是一个对象,生成器不反回值,返回一个对象,

    集合解析式
    {返回值 for 元素 in 可迭代对象 if 条件}

    不可放不可hash的元素,立即返回一个集合

    字典解析式

    {返回值 for 元素 in 可迭代对象 if 条件}

    使用key:value形式输入

    立即返回一个字典

    for 的循环 注意  key的值会在相同时,覆盖之前的值value

    py2引入列表解析式
    py2.4引入生成器表达式
    py3引入集合,字典解析式,并迁移到2.7

    多用解析式,简单,高效
    如果解析式太复杂,可以考虑拆解

    生成器是可迭代对象,但迭代器不一定是生成器
    生成器是由生成器表达式形成

  • 相关阅读:
    10分钟学会理解和解决MySQL乱码问题
    C# 序列类为 xml 可以使用的特性大全
    C# GUID ToString
    C# GUID ToString
    C# AddRange 添加位置
    C# AddRange 添加位置
    VisualStudio 使用多个环境进行调试
    VisualStudio 使用多个环境进行调试
    C# 使用外部别名
    C# 使用外部别名
  • 原文地址:https://www.cnblogs.com/rprp789/p/9493453.html
Copyright © 2020-2023  润新知