为什么编号应该从 0 开始
在常见的编程语言如 Python、Go、Java 中,序列的下标都是从 0 开始的,为什么不是从 1 开始呢? 迪杰斯特拉在 1982 年的时候就思考过编号起点的问题,那个时候还没有上面这 3...
一文看懂 Python 中的函数参数
函数定义中的参数也就是形式参数,规定了在调用函数时如何传递实际参数以及这些参数有无默认值。 实参传递方式 def f(a): print(a) 实参传递方式有两种,位置和关键字。...
Python 装饰器原理
装饰器是 Python 编程中常用的一个功能,可以将通用的逻辑抽象成装饰器,通过装饰器语法应用到不同的目标上,达到增强或修改目标逻辑的目的。 先来看一个简单的例子 # 打印耗时的装饰器 de...
Python 的垃圾回收机制
几乎所有的高级编程语言都有自己的垃圾回收机制,开发者不需要关注内存的申请与释放,Python 也不例外。Python 官方团队的文章 https://devguide.python.org...
Python 中生成器的原理
生成器的使用 在 Python 中,如果一个函数定义的内部使用了 yield 关键字,那么在执行函数的时候返回的是一个生成器,而不是常规函数的返回值。 我们先来看一个常规函数的定义,下面的函...
对 Python 中 GIL 的一点理解
GIL(Global Interpreter Lock),全局解释器锁,是 CPython 为了避免在多线程环境下造成 Python 解释器内部数据的不一致而引入的一把锁,让 Python 中的...
Python 中的内存管理
Python 中一切皆对象,这些对象的内存都是在运行时动态地在堆中进行分配的,就连 Python 虚拟机使用的栈也是在堆上模拟的。既然一切皆对象,那么在 Python 程序运行过程中对象的创建和...
Python 中 sorted 如何自定义比较逻辑
在 Python 中对一个可迭代对象进行排序是很常见的一个操作,一般会用到 sorted() 函数 num_list = [4, 2, 8, -9, 1, -3] sorted_num_lis...
Python 中 lru_cache 的使用和实现
在计算机软件领域,缓存(Cache)指的是将部分数据存储在内存中,以便下次能够更快地访问这些数据,这也是一个典型的用空间换时间的例子。一般用于缓存的内存空间是固定的,当有更多的数据需要缓存的时候...
如何在 crontab 中让 source ~/.bashrc 生效
cron 是许多类 Unix 操作系统中都自带的用来调度定时任务的工具,定时任务的配置是写在 crontab 文件中的,但是 crontab 文件不允许直接编辑,一般都是通过命令 crontab...
编辑距离的计算
编辑距离是一个在实际应用和算法测试中都经常遇到的一个问题,它是对两个字符串差异化程度的一种量化度量,表示一个字符串至少需要经过多少次变换才能变成另外一个字符串。 首先,我们来看一个例子。相信各...
使用 gitlab-runner 持续集成
gitlab-runner 是 Gitlab 推出的与 Gitlab CI 配合使用的持续集成工具。当开发人员在 Gitlab 上更新代码之后,Gitlab CI 服务能够检测到代码更新,此时可...