====================
== Hi, I'm Vimiix ==
====================
Practice makes perfect (ง •̀_•́)ง

跳槽

生活 跳槽
不知不觉,一个月没有写东西。感觉很快,因为没有感觉;但又感觉很慢,因为心理一直在作斗争。 这将近一个月的时间里,我基本没有和圈内的朋友交流,自己都感觉自己像蒸发了一样。这一个月的经过,给我积累了人生的一次重要经验——项目一定要选对人。剩下的就留给时间去消化吧。 今天以后,我将继续恢复日常的上班,学习,记录生活。 今天,北京天气很好。趁着阳光正好,我正式入职豆瓣了。 豆瓣,因为喜欢 python,慕名而来。 希望自己未来可以在这个 python 的"伊甸园"里面茁壮地成长!

[译]python中垃圾回收和析构函数笔记

GC Python

紧接上一篇转载的文章《Python 魔术方法总结》文末提及的英文参考文章,洒家顺手就翻译了一下。方便墙内的同学学习。这篇文章不仅指出了 Python 如何处理垃圾回收,还提到了我们作为程序员不应该只借助现代化 IDE 的函数提示功能去完成代码,应该多去看官方的完整文档,可以知道哪些函数被废弃的,哪些函数在使用时需要注意什么等等一些很重要的信息。话不多说,自己体会,请向下阅读文章吧。

原文链接:https://www.electricmonk.nl/log/2008/07/07/python-destructor-and-garbage-collection-notes/

我很少在 Python 对象中使用析构函数。我猜 Python 的动态特性往往弱化了对析构函数的需求。但是现在,假如我需要在对象被销毁时,或者更确切地说,当程序退出时,要将一些数据写入磁盘。这时我会使用__del__ 魔术方法在主要操作的类对象中定义了一个析构函数。但是奇怪的是,这个析构函数自始至终都没有被调用到。不仅在程序退出时没有被调用到,而且我手动使用del删除时也不会被调用。由于这个程序是我前一段时间写的,所有稍微有点不是很熟悉了,这导致我怀疑是我程序中有一个大的 BUG 存在。

Read more...

[转]Python中的魔术方法汇总

magic method Python

这是一篇很不错的总结文章,简单易理解,洒家忍不住要转载收藏一下。

源文链接:http://algo.site/?cat=60

基础:

如果你想…所以,你写…Python 调用…
初始化一个实例x = MyClass()x.__init__()
作为一个字符串的"官方"表示repr(x)x.__repr__()
作为一个字符串str(x)x.__str__()
作为字节数组bytes(x)x.__bytes__()
作为格式化字符串format(x, format_spec)x.__format__(format_spec)
Read more...

《算法图解》读书笔记6-图以及广度优先搜索

algorithms Linux

什么是图

图模拟一组链接,图由顶点和边组成。一个顶点可能与众多顶点直接相连,这些顶点被称为邻居

图通常表示为:G(V,E),其中,G表示一个图,V是图中顶点的集合,E是图中边的集合。

简单图

在图结构中,若不存在顶点到其自身的边,且同一条边不重复出现,则这样的图称之为简单图。

无向图

如果图中任意两个顶点之间的边都是无向边,则称该图为无向图。

无向边:若顶点 M 到顶点 N 的边没有方向,称这条边为无向边,用无序偶对(M,N)或(N,M)表示。

Read more...

《算法图解》读书笔记5-散列函数及扩展

algorithms Linux

散列函数

散列函数就是一种映射,是从关键字到存储地址的映射。通常,包含散列函数的算法的算法复杂度都为 O(1),对应到 Python 中的数据结构就是字典,给一个 key 可以得到一个固定的 value 值。散列函数必须满足一些要求:

  • 它必须是一直的。例如,假设输入 apple 时得到的是 4,那么每次输入 apple 时,都必须是 4,不然这个散列函数就是无意义的;
  • 散列函数应该将不同的输入值,对应到不同的值上。(虽然不同的 key 对应相同的 value 是允许的,但最理想的情况是不同的 key,对应不同的 value,这种称之为完美散列
Read more...

《算法图解》读书笔记4-分治思想和快排

algorithms Linux

分而治之(Divide and Conquer)

所谓分而治之,分为分解问题,但我们目的是解决大问题,所有还有将分解后得到的结果贡献回大问题,最终使得我们解决大问题。

分而治之的思想是采用了递归的思想,将原问题分成几个规模较小但是类似于原问题的子问题, 通过递归的方式来求解这些小问题,最后将子问题的解合并来得到原问题的解。分治思想的本质是我们中学时候学的数学归纳法。

书上提到,使用分治思想解决问题的过程包括两个步骤,其实应该是三个步骤:

  1. 找出基线条件,这种条件必须尽可能简单。
  2. 不断将问题分解为子问题(或者说缩小规模),直达符合基线条件。
  3. 合并子问题的结果,得到最终问题的解(利用系统栈的特性实现过程状态的记录)
Read more...

《算法图解》读书笔记2-数组链表和选择排序

algorithms linux sort

理解数组和链表

链表和数组是两种基本的数据结构,他们的区别在于数据在内存中的存储方式不同。

数组

数组在内存中是用一块连续的内存来存储数据的,数组中的每个数据地址是连续的。数组中的每个元素所占用的内存是相同的,所以,我们可以通过下标索引在常数数量级的时间内,迅速访问数组中的任何一个元素。但是要在数组中任意位置添加一个元素,就需要移动大量的元素,使得内存中空出一个位置来存放新插入的元素。同理,当删除一个元素的时候,也需要移动大量的元素,来使得删除元素以后的数组数据在内存中仍旧是连续的。

由此可见:当对于一组数据,读取操作频繁,写操作少的情况,应该使用数组数据结构。

Read more...

《算法图解》读书笔记3-递归

algorithms Linux

如果使用循环 ,程序的性能可能更高;如果使用递归,程序可能更容易理解。如何选择要看什么对你来说更重要。

递归函数

在一个函数中,可以调用另一个函数,如果调用的另一个函数是函数本身,这样的函数就是递归函数。如下示例:

def foo(x):
    if x == 0:
        return 'end'
    else:
        # 在函数中继续调用自己
        return foo(x-1)
Read more...

《算法图解》读书笔记1-二分和大O

algorithms Linux

算法是一组完成任务的指令

为什么要学习算法

这次是我第二次读《算法图解》,当我第一次看这本书的时候,我更兴奋于书中有什么内容,迫不及待的去过内容,学习那些算法概念。但当我第二次准备开始读这本书的时候,我脑海中出现的了一个问题:“为什么要学习算法?”,这个问题也许会有人和我一样,之前根本没有好好的去思考,只是知道,作为一个程序员我应该学习算法。当然,能够有这个觉悟,说明我们还算是个合格的程序员。

但是,不妨认真思考一下,为什么要学习算法?算法应该怎么学?

Read more...

TLPI笔记—深入文件I/O模型

tlpi Linux note I/O

原子操作和竞争操作

所有的系统调用都是以原子操作方式执行的。之所以这么说,是指内核保证了某系统调用中的所有步骤会作为地理操作而一次性加以执行,期间不会被其他进程或线程中断。原子性规避了竞争状态(race condition),竞争状态指:操作共享资源的两个进程(或线程)其结果取决于一个无法预期的顺序,即这些进程或线程获得 CPU 使用权的先后相对顺序。

Read more...
上一页 3 of 8 下一页