Archive for the ‘python’ tag
Python写的排列组合函数
昨天做东西的时候用到这个了。转过来的,觉得不错先记下了。
def comb(items, n=None):
if n is None:
n = len(items)
for i in range(len(items)):
v = items[i:i+1]
if n == 1:
yield v
else:
rest = items[i+1:]
for c in comb(rest, n-1):
yield v + c
def perm(items, n=None):
if n is None:
n = len(items)
for i in range(len(items)):
v = items[i:i+1]
if n == 1:
yield v
else:
rest = items[:i] + items[i+1:]
for p in perm(rest, n-1):
yield v + p
yield这个关键字,可以看一下limodou的一[Python 学习]2.5版yield之学习心得。
Why Perl, not Python
此post并不是想引起语言之争,只是自己的一个针对特定情况的小发现而已。
在信息安全领域,Perl和Python一直是安全工作人员的好帮手,开发快速,简单,无须编译直接运行……这些优点,使它们成为写injector/sender的不二选择。
一般来说,做exploit的初期,通常会需要发送大量的数据,一般来说比较常见的是这样的Perl语句:
$ perl -e 'print "A" x 10240'
我原来也一直在用这样的语句,但是今天想想,为什么一定要用Perl啊,Python其实也有一样的功能嘛:
$ python -c 'print "A" * 10240'
小测试了一下,原来用Perl还是有原因的——速度。Perl的速度还真不是盖的。当然,Perl出现得比较早,hacker们形成了传统也说不定。
$ time perl -e 'print "a" x 10240' > /dev/null real 0m0.008s user 0m0.000s sys 0m0.008s
$ time python -c 'print "a" * 10240' > /dev/null real 0m0.024s user 0m0.001s sys 0m0.023s
再写一个C程序,做同样的事情。
char buf[10240];
int i;
int main()
{
for (i = 0; i < 10240; i++)
buf[i] = 'a';
write(1, buf, 10240);
return 0;
}
C程序测试结果如下:
$ time ./test > /dev/null real 0m0.005s user 0m0.000s sys 0m0.003s
果然还是C语言的最快,不过,Perl和Python在开发上的便捷性弥补了它们在速度上的小劣势。
再回到Perl和Python的比较上来,在做这一件事上,Perl比Python要快,这是没得说的了,数据说话。因此,在快速测试时,估计我以后也是用Perl来直接输出字符串了。不过在写正式的exploit时,Python比Perl更整洁点,我还是会选择Python的。
Python 3.0 released!
既然是 3.0,自然和 2.x 是有区别的。看了一下 What’s New,觉得变化挺大的,一些函数的行为发生了变化,还有一些函数的实现不同了。看来 Python 的书又得翻新了。
变化比较大的是 print 从 statement 变成了 function,然后就是 unicode 和 8-bit 字符,这两个印像比较深点。其他的什么东西,到真正用上再慢慢了解了。
另,刚刚用 Django-0.96 配上 MySQL 做了一个很丑的程序,呵呵,交差用的。
读 Dive Into Python 的一点小感受
这两天累过之后,想找点轻松的东西来看一下,于是想到了 Python。一口气把 Dive Into Python 看了四章,虽然看的大都是以前都知道的东西了,但是还是有另外的收获。
我平时多用 C 和 ASM,但是也自认为对于“面向对象”这个概念算是理解得比较透了,但是今天看了那本书才知道自己的理解还是比较肤浅的。在 Python 里面,万物皆对象这个说法确实不假。有的例子一下看下去,楞是没得回过神来。“对象”这个概念真是还没有深入我的心中,呵呵。
这样子看下去,自己却又多少觉得不习惯。在习惯了 C 和 Java 这些强类型定义的语言之后,Python 里面灵活的处理方式让我多少有点不适应,感觉过于灵活而难以掌控。