program-in-chinese / overview

中文编程的历史、现状和展望。issue 中进行相关问题的讨论.
https://zhuanlan.zhihu.com/codeInChinese
GNU General Public License v3.0
383 stars 34 forks source link

通过IDE扩展提供常用功能的例程/片段 #133

Open nobodxbodon opened 5 years ago

nobodxbodon commented 5 years ago

源自https://github.com/program-in-chinese/overview/issues/11#issuecomment-417743692 比如vscode下的snippet功能(详见VS Code创建自定义Python代码片段): 2019-01-29-vscode

nobodxbodon commented 5 years ago

参考"Python Cookbook第三版", 把计划中的先分功能块列举如下, 第一章是数据结构/算法:

  1. (参考1.3) 保持一系列元素的最后N个(用deque)
  2. (参考1.4) 获取列表中最大的N个值 (可按key排序). 如取数量最大的两个物品名称:
    货品清单 = [{'名称': '台式机', '数量': 5}, {'名称': '笔记本', '数量': 10}, {'名称': '显示器', '数量': 15}]
  3. (1.6) 新建1:N的字典, 如
    {
    '奇数': {1, 3, 5},
    '偶数': {2, 4, 6}
    }
    {
    '奇数': [1, 3, 5],
    '偶数': [2, 4, 6]
    }
  4. (1.7) 保持添加次序的字典, 用OrderedDict
  5. (1.8) 字典按值求最小/大, 以及排序(用zip). 如取数量最大/小的物品:
    货品清单 = {
    '台式机': 5,
    '笔记本': 10,
    '显示器': 15
    }
  6. (1.9) 求两个字典的重合部分(键, 键&值):
    仓库1 = {
    '台式机': 5,
    '笔记本': 10,
    '显示器': 15
    }
    仓库2 = {
    '键盘': 5,
    '笔记本': 20,
    '显示器': 15
    }
  7. (1.10) 从列表中删去重复元素, 并保持原顺序
  8. (1.12) 获取列表中出现频率最高的元素
  9. (1.13) 按照某个共通的键排序一系列字典, 如按笔记本数量排序No.5中的仓库
  10. (1.14) 按照对象中的某个属性进行排列, 如按用户类的用户id对几个用户进行排序:
    class 用户:
    def __init__(self, 用户id):
        self.用户id = 用户id
    def __repr__(self):
        return '用户({})'.format(self.用户id)
  11. (1.15) 按照对象中的某个值分类一批对象, 如将一批人按照生日月份分组
  12. (1.16) 按照某个条件过滤列表中的元素
  13. (1.17) 从字典中按照某个条件提取一个子集
  14. (1.18) 由名称映射到值(用nametuple), 没想好描述(Mapping Names to Sequence Elements)
    >>> from collections import namedtuple
    >>> 用户 = namedtuple('用户', ['邮件', '加入时间'])
    >>> 用户1 = 用户('xiaohong@test.com', '2019-01-01')
    >>> 用户1
    用户(邮件='xiaohong@test.com', 加入时间='2019-01-01')
    >>> 用户1.邮件
    'xiaohong@test.com'
    >>> 用户1.加入时间
    '2019-01-01'
  15. (1.19) 同时转换与reduce, 如下, 还可用于any, min, max`等:
    sum(x *x for x in range(1, 4))
  16. (1.20) 合并多个字典(通过ChainMap)

未列入的条目及原因:

1.1 将列表拆成变量 -- 难以找到有代表性的代码片段 1.2 Unpacking Elements from Iterables of Arbitrary Length -- 同1.1 1.5 实现优先级queue -- 代码块较大 1.11 Naming a Slice -- 属于代码重构优化

@cflw @RimoChan 欢迎意见建议.

RimoChan commented 5 years ago

应该能起到加快速度的作用。相比起整理成函数还是有一定好处的,比如需要某个功能的时候并不好「import 我的常用功能」……

我觉得实际上要用到的地方不多,有时候我倒是会选择效率低一些但是代码短的方法……

对了,python规范是4空格缩进,你的gif里vscode把\t自动变成变成了2空格

nobodxbodon commented 5 years ago

@RimoChan 多谢

相比起整理成函数还是有一定好处的

感觉相对灵活些, 但也是刚接触, 之前也不大用, 先自己试试.

有时候我倒是会选择效率低一些但是代码短的方法

嗯, 现在觉得这个主要用户群也许是不熟悉Python但不时用来完成一些日常事务的, 越是熟练开发者这个插件的价值会越小.

你的gif里vscode把\t自动变成变成了2空格

之前是参考了vscode文档示例, 要研究一下哪个vscode选项出了问题(因为之前代码也是在vscode下, 却是4格缩进).

nobodxbodon commented 5 years ago

@RimoChan btw 缩进2格的问题是因为之前在vscode选项里加了全局的"editor.tabSize": 2,. 了之后就好了.

nobodxbodon commented 4 years ago

考虑也添加些常用算法,尤其是排序相关的

nobodxbodon commented 4 years ago

https://github.com/antfu/wenyan-lang-vscode/issues/16 中发现,prefix 用中文时,可用ctrl+space 触发补全窗口(mac 中测试): Screen Shot 2020-06-03 at 11 51 12 PM 打算接下去在木兰vsc 插件中开始实践。