《图解编译原理》读书笔记
1. 第一章 运行时结构及编译过程1.1. 一个简单的C程序代码如下: 12345678910111213141516int fun(int a, int b);int m = 10;int main(){ int i = 4; int j = 5; m = fun(i, j); return 0;}int fun(int a, int b){ int c = 0; c = a + b; return c;} 1.2. 程序运行之前执行程序之前,我们需要对程序进行编译。 编译分为以下几个步骤: 1. 预处理: 宏定义展开、头文件展开、条件编译、在这里并不会检查语法。 2. 编译: 检查语法,将预处理后的文件编译生成汇编文件 3. 汇编: 将汇编文件生成目标文件(二进制文件) 4. 链接: 将目标文件链接为可执行文件 编译完成生成可执行文件之后,我们通过在linux下size命令可以查看一个可执行二进制文件基本情况: 通过上图可以得知,在程序没有运行前,也就是说程序没有加载到内存前,可执行程序的内部已经分好了3段信息,分别为代码区(...
图解霍夫曼编码
1. 霍夫曼编码今天来给大家普及一下霍夫曼编码(Huffman Coding),一种用于无损数据压缩的熵编码算法,由美国计算机科学家大卫·霍夫曼在 1952 年提出——这么专业的解释,不用问,来自维基百科了。 说实话,很早之前我就听说过霍夫曼编码,除了知道它通常用于 GZIP、BZIP2、PKZIP 这些常规的压缩格式中,我还知道它通常用于压缩重复率比较高的字符数据。 大家想啊,英文就 26 个字母进行的无限组合,重复率高得一逼啊!常用的汉字也不多,2500 个左右,别问我怎么知道的,我有问过搜索引擎的。 字符重复的频率越高,霍夫曼编码的工作效率就越高! 是时候,和大家一起来了解一下霍夫曼编码的工作原理啦,毕竟一名优秀的程序员要能做到知其然知其所以然——请允许我又用了一次这句快用臭了话。 假设下面的字符串要通过网络发送。 大家应该知道,每个字符占 8 个比特,上面这串字符总共有 15 个字符,所以一共要占用 15*8=120 个比特。没有疑问吧?有疑问的同学请不好意思下。 如果我们使用霍夫曼编码的话,就可以将这串字符压缩到一个更小的尺寸。怎么做到的呢? 霍夫曼编码首先会使...
探索Notion中节省时间的神器 - Button
Notion按钮可插入块、添加页面、编辑页面、打开页面等功能,帮助快速完成重复任务、管理项目,提升效率,成为节省时间的实用工具,高效使用。
Python内置方法和属性应用
1. 前言python除了丰富的第三方库外,本身也提供了一些内在的方法和底层的一些属性,大家比较常用的如dict、list、set、min、max、range、sorted等。笔者最近在做项目框架时涉及到一些不是很常用的方法和属性,在本文中和大家做下分享。 2. 内置方法和函数介绍 enumerate 如果你需要遍历可迭代的对象,有需要获取它的序号,可以用enumerate, 每一个next返回的是一个tuple 12345678list1 = [1, 2, 3, 4]list2 = [4, 3, 2, 1]for idx, value in enumerate(list1): print(idx, value, list2[idx])# 0 1 4# 1 2 3# 2 3 2# 3 4 1 zip zip从参数中的多个迭代器取元素组合成一个新的迭代器; 12345678# 给list加上序号b = [4, 3, 2, 1]for i in zip(range(len(b)), b): print(i)# (0, 4)# (1, 3)# (2, 2)...
怎么修改Logic K580的快捷键
怎么修改Logic K580的快捷键在使用Logic K580键盘的时候有时候会想要切换到默认的快捷键,使用如下的方法: 使用右边的Fn键+ESC键切换
Test with Coverage
前几天,听了公司某位大佬关于编程心得的体会,其中讲到了“测试驱动开发”,感觉自己的测试技能薄弱,因此,写下这篇文章,希望对测试能有个入门。这段时间,笔者也体会到了测试的价值,一句话,学会测试,能够让你的开发更加高效。 本文将介绍以下两个方面的内容: Test with Coverage Mock 0.1. Test with Coverage测试覆盖率通常被用来衡量测试的充分性和完整性。从广义的角度讲,主要分为两大类:面向项目的需求覆盖率和更偏向技术的代码覆盖率。对于开发人员来说,我们更注重代码覆盖率。 代码覆盖率指的是至少执行了一次的条目数占整个条目数的百分比。如果条目数是语句,对应的就是代码行覆盖率;如果条目数是函数,对应的就是函数覆盖率;如果条目数是路径,对应的就是路径覆盖率,等等。统计代码覆盖率的根本目的是找出潜在的遗漏测试用例,并有针对性的进行补充,同时还可以识别出代码中那些由于需求变更等原因造成的废弃代码。通常我们希望代码覆盖率越高越好,代码覆盖率越高越能说明你的测试用例设计是充分且完备的,但测试的成本会随着代码覆盖率的提高而增加。 在Python中,cover...
Python面向对象编程
1. Python 面向对象编程面向对象程序设计思想,首先思考的不是程序执行流程,它的核心是抽象出一个对象,然后构思此对象包括的数据,以及操作数据的行为方法。 本专题主要讨论面向对象编程(OOP)的基础和进阶知识,实际开发模型中OOP的主要实践,尽量使用最贴切的例子。 2. 基础专题2.1. 类定义动物是自然界一个庞大的群体,以建模动物类为主要案例论述OOP编程。 Python语言创建动物类的基本语法如下,使用class关键字定义一个动物类: 12class Animal(): pass 类里面可包括数据,如下所示的Animal类包括两个数据:self.name和self.speed: 1234class Animal(): def __init__(self,name,speed): self.name = name # 动物名字 self.speed = speed # 动物行走或飞行速度 注意到类里面通过系统函数__init__为类的2个数据赋值,数据前使用self保留字。 self的作用是指名这两个数据是实例上的,而非类上的。 ...
Python学习之整数比较
最近学习python,发现整数比较时一个有趣的现象: 12345678910111213141516a = 256b = 256print id(a)print id(b)print(a == b)print(a is b)print(id(a) == id(b))print(id(a) is id(b))c = 257d = 257print id(c)print id(d)print(c == d)print(c is d)print(id(c) == id(d))print(id(c) is id(d)) 在pycharm中运行的结果是: 1234567891011123201910432019104TrueTrueTrueFalse4055042440550424TrueTrueTrueFalse 而在Python IDE中运行: 1234567891011121314151617181920>>> a = 256>>> b = 256>>> a == bTrue>>> a is bTrue>&...
Python中的star总结
1. Python中的“*”总结对于一般的Python使用者来说,清楚Python中的“*”号是作为乘法运算符就足够了,但是如果你想要更进一步,想要在Python领域中更进一步的话,就需要了解Python中“星号”的五个强大的用途。 1.1. 1.作为乘法或者是乘幂运算符 作为基础的Python应用,乘法运算和乘幂运算是大家最容易想到的星号作用。上述程序中,单个星号运算符起到了乘法运算的目的,而连续的两个乘号起到了乘幂运算的目的。从结果可以看出,3*3的结果是9,而3的3次方是27。 1.2. 2.接收多个参数当我们在编写函数时,有时候函数的参数数量太多,所以我们想尽量的缩短程序,让程序看起来简介,除此之外,我们可能不知道函数有多少个具体的参数,这个时候,就可以用星号来发挥作用。 上述程序中,单个星号起到的作用是帮助我们捕获多个位置参数,然后将其放入到字典中,需要注意的是,在传入参数时,它的顺序位置需要明确,以方便在函数调用中使用。 而对于双星号的参数,可以帮助我们捕获多个带关键字名字的参数,并放入到字典中去,这样的话,我们在程序内使用的时候,可以根据关键字名字来调用,而...
Jupyter notebooks单元测试
在 Jupyter notebooks 中进行单元测试我们都知道开发过程中应该编写单元测试,实际上我们中的许多人都这样做。对于生产代码,库代码,或者归因于测试驱动的开发过程,这一点尤其正确。 通常,Jupyter notebooks用于数据探究,因此用户可能不选择(或不需要)为其代码编写单元测试,因为当他们在Jupyter中运行时,通常会查看每个单元格的结果,然后得出结论,之后继续。但是,以我的经验来看,Jupyter通常会发生的情况是,Jupyter中的代码很快就超出了数据探究的范围,对于进一步的工作很有用。或者,Jupyter本身可能会产生有用的结果,需要定期运行。也许需要维护代码并将其与外部数据源集成。然后,确保可以测试和验证notebook中的代码就变得很重要。 在这种情况下,我们有哪些选择对Jupyter代码来进行单元测试?在本文中,我将介绍在Jupyter notebooks中对Python代码进行单元测试的几个选项。 也许只是不做? Jupyter notebook 单元测试的第一个选择是根本不做。这样,我并不是说不要对代码进行单元测试,而是将其从notebook ...




