show | version | enable_checker |
---|---|---|
step |
1.0 |
true |
- 这次研究了帮助手册中的for语句
- 深入理解
- for还有什么可玩的么?🤔
- 这个列表的生成过程非常简单
- 但是我们可以用一种更简明的方式建立列表
- 这个东西可以用简单一句话来实现
- 这看起来很好理解
- 这就是列表推导式
- 我们去帮助里面查看一下
- 他举的例子是这样的
- 一个求平方的列表推导式
- 列表推导式的英文是List Comprehensions
- 列表的理解方法
- 其实是一种语法糖
- 那什么是语法糖呢
- 糖我们都知道
- 那这个糖和语法有什么关系呢?
- 语法糖可以让语法变甜
- 也就是说让编程人感觉到愉悦
- 简单来说
- 代码本可以用原来的传统的方式可以写出来
- 但是现在有这么一种很甜的写法
- 让人写起来很快、而且可读性很强
- 就问你用不用
- 作为语言编译器、解释器的开发者肯定不会由衷欢迎语法糖
- 因为这会增大语言编译的难度
- 但是一旦实现了语法糖的功能
- 语法糖会让编程工作更快速
- 而且不会降低运行效率
- 而且语法糖普及之后
- 如果你不懂这块糖
- 看起代码来反而会吃力
- 我的建议是
- 首先能看懂
- 至于写不写语法糖的代码
- 我们不去追求
- 把基本功练好最重要
- 回到我们的列表推导式
- 我们可以对于原来迭代器里面的进行任何运算和操作
- 然后得到一个列表
- 我们也可以对这里列表做一些函数操作
- 那我们可以对于迭代器里面内容进行筛选吗?
- 这样就可以提前对于迭代器进行筛选了
- 那我们可以对于最终结果进行筛选吗?
- 思考一下
- 这个应该怎么写?
- 这样可以对于结果进行筛选
- 如果既要对迭代器筛选
- 又要对结果进行筛选呢?
- 这就是语法糖
- 吃了糖也不忘粮
- 如果我们用传统for语句应该怎么写呢?
- 其实只是写法不同而已
- 最终还是要cpu去具体执行指令
- 本质上是一样的
- 列表推导式还有什么好玩的么?
- 如果需要返回元组
- 小括号是不能省的
- 我们可以看到可以对于列表推导项进行各种运算和函数
- 可以来点更复杂的么?
- 这个推导可以来二重么?
- 这个例子看起来还是很明确的
- 要注意列表项是tuple元组
- 元组的小括号还是不能省略的
- 如果本身的列表就是二重列表的话
- 会如何呢?
- 二重列表可以先分行
- 然后分列
- 这样就可以分层地推导出来了
- 我能否实现一个二维数组的转置呢?
- 这样转置是成功的
- 可以把这个嵌套式的列表推导式转化为普通的for语句么?
- 先扒一层
- 运行结果没有问题
- 可以再扒一层糖衣么?
- 这样就是最传统的写法了
- 相对来说传统的写法更明确
- 语法糖比较唬人
- 比较甜
- 我们一定要能看懂他就可以了
- 其实最甜的还不是语法糖
- 想想我们其实以前做过转置
- list(zip(*matrix))
- 更简单就搞定了
- 不过这个不是语法糖
- 而是zip函数
- 其实函数就是糖
- 是很甜的东西
- 函数可能是
- 系统自带的
- 我们导入的
- 甚至我们自己写的
- 这次研究了列表推导式
- 列表推导式是一种语法糖
- 我们至少要能看得懂这颗语法糖
- 可以对于推导项进行筛选
- 可以对于推导结果进行筛选
- 可以进行二重推导
- 也可以把两个推导复合到一起
- 所有列表推导式都可以写成原始的for语句的形式
- 除了列表可以推导之外
- 其他的数据结构可以进行推导么?
- 序列类的有列表推导式
- 集合类的有set 推导式么?🤔
- 映射类的有dict 推导式么?🤔
- 下次再说👋