Programming-Python

本文作为 programming python(4th edition) 的读书笔记。

system programming:#

here is the nav of the following 5 chapters:

  • In this chapter, I’ll introduce the main system-related modules in overview fashion. We’ll meet some of the most commonly used system tools here for the first time.
  • In Chapter 3, we continue exploring the basic system interfaces by studying their role in core system programming concepts: streams, command-line arguments, environment variables, and so on.
  • Chapter 4 focuses on the tools Python provides for processing files, directories, and directory trees.
  • In Chapter 5, we’ll move on to cover Python’s standard tools for parallel processing—processes, threads, queues, pipes, signals, and more.
  • Chapter 6 wraps up by presenting a collection of complete system-oriented programs. The examples here are larger and more realistic, and they use the tools introduced in the prior four chapters to perform real, pratical tasks. This collection includes both general system scripts, as well as scripts for processing directories of files.

system scripting overview:#

Most system-level interfaces in python are shipped in two modules: sys and os. There are also some other modules belonging to this domain too. Such as glob(for filename expansion),socket(for network connections and Inter-Process Communication),threading+_thread+queue(for running and synchronizing concurrent threads),time+timeit(for accessing system time details),subprocess+multiprocessing(for lauching and controlling parallel processes)…

Some built-in functions, such as the open function, serve as interfaces to the underlying system (e.g., the file system). When we want to learn about these functions or modules, Python provides tools to interactively fetch their attributes and documentation strings. Here is a clarification:

1
2
3
>>> import sys
>>> dir(sys)
['__breakpointhook__', '__displayhook__', '__doc__', '__excepthook__', '__interactivehook__', '__loader__', '__name__', '__package__', '__spec__', '__stderr__', '__stdin__', '__stdout__', '__unraisablehook__', '_base_executable', '_clear_type_cache', '_current_frames', '_debugmallocstats', '_enablelegacywindowsfsencoding', '_framework', '_getframe', '_git', '_home', '_xoptions', 'addaudithook', 'api_version', 'argv', 'audit', 'base_exec_prefix', 'base_prefix', 'breakpointhook', 'builtin_module_names', 'byteorder', 'call_tracing', 'copyright', 'displayhook', 'dllhandle', 'dont_write_bytecode', 'exc_info', 'excepthook', 'exec_prefix', 'executable', 'exit', 'flags', 'float_info', 'float_repr_style', 'get_asyncgen_hooks', 'get_coroutine_origin_tracking_depth', 'getallocatedblocks', 'getdefaultencoding', 'getfilesystemencodeerrors', 'getfilesystemencoding', 'getprofile', 'getrecursionlimit', 'getrefcount', 'getsizeof', 'getswitchinterval', 'gettrace', 'getwindowsversion', 'hash_info', 'hexversion', 'implementation', 'int_info', 'intern', 'is_finalizing', 'maxsize', 'maxunicode', 'meta_path', 'modules', 'path', 'path_hooks', 'path_importer_cache', 'platform', 'platlibdir', 'prefix', 'ps1', 'ps2', 'pycache_prefix', 'set_asyncgen_hooks', 'set_coroutine_origin_tracking_depth', 'setprofile', 'setrecursionlimit', 'setswitchinterval', 'settrace', 'stderr', 'stdin', 'stdout', 'thread_info', 'unraisablehook', 'version', 'version_info', 'warnoptions', 'winver']

The __doc__ built-in attribute contains the documentation of a modules. And help() function is also useful to learn new modules.

In system programming, string methods are widely used. For example,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
"""
split and interactively page a string or file of text
"""

def more(text,numlines=15):
lines=text.splitlines()
while(lines):
chunk=lines[:numlines]
lines=lines[numslines:]
for line in chunk: print(line)
if line and input('More?') not in ['y','Y']:break

if __name__ == '__main__':
import sys
more(open(sys.argv[1]).read(),10)

We use splitlines() to split text by line. It is very similar when compared with split('\n').

参差荇菜,左右流之。

从等幂和公式到欧拉麦克劳林公式:#

历史上很有名的一个问题,就是如何求的公式;

雅各布·伯努利最先给出一个解释,他的思路是:由于得到

从而可以得到于是递推到时,有这样的一个递推式。

对这个递推式做一些简单的介绍:

  • 左边是第项,右边共有从项。
  • 次数只由第一项决定(是),首项系数是;

豪斯多夫距离的三角不等式:#

对任意两点集而言,定义其 距离

其中为任意度量,为点集。

上述距离实际上是对日常生活中 从一个点集到另一个的距离 的刻画。通俗地讲就是:从上点到上点的所有最小距离中的最大的那个。也可以称之为 有向豪斯多夫距离

注意到先对所有点之间的距离进行最小筛选,然后再选最大的,所以此距离不一定对称,也即不一定相同。

从上引申出 豪斯多夫距离

我们可以发现,豪斯多夫距离实际上是有向豪斯多夫距离更宽泛的距离限制,因此我们可以基于有向豪斯多夫距离给出豪斯多夫距离的三角不等式。

我们只需要证明对于任意最短路径都有更大的一条的路径即可。反向路径是同理的。

我们设,其到的距离的点为,那么从再到必有一条最短路为。这就是豪斯多夫三角不等式的本质。

奇异值分解(SVD):#

我们学习过矩阵的对角/正交分解,但这些分解都需要矩阵具有一定的特殊性:最少他们都需要是方阵。如果我们希望对非方阵进行分解呢?

我们知道,之前所提到的对角化分解,实质上将对应的 线性映射 进行最简化矩阵表示。对于一个矩阵,其对任意向量的作用可以表示为我们从右往左看,每个矩阵各有其意义:

  • 表示将向量(一般)从标准基表示转化为特征向量基表示;
  • 表示对于使用这个基表示的向量,其线性映射对应的矩阵为
  • 表示将在特征向量矩阵表示的映射结果换成(一般)标准基下的表示。

从这一点出发,我们这样 “特征化”:
其中维列空间的一组基,维列向量的一组基。如果能够实现这样的映射关系,我们就可以将该矩阵对任意向量的作用转化为类似于特征值这样的计算。

上式等价于也即如果我们选基的时候更贪心一点,我们选的都是正交基,那么上式就会简化成为

按照之前的说法,我们现在引入的矩阵可以这样解释:

  • 是将需要映射的向量在这组 特别的基 下表示:
  • 是相应的 特征值,这里是一个矩阵,其有可能
  • 是将对应基下的表示。

另一种说法是,对于任意一个线性映射,我们在研究其矩阵表示的时候,只需要在中各选出一组基,由于线性映射的特性,对于中的基而言,可以表示成为的线性组合。也即这里是基向量是列向量,因而矩阵放在了基的后面。其行数对应着的维数,列数对应着的维数。

在这里我们可以做一点文章,如果我们想 “压缩” 一个矩阵,用(给定度量上的)最少的资源来记录某个映射,我们就要在基的选择上小心谨慎。

标准正交基具有很好的性质,它们之间不相互参杂。我们可以考虑使用这样的基来进行简化,也即考虑转而对进行研究,我们考虑正交矩阵的特殊性,分析因而是合同的(也是正定的)(另一个也一样),于是我们可以对其特征值进行分析,得到两个基,然后即可导出

轨道稳定子定理:#

问了chatgpt给了一个我觉得还不错的回答:

首先我建议看看这个 最经典的例子

就我的感觉而言,对群的研究是从这些问题中抽象出来的。

通俗的说, 稳定子 就是在正方体旋转过程中,保持染色方案不变的那些 置换,也就是具有对称性的旋转。稳定子只是给这种能够保证染色方案 稳定 的操作起了个名字;而 轨道 则是对于某种染色方案而言,经过 所有的旋转操作 后得到的染色方案,这些染色方案都是本质相同的染色方案。

也就是说,轨道稳定子实际上讲述的是,群对集合的作用,我们可以将这个作用细分成为更结构化的两部分。对于某个元素来说,其作用是由 稳定子非稳定子 组成的,说人话就是:任何的变换操作都可以拆成不改变的和改变的两部分操作。改变的那一部分产生了轨道。

从度量空间到压缩映射原理:#

直观地说,数列极限就看的是最后的变化是不是足够小,小到无法逃出一个区间。而我们知道,数列可以被递推式和足够多的前驱项确定,那么是否可以根据递推式,判断数列的收敛性呢?

压缩映射就说的是这样一件事,其根本是通过描述 相邻两项距离 的变化,系统地说明这个总的距离变化是否 “可忽略”。

根据维基百科,压缩映射的最广泛定义是:对非空完备度量空间,设上的一个 压缩映射,即存在一个实数,使得,那么该压缩映射在集合内有且只有一个不动点,也即,并且这个不动点是数列的极限,且和首项具体值无关。

所谓度量空间,其实就是赋予了 度量 的一个空间(或称集合)。所谓度量,就是“距离”。

  • 比如在欧几里得空间中,我们熟知的一个度量就是两点之间的距离,用勾股定理来计算的那个;
  • 比如在复平面上,这个度量可以是两复数差的模;
  • 甚至我们之前提到的豪斯多夫距离,也可以视为由点集组成的集合上的一个度量。

具体而言,只要这个度量满足以下三个基本条件:

  • 自反性:;
  • 同一性:;
  • 三角不等式:

我们就可以称之为一个度量,这些条件是从我们平常对距离的感受中抽象出来的。

那么什么是 完备 的度量空间呢?完备的度量空间和度量没什么关系,只和空间有关,它强调了这个空间是比较“稠密的”。具体而言,任何该空间的柯西列必然收敛于这个空间内的元素,这保证了我们不会从空间中“掉出去”,跑到未知领域中。

实际上上面这些概念还会在极限中再遇到,因为我们要描述“极限”,就要描述元素之间的距离。只要两个元素的距离无限小,那么在极限意义下我们就可以认为这两个元素是相同的。

现在我们有了以上概念,我们可以对这个定理的条件做出简单的描述。定理条件说,这是一个完备度量空间,并且存在一个压缩映射。这个压缩映射保证了,在映射足够多次后,数列相邻两项距离非常之小,并且根据度量的性质,这由等比级数的性质和度量的三角不等式保证,因为: 因而根据柯西收敛准则这个序列是收敛的。假设收敛于

收敛说明什么?说明这个映射最后把数列相邻两项的距离压缩的很小很小了,这样我们就可以判断这个数列是不是收敛。严谨地说法就是,根据度量空间的理论,也就是

假设存在另外一个不动点,那么,只能说明,因而不动点唯一。

傅里叶展开求级数的简单理解:#

考虑下面这个经典的级数求和显然这个级数是收敛的,我们可以使用 傅里叶展开 来构造相应的母函数(这是我自己的叫法),然后通过母函数来求出级数值。

首先当然是给出傅里叶展开的形式:

周期为,且满足 狄利克雷条件

  • 分段连续;
  • 绝对可积:
  • 只有有限个间断点:意味着分段连续的 是有限个。

那么可以展开为其中,且这里是保证积分区间有意义的任意点。

由于函数的周期性,通常我们都会选用包含原点的对称区间进行积分,此时也即,我们常令来简化这个过程。

实际上,正是由于傅里叶展开+分布积分的组合使得构造这一类含次幂的级数和变得的简单。因为我们可以通过这两个工具构造出含幂次的数列,然后进行求和。用数学的话说,就是$$a_n=\int_{-l}^{l}f(x)\cos{n\omega x}dx=\int_{-l}^{l}f(x)d(\frac{\sin n\omega x}{n})=[f(x)\frac{\sin n\omega x}{n}]\big|{-l}^{l}-\int{-l}^{l}f’(x)\frac{\sin n\omega x}{n}$$因此我们可以通过选用不同对称性的函数,将其中的某一项保留下来,而另一项构造成为(比如选用偶函数,那么对应的第二项将会成为0,第一项会保存下来,此时阶数固定为),这样就能够获得含有的级数了。如果我们希望获得更高次幂的,只需要将变得更光滑即可。

同时

例如我们这里的例子是求自然数平方倒数和,那么我们就需要连续两次分部积分,并且舍弃前缀内容。假设我们选择偶延拓,那么我们需要且是偶函数,因此可以选择,然后偶延拓