第 32 期:只要没到最后就还有希望
@Author : Lewis Tian (taseikyo@gmail.com)
@Link : github.com/taseikyo
@Range : 2021-06-06 - 2021-06-12
Weekly #32
本文总字数 3871 个,阅读时长约:7 分 34 秒,统计数据来自:算筹字数统计。

Photo by Nat Belfort on Unsplash
山重水复疑无路,柳暗花明又一村 —— 陆游《游山西村》
Table of Contents
提高 Python 技能的 10 个高级概念(Medium)
提高 Bash 使用效率的一些小技巧(英文)
golang 字符串遍历问题(中文)
golang 中 slice 和 map 的坑(中文)
只要没到最后就还有希望
algorithm 🔝
review 🔝
1、异常处理
我记得之前在某期提过这点,Python 中异常处理的 try 代码块语法如下所示:
try代码块包含需要执行的代码except代码块包含执行失败时执行的代码else代码块只有在try块成功执行时才执行finally代码块总是执行,它独立于其他块
处理多个异常时,可以嵌套:
2、collections 库
collections 是 Python 内置库,其目的是改进内置容器的功能
Counter
它接受一个可迭代对线并返回一个有序的字典,其中键是一个元素,值是出现的次数
它有三个额外的函数:elements() 根据次数返回数据(迭代器的形式);most_common() 返回元组列表([(value1, counts1), (value2, counts2)]),其中包含按排序顺序排列的最常见元素;subtract() 从可迭代对象中减去对应元素
namedtuple
这个我用的比较多,比默认的元组多了可以命名的特点
OrderedDict
有序字典,在最新的 Python 中,已经支持了这点
defaultdict
带默认值的 dict,这个我也经常使用
deque
双向队列,可以从两边添加/删除元素
3、itertools
这个库包含了处理迭代器的各种函数,我用的实际上并不多
product(iterable,iterable),笛卡尔积permutation(iterable),所有可能的排列combinations(iterable,n),所有可能的指定长度的组合combinations_with_replacement(iterable,n)所有可能的指定长度的组合,可重复accumlate(iterable),返回累加和groupby(iterable,key=FUNC),返回一个具有连续键和组的迭代器
4、lambda
匿名函数,基本上扯到 Python 的高级技巧都会提到它
5、装饰器(decorator)
装饰器是 Python 中的一个特性,它在不显式修改现有代码的情况下向现有代码添加一些新功能,它有两类:函数装饰器和类装饰器
6、生成器(generator)
含 yield 的函数称为生成器,生成器只在请求时生成一个项,占用的内存空间也很小。
7、多线程(threading)和多进程(multiprocessing)
you can use threading if your program is network bound or multiprocessing if it's CPU bound
8、Dunder/Magic methods
特殊方法,即前后有两个下划线的函数
9、日志
日志是在执行时捕获代码流的过程,日志有助于轻松地调试代码
Python 有个 logging 库用来将日志写入文件,它一共有五个级别:
Debug:用于诊断具有详细信息的问题
Info:成功的确认
Warning:当意外情况发生时
Error:由于一个比警告更严重的问题
Critical:程序不能自行运行的严重错误
10、上下文管理器
主要是指 with语句
Implementing a Context Manager as a Class:需要自己实现 __enter__ 和 __exit__ 方法:
这篇文章介绍了一些 bash 的历史记录的技巧,基本上我没用过,但是我转移到 zsh 之后,使用自动补全插件搭配自己写的一个移除重复命令,基本上够我日常使用了,下面的是这篇文章中提到的几个 trick:
1、删除无意义的命令
使用下面这行命令之后,将会忽略之后使用的这些命令,不再添加到历史记录中(大概,没验证过)
下面命令将导致以空格开头的命令不会写入历史记录:
而 ignoredups 选项将值存储一份命令副本(不会写入重复命令)
2、不要丢失重要的历史记录
没有 histappend 选项,如果打开多个并发 shell 会话,那么只保存最后一个退出 shell 的条目
3、有效地回忆命令
!! 命令会自动调用前一个命令
sudo !! 则会以 sudo 权限执行前一个命令,如果在命令后面加上 :p 则会只打印命令而不执行
也可以设置选项默认仅打印而不执行:
在命令前面加一个 ! 将会运行上一条命令,如 !ping 则会运行上一条以 ping 开头的命令
4、使用 !$ 和 !*
使用 !$ 将展开最后一个命令的最后一个参数
使用 !* 将展开前一行上所有参数
5、将前一行的匹配单词替换为 ^
下面就是将 error 替换为 access
tip 🔝
golang 中字符串遍历的三种方式
1、range 遍历
2、for 循环
3、转换为 rune 输出
一、浅拷贝同根
输出:
slice 若不是深拷贝或者重新生成新空间,无论通过参数传递还是使用 := 或者 [:] 赋值都存在同根性。
二、扩容摆脱同根
slice 与 array 最大的区别在于 slice 不需要指定大小会自动扩容等一些特性,我们在接受并习惯同根性后。
slice 在多次 append 元素时,若满足扩容策略,这时候内部就会重新申请一块内存空间,将原本的元素拷贝一份到新的内存空间上。
此时其与原本的数组就没有任何关联关系了,再进行修改值也不会变动到原始数组。
输出:
三、empty 与 nil
empty
输出:
nil
输出:
通过输出来看我们会发现不管是数据还是 len 和 cap 都是相同的输出内容。
那我们就来用代码来证明一下他们是否真的一致
输出:
输出结果是不是出乎意料!不过聪明如你肯定已经通过自己的经验想到了答案。
一个有分配空间(empty)一个没有分配空间(nil)
以上就是我使用 slice 遇到的坑,这里不再针对 map 做特殊分析了。
share 🔝
1. 只要没到最后就还有希望
永不言弃,只要没到最后就还有希望
很喜欢毛主席的一句话:凡事要从最坏处着眼,往最好处努力。
在我看过的书中,最喜欢的两本书是《论语》和《三国演义》(想读《毛概》一直没读)
很早就读了这两本书,因此我也被这两本书深深影响着。
从中学到了很多做人的哲学,特别是诸葛亮,未算胜而先算败,我总是习惯去考虑最坏的结果,因此总是被老妈说不自信,其实并不是。
凡事往坏处想,至少能提前做好一些准备,不至于到了事发不知所措;再者没到最后谁能知道结果是怎么样的,只要没放皇榜,你我皆有可能。
为此我习惯做的就是未算胜而先算败,凡事从最坏处着眼,而去往最好处努力。
最后更新于
这有帮助吗?