Python 对函数默认参数的处理

Python 对函数默认参数的处理

一个以可变对象为默认参数的函数:

1
2
3
4
5
6
7
8
9
10
11
class A:
def __init__(self):
self.x = 1
print('created')

def f(a = A()):
a.x += 1
print(a.x)
# output: created
f() # output: 2
f() # output: 3

从结果可以看出,Python 在解析时便已经创建好了默认参数 a 的值。函数 f 在调用时采用了同一个对象,而不是每次调用时重新创建新的对象。这一点与 C++ 的处理方式不同。

初看 CPython

什么是 CPython

简单的说, CPython 是 Python 解释器的一个实现。换句话说,Python 解释器是由 C 写的,然后由 GCC 之类的编译器编译而成的可执行文件。除了 CPython,还有 PyPy(用 Python 实现的 Python 解释器),Skulpt(用 JavaScript 实现的 Python 解释器) 等等。如果你不知道你用的是哪一个,那么你一定用的就是 CPython。因为 CPython 是 Python 官方的解释器实现,其它均属于第三方实现。

从源码到运行

对于从 Python 源码到解释器执行它们的这个过程,我把它分为两大步 —— 编译(Compiling) 与 解释(Interpreting)。

延迟计算: 关于 Python 的 yield

在 SICP 第 3 章中,有一段部分内容是以 stream 为核心而展开的。而 stream 的特点就是 lazy evaluation / delayed evaluation (惰性求值 / 延迟计算)。在接触 stream 之时,我便立即联想到 Python 具有类似的功能 — yield

对 SICP Chapter 2 的一些理解

SICP 第二章的标题为 “Building Abstractions with Data”。与第一章标题“Building Abstractions with Procedures” 相比,这一章明显注重于在数据上的抽象。因此,在本章中所采用的例子中,会有多种数据类型被抽象出来,而每种数据类型又会对应着多种操作,那么随着代码量的增多,如何在不减少需求的情况下正确的对数据的抽象将直接影响开发者编码时的难度以及后期维护的成本。

在阅读和练习完 Chapter 2 之后,我想谈一下对我思维冲击比较大的几个点。

创建了适用于 hexo 的一个主题 mls

之前用的主题是基于 landscape, 虽然这确实是一个不错的主题,使用上也没什么不便,但毕竟这是一个他人贡献的主题。我一直想试着自己做一个主题。之前也尝试在 landscape 上改,修改了一些颜色,对 CSS 做了一些简单修改,但布局没变,整体一眼还是能看出这是 landscape,并且因为我当时不熟悉 EJS 模板,对 Sass 及 CSS3 不是特别熟悉,所以有些功能的实现也完全不知道怎么做,比如一些透明效果的动画。

最近一段时间,相对以前来说稍微不忙了点,所以趁这个机会试着做一个主题了。

晴天 — TOEFL @ ZJU

考前

上一次考托福,考了 93。 这分数明显不够,上次出分立即报了一次。故意选择了跟上次一样的考场 — 浙大 E 考场,原因是不想去熟悉新考场了,找个已经去过的考场吧。

在酒店里发生了一件小插曲,隔壁间的客户发现他们的卡不能打开房门,于是用我房间里的电话向前台求助。关键是这两位,同时也是一对情侣,也是到浙大考托福的,而且是从上海交大来的。女生表现比较开朗,在过程中了解到女生已经考出来了,而男生的成绩不理想,所以她只是陪男生来考试的。短暂的聊天中,并没提到女生的具体分数,但我猜她的分数应该还是比较不错的,因为她说了一句:“TOEFL 分数不需要很高,105 就已经足够了”。

考 GRE @ Ningbo University

大约两个月前报名了在宁波大学的这场 GRE 考试。之所以选择宁波的这场考试,一是因为 8 月份杭州没有考位,只能另寻它处,二是相比与周围的考点(如苏州,南京等),宁波更近,方便我的来回。

写在 TFT 小组 第 35 期 之后

在同学的介绍下,我报名了 刘功勋 老师的 TFT 35 期口语小组。之所以报名这个小组,理由也很简单 —— 就是为了学习口语,为 TOEFL 做准备。在昨天,小组正式结束,感觉收获颇多。同时,这几天又有一些其它想法涌上心头。