2008年2月15日

enumerate() 我们相识得太晚了 >_<

一直以来,我都被一个问题困扰着,怎么优雅的完成这样的代码.
for i in range(len(L)):
item = L[i]
# ... compute some result based on item ...
L[i] = result
昨天在帮猪君战这个程序的还被着实的郁闷了一把

def balance(size_list):
size_list.sort()
size_list.extend([0]* len(size_list))
a = size_list[0::2]
b = size_list[1::2]
while(True):
a_value = sum(a)
b_value = sum(b)
diff = a_value - b_value
min_set = (abs(diff),0,0)
for i in xrange(len(a)):
for j in xrange(len(b)):
tmp_diff = abs(diff - (a[i] - b[j])*2)
if tmp_diff < min_set[0]:
min_set = (tmp_diff, i, j)
if abs(diff) <= min_set[0]:
break
else:
tmp = a[min_set[1]]
a[min_set[1]] = b[min_set[2]]
b[min_set[2]] = tmp
def is_not_zero(x):
return x != 0
return (filter(is_not_zero, a),filter(is_not_zero,b), min_set[0])

结果,今天在reddit上乱晃的时候看到Intermediate Python: Pythonic file searches,
看到用了enumerate这个内置函数,果然够 Pythonic.

虽然性能还是有点损失,不过,代码清晰不少,告别for i in range(list) , 这样写吧.
for i, item in enumerate(L):
# ... compute some result based on item ...
L[i] = result

娘的,居然是python 2.3就加入的特性,人家居然现在才知道,
立马订阅了pep的rss - -#

2008年2月11日

setjmp/longjmp

春节在家没什么事情,于是拿出久未用过的C,自己折腾点小东西(以后做出来了再详细的写),顺便翻翻节前买的《C专家编程》
在讲堆栈的那章里,看见C标准库里的一对函数 setjmp/longjmp。突然发现自己对C,确实不够了解。

setjmp/longjmp 还有 sigsetjmp/siglongjmp 原理其实很简单,setjmp 保存一个栈顶指针,返回0,在longjmp调用时,回到setjmp的返回点,并且返回longjmp的第2个参数。

用法大概如下:

#include <stdio.h>
#include <setjmp.h>

jmp_buf buff;

void do_jump()
{
printf("do_jump\n");
longjmp(buff, 1);
}

int main()
{
switch(setjmp(buff))
{
case 0:
printf("start\n");
do_jump();
break;
case 1:
printf("end\n");
break;
}
}
输出
start
do_jump
end

在复杂的状态机中跳出,或者进行错误恢复,简单的代替C++的catch/throw 应该是不错的吧。

不过,这玩意儿,估计调试起来,比goto还麻烦,应该也是不常见人用的原因。

2008年2月2日

再见,深图!

离开深圳的日子近了,陆陆续续的在把一些在深圳办理的服务停掉。
恰好今天临时有事,请了半天年假出来晃悠,抽空去了次图书馆,把想把借书证退掉,拿回押金300大洋。

到了深图,把原先借的3本书还了,径直的走到服务台。把借书证和身份证给了图书管理员mm,
“退卡。”突然有些忐忑,因为,交押金的时候,给了我3张票据,说是退卡时要。
只见管理员mm麻利填号单子,然后又说,卡里有5.8 rmb的预付款,要不要取出来。这不是废话么,我都不要卡了,还和我说这个。 - -# 应和了一声,305.8 rmb交到我手里,长嘘了口气,原来不用那几张票据,转而又怒了,不需要当时还扯那些蛋,让我早上翻箱倒柜了n久 >_<。 恩?还有那张卡也还给我了...

“这卡还给我?”
“这是阅读卡,帐号保留。”
“我都要离开深圳了,没用。”
“以后有机会还可以来呀!”
“哦,那留个纪念吧。”

突然有些伤感,在深圳生活这2年多,要说有感情的地方,大概也就是深图了。大概自己是爱书之人,而深图藏书虽不算多,也基本堪用,服务,硬件甚至建筑在国内也算一流。对于没见过什么世面的我来说,对这里还是有些眷恋的。 。 缓步走出深图,在大厅的一个垃圾桶,看到了这个:
一张丢在垃圾桶里的借书证。不禁有些惋惜,深圳终究是个移民城市,人们来了又走。年关到了,也正是很多人和深圳说再见的时候,大概,这张卡是永远没有机会用了。
不过,同是一个爱读书之人,难道,就不能把这张小小的卡片作为深图的一个礼物带走么,丢弃了,于心何忍。
深图的设计也有些问题,借书证是RFID的射频卡,有那么点成本。不需要工本费发放,就应该做成可重复利用的系统。这样的浪费,大概也只有深图才能承受吧 (._.!)

sigh,再见,深图。