Skip to content

Latest commit

 

History

History
290 lines (215 loc) · 7.52 KB

179-255133-[专业选修]集合推导式_set_comprehension.sy.md

File metadata and controls

290 lines (215 loc) · 7.52 KB
show version enable_checker
step
1.0
true

集合推导式

回忆

  • 这次研究了列表推导式
  • 列表推导式是一种语法糖
  • 我们至少要能看得懂这颗语法糖
    • 可以对于推导项进行筛选
    • 可以对于推导结果进行筛选
    • 可以进行二重推导
    • 也可以把两个推导复合到一起
  • 所有列表推导式都可以写成原始的 for 语句的形式
  • 除了列表可以推导之外
  • 其他的数据结构可以进行推导么?
    • 序列类的有列表推导式
    • 集合类的有 set 推导式么?🤔
    • 映射类的有 dict 推导式么?🤔

回忆

图片描述

  • 这个就是最基本的列表推导式
  • 推导出来的东西是一个列表
  • 这个列表有什么用呢?
  • 我们看一个例子

国王、棋盘、大米

图片描述

  • 这个大家应该都听说过
  • 第一个格子放 1
    • 然后成指数级增长
    • 2 4 8...
  • 不知道最后整个棋盘上到底有多少大米
  • 我想算算

传统做法

sum = 0
for i in range(8*8):
    sum += 2**i
print(sum)
  • 得到结果是 18446744073709551615
  • 一粒米有 0.0167g
    • 合 1.67*10-2g
    • 合 1.67*10-5kg
    • 合 1.67*10-8t
  • 最终重量 308060626030.9495 吨
    • 合 3.1*1011
  • 现在世界年产量 5.1850*108
  • 数量级差 103
  • 也就是说 1 千年世界上所有的粮食差不多才够
  • 难怪国王最后杀了他
  • 人心惟危啊
  • 这个东西如果用列表推导式应该如何呢?

result = sum([2**rice for rice in range(8*8)])
print(result)
  • 看起来确实容易理解
  • 也容易编写
  • 所以这就是语法糖

图片描述

  • 嗜糖的危害非常大
    • 皮肤衰老
    • 心脏病
    • 骨质疏松
    • 从上到下毁全身
  • 可是不吃糖也不行
  • 人人都语法糖
  • 不吃糖以后代码都看不懂了
  • 怎么办呢?

平衡

图片描述

  • 人心惟危
    • 人心对应主观
    • 每个人都有自己的看法
    • 都是在自己原来的意识之上的
    • 层层叠叠的个人主观经验观察点非常高
  • 道心惟微
    • 道心对应客观
    • 是现实世界中的微妙变化
    • 在理性和逻辑描绘不到的微小地方
  • 惟精惟一
    • 只有非常警觉才能保持主客观的一致
    • 认知正确只是在一定时间空间范围内的
    • 继续保持警觉才能继续保证主客观相符合
  • 允执厥中
    • 找到主客观中的平衡感
    • 在研究中的变化的过程中
    • 可以灵活应变
    • 但始终要保持主客观的符合

克制

图片描述

  • 吃糖是没有够的
  • 语法糖越来越多
  • 表面上越来越好理解
  • 其实不如就那么几招容易
  • 为什么 CISC 不容 RISC
  • 其实关键还是基本功
  • 那这个糖是怎么添加到 python 语法中的呢?

list Comperhension

  • 这个语法糖来自于 pep202
  • 在 2000 年 7 月 13 号的时候 Barry 提出的

图片描述

  • pep 的意思是 python enhancement proposals

图片描述

  • 可以提出一些增强的请求
  • 然后大概说明要实现什么样的效果
  • 这个流程和 ietf 提交请求差不多
  • 通过这个模式 python 可以不断进化
  • 也可以学习其他语言好的方面
  • 我们来看看这里面到底是什么?

概要

图片描述

  • 概要
    • 描述一个语法拓展
  • 提议解决方案
    • 使用 for 和 if
    • 建立一个 list
    • 而且可以嵌套
  • 根本原因
    • 一个好用的方式建立列表

例子

图片描述

  • 这个就是当时这个语法糖还没有的时候
  • 想象中的用法
  • 哈哈哈

结果

图片描述

  • 2.0 的时候实现了功能
  • BDFL 仁慈的独裁者 Guido 的声明
    • 上面的的语法是正确的
    • 两个变量要组合为元组
    • 可以嵌套就像 for 循环语句一样
  • 从此这个 list comprehensions 就进入了 python
  • 然后进入帮助手册

帮助手册

图片描述

  • list 有两种形式
    • starred_list
    • comprehension

细节

  • starred_list

图片描述

  • comprehension

图片描述

  • 不光 list 可以有 comprehension
  • set 和 dict 也可以有

图片描述

  • 我们来看一下 set comprehension 的定义

定义

图片描述

  • 集合推导式和列表推导式一样
  • 都是推导式 comprehension
  • 只不过两边都是大括号

动手

图片描述

  • 集合推导式
  • 还是很简单的
  • 不过集合和列表相比,有两个特征
    • 无序
    • 去重复
  • 我们来试试

去重

图片描述

  • 看起来确实是可以去除重复
  • 我们再试一个

循环变量

图片描述

  • 这里就把集合和列表的区别体现出来了
    • 列表有序,元素可以重复
    • 集合无序,元素不可以重复
  • 在这里得到的元素和 i 完全没关系
    • i 在这里就是当做循环次数用的
    • 这样也可以 🤪
  • 这里面可以用 if 进行过滤么?

if 过滤 filter

图片描述

  • 过滤还是挺好使的
  • 我想在结果中再过滤呢?

嵌套 embedded

图片描述

  • 可以的
  • 可以在结果里面进行再筛选
  • 还可以在遍历的时候筛选然后在结果里面再筛选
  • yeah
  • 可以来两个一起推导么?

两个变量

图片描述

  • 实践证明是可以的
  • 而且也两个可以上 if 进行 filter 筛选过滤
  • 这和 list comprehension 列表推导式一样
  • 不过集合关键还在于去重的特性

去重再举例

图片描述

  • 如果不需要去重的话
  • 我们完全可以使用 list
  • 需要去重、无序的时候
  • 我们就会选择 set

总结

  • 这次研究了集合推导式 set comprehension
  • 集合推导式就像列表推导式一样
    • 都是推导式
    • 都是语法糖
  • 语法糖是在原来语言基础上添加而成的
    • 从无到有的过程很有趣
    • pep 就是让 python 进化的原动力
    • 我们不主动使用语法糖,还是要练基本功
    • 但是见到糖我们能看懂
    • 也能相互转化
  • 序列类和集合类的推导式都完成了
  • 映射类呢?
    • 可以有字典推导式么?🤔
  • 下次再说 👋