mattkang

他掀开被单,整了整胸前的红领巾,开始了这段编程旅程

飘逸的python - 极简的二叉树前中后序通杀函数

对于任一结点,可以按某种次序执行三个操作: 访问结点本身(N)遍历该结点的左子树(L)遍历该结点的右子树(R) 用来表示顺序,即,前序NLR/中序LNR/后序LRN. 下面我们用namedtuple来表达树,而通杀的遍历函数带一个order参数,只要我们把指定顺序传进去即可实现对应的遍历. ...

2014-10-29 16:47:19

阅读数:2144

评论数:0

飘逸的python - 带权随机算法及在抽奖中的应用

带权随机在游戏开发中重度使用,各种抽奖和爆装备等. 运营根据需要来配置各个物品出现的概率. 今天要说的这个带权随机算法思想很简单,就是"把所有物品根据其权重构成一个个区间,权重大的区间大.可以想象成一个饼图.  然后,扔骰子,看落在哪个区间," 举个栗子,有个年终抽奖,物...

2014-10-28 17:46:55

阅读数:5069

评论数:0

什么是Name_mangling以及python的下划线约定

name mangling (又叫name decoration命名修饰).在很多现代编程语言中,这一技术用来解决需要唯一名称而引起的问题,比如命名冲突/重载等. 在python中,双下划线开头的类变量就用到了name mangling技术,会自动加上类名前缀. 有什么用呢?可以防止意外在子类...

2014-10-20 16:53:51

阅读数:2838

评论数:0

什么是猴子补丁(monkey patch)

monkey patch指的是在运行时动态替换,一般是在startup的时候. 用过gevent就会知道,会在最开头的地方gevent.monkey.patch_all();把标准库中的thread/socket等给替换掉.这样我们在后面使用socket的时候可以跟平常一样使用,无需修改任何代码...

2014-10-20 11:07:36

阅读数:14723

评论数:0

什么是鸭子类型(duck typing)

“当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。” 我们并不关心对象是什么类型,到底是不是鸭子,只关心行为。 比如在python中,有很多file-like的东西,比如StringIO,GzipFile,socket。它们有很多相同的方法,我们把它们当作文件...

2014-10-19 22:00:04

阅读数:17628

评论数:1

飘逸的python - 实现控制台进度条效果

我们要怎么在同一行中刷新界面呢?

2014-10-19 15:07:08

阅读数:6404

评论数:0

飘逸的python - 什么是魔术方法(magic method)

我们经常看到各种被双下划线环绕的方法,如__init__,它们就是魔术方法. 魔术方法是python语言预定好的"协议",不同魔术方法在不同场景下,会被隐式调用.我们通过重载这些方法,从而操控各种行为. class A(object): def __str__(se...

2014-10-17 15:24:01

阅读数:3127

评论数:0

飘逸的python - 实现一个极简的优先队列

一个队列至少满足2个方法,put和get. 借助最小堆来实现. #coding=utf-8 from heapq import heappush, heappop class PriorityQueue: def __init__(self): self._queue = ...

2014-10-14 10:54:58

阅读数:5159

评论数:0

飘逸的python - 一个极简的event系统

event系统的核心至少满足: 1.存放事件的容器,可对事件添加删除 2.事件的触发fire 上代码. class Event(list): def __call__(self, *args, **kwargs): for f in self: f...

2014-10-13 10:05:35

阅读数:2732

评论数:0

飘逸的python - 实现一个pretty函数漂亮的输出嵌套字典

示例: d = { "root": { "folder2": { "item2": None, "item1": None }, "folder1": { "subfolder1"...

2014-10-12 19:12:46

阅读数:5363

评论数:1

飘逸的python - 几行代码实现unix管道风格的函数调用

用过linux的基本知道它的管道,是将一个程序或命令的输出作为另一个程序或命令的输入. 废话少说,下面我们看用python怎么实现unix管道风格的函数调用. #coding=utf-8 class Pipe: def __init__(self, func): self....

2014-10-11 18:18:27

阅读数:2929

评论数:1

飘逸的python - 装饰器的本质

很多人把装饰器搞的很复杂,其实本质很简单. 首先,什么是装饰器呢?在代码中发现戴着@xxx帽子的,就是装饰器. 那要怎么自己定义一个装饰器呢? 其实任何一个接收一个参数的callable都可以用来做装饰器,比如函数和类.为方便起见,下面的例子都用函数来说明. def deco(func):retu...

2014-10-11 17:53:52

阅读数:2831

评论数:0

飘逸的python - property及实现lazy property

@property有什么用呢?表面看来,就是将一个方法用属性的方式来访问. 上代码,代码最清晰了. class Circle(object): def __init__(self, radius): self.radius = radius @property ...

2014-10-09 17:07:48

阅读数:4438

评论数:4

飘逸的python - __get__ vs __getattr__ vs __getattribute__以及属性的搜索策略

其中,__getattribute__是无条件被调用. 对任何对象的属性访问时,都会隐式的调用__getattribute__方法,比如调用t.__dict__,其实执行了t.__getattribute__("__dict__")函数.所以如果我们在重载__getattrib...

2014-10-09 13:16:48

阅读数:5551

评论数:0

飘逸的python - descriptor(描述器)就是这么回事

很多教程往往把descriptor说的很复杂,长篇大文,洋洋洒洒,结果很多人看的云里雾里. 其实就一句话,对类的操作进行hook,以此控制行为. 大部分时候是用来拦截对实例属性的访问。 只要类中有__get__(), __set__(), 和 __delete__()其中之一的方法.那么它就是一个...

2014-10-08 17:13:05

阅读数:4906

评论数:0

飘逸的python - ord和chr以及unichr

ord是unicode ordinal的缩写,即编号 chr是character的缩写,即字符 ord和chr是互相对应转换的. 但是由于chr局限于ascii,长度只有256. 于是又多了个unichr. >>c = u'康' >>c u'\u5eb7' >&...

2014-10-08 11:42:00

阅读数:4112

评论数:0

飘逸的python - 演示一种死锁的产生

搞多线程的经常会遇到死锁的问题,学习操作系统的时候会讲到死锁相关的东西,我们用python直观的演示一下。 死锁的一个原因是互斥锁。假设银行系统中,用户a试图转账100块给用户b,与此同时用户b试图转账200块给用户a,则可能产生死锁。 2个线程互相等待对方的锁,互相占用着资源不释放。 #codi...

2014-10-07 17:39:10

阅读数:2981

评论数:0

飘逸的python - 实现链式调用

用过jquery的一般都知道在jquery中可以链式调用,代码简洁优雅。比如$(“a”).addClass(“test”).show().html(“foo”);。 在redis-py中的pipeline中也可以链式调用,比如pipe.set('foo', 'bar').sadd('faz', '...

2014-10-06 21:51:42

阅读数:6327

评论数:0

飘逸的python - 写个端口扫描器及各种并发尝试(多线程/多进程/gevent/futures)

端口扫描器原理很简单,无非就是操作socket,能connect就认定这个端口开放着。 import socket def scan(port): s = socket.socket() if s.connect_ex(('localhost', port)) == 0: ...

2014-10-06 15:04:39

阅读数:7562

评论数:0

飘逸的python - 一个简单的AST(抽象语法树)

假设对'a + 3 * b'进行解释,其中a=2,b=5 代码很简单,就不再进行详细的解释了。 Num = lambda env, n: n Var = lambda env, x: env[x] Add = lambda env, a, b:_eval(env, a) + _eval(env, ...

2014-10-04 11:58:20

阅读数:4932

评论数:0

提示
确定要删除当前文章?
取消 删除
关闭
关闭