星期三, 十二月 31, 2008

曾国藩言(一)

天下事,有所利有所贪者成其半,有所激有所逼者成其半

星期六, 十二月 13, 2008

basic tips of python(2)

1、==与is:python可以通过使用 == 比较任意两个 Python 对象(不只是类实例),返回的值不是比较内存地址的值(不同于java),而是返回比较对象调用__cmp__方法后的值。
例如,dict在有着全部相同的关键字和值时返回true,list在元素个数一样,且各个值也相等时也是true。自己写的类通过编写 __cmp__ 方法,来自定义比较逻辑,然后你可以使用 == 来比较你的类,Python 将会调用你的 __cmp__ 专用方法。
那何如判断两个对象的地址一样呢(引用的是不是一个地方),可以用is,或者用id()取对象地址。

2、class中的方法,默认第一个参数一定是self。如果想不创建对象而直接引用module后调用的话,除了可以用@classmothed修饰,通常的做法是在module里定义个一个class的对象,然后引用它的方法。比如:
class a:
__str__ = "this is a class of test method"
def gen(self):
return self.__str__

_a = a()
gen = _a.gen #在另外的module中直接引用gen,实际上,_a.gen就把_a当作self传过去了

3、对文件路径的操作,除了os 和path外,还可以import glob。
glob.glob()方法支持用通配符过滤,比如glob.glob('*.mp3')返回的就是相对路径下的mp3文件名。
glob.glob("G:\music\pop\*.mp3"),返回的是这个路径下所有匹配的文件名。

星期二, 十一月 25, 2008

in\exists子查询的区别和联系

in查询:(left expression)in (select_sub_expression )

exists 查询:(left expression)exists (select_sub_expression )

  两种方式的执行过程有些差别。执行EXISTS子查询,数据库系统会首先检查主查询,然后运行子查询 直到它找到第一个匹配项。执行IN子查询,首先执行子查询,并将获得的结果列表存放在在一个加了索引的临时表中。在执行子查询之前,系统先将主查询挂起, 待子查询执行完毕,存放在临时表中以后再执行主查询。

还是昨天的例子
有3个表:
s:学生表;
c:课程表;
sc:选课表

--查询一个sid为002的学生没有选的课程,用in查询的语句是:
1):select * from c where c.cid not in (select sc.cid from sc where s.sid='002')
--等价于下面的exsits语句
2):select * from c where not exists (select sc.cid from sc where s.sid='002' and c.cid = sc.cid)

语句1先执行子查询,即先把所有002学生选的课程的ID查出来了,然后执行主查询,看看哪些课程的ID不在子查询的结果集中。
语句2先执行主查询,即先把所有的课程查出来,然后再遍历结果集,看看not exists是不是true。找到满足c.cid <> sc.cid(因为exists前有一个not)的条件时,便输出。

考虑下面的查询:
--选修了所有课程的学生==不存在一门课,该学生没有选
select sname from s where not exists(
select * from c where c.cid not in (select cid from sc where sc.sid = s.sid))

==
select sname from s where not exists(
select * from c where not exsits (select cid from sc where sc.sid = s.sid and c.cid = sc.sid))

星期一, 十一月 24, 2008

python中类的静态方法(方法修饰符)

python中除了最常用类实例方法外,还有类方法和静态方法两种。
##############################
#类方法
##############################
class Foo:
        str = "I'm a static method."

        @classmethod     #方法修饰符――指明该方法为类方法
        def bar(cls):         #cls为类对象,可以通过他引用静态数据成员
            print cls.str
           
Foo.bar()                      #静态方法的调用方法一:类对象.方法名()
o1 = Foo()
o1.bar()                        #静态方法的调用方法二:类实例对象.方法名()

##############################
#静态方法
##############################
class Foo:
        str = "I'm a static method."

        @staticmethod
        def bar():                        #没有cls参数
            print Foo.str
           
Foo.bar()
o1 = Foo()
o1.bar()

更多见

Python类的基础入门知识

星期五, 十月 31, 2008

python解决一个面试题

                Test  your  WebQ!

          69  66  20  79          6F   75   20   63
          61  6E  20  72          65   61   64   20
          74  65  69  73          20    77   65   20
          77  61  6E  74          20   79    6F  75

Are you read to shape the future of the web?

实际上不难看出应该是一个16进制标识的字符矩阵
用python写程序有:
s = '''
          69  66  20  79          6F   75   20   63
          61  6E  20  72          65   61   64   20
          74  65  69  73          20    77   65   20
          77  61  6E  74          20   79    6F  75
      '''
print ''.join(map[lambda x: chr(int(x,16)), s])

result:
if you can read teis we want you
源贴见http://groups.google.com/group/pongba/browse_thread/thread/1891961524ea733e

其中有几个python的函数和特性的妙用:
1、用join函数来把一个字符的数组拼成一个字符串。''.join()的妙用可以处理此类问题
2、chr()函数用来转换ACII码数字为字符,int()函数传入参数转换16进制为十进制
3、lambda定义单行函数很适合此处的处理
4、map()函数可以对一个list中的各元素执行一个function后,形成一个新的list。等同于[(lambda x:chr(int(x,16)))(n) for n in s.split()]

星期二, 九月 23, 2008

Fwd: 关于称小球的解法



---------- Forwarded message ----------
From: 王莆中 <wangpuzhong@gmail.com>
Date: 2008/9/23
Subject: 关于称小球的解法
To: 宋庆浪gmail <songsql@gmail.com>, 张朋元 <shangdinizaina@gmail.com>, 杨政gmail <leony66@gmail.com>, 潘永杰gmail <hbdl506@gmail.com>


还记得网上流传的一个微软的面试题吗――给12个一模一样的小球,中间有一个重量比其它的小球稍重,用一个天平需要至少称几次才能找出那个小球?
结果当然是3,这个不多说。

昨天在一个邮件列表上看到有人讨论这个问题,然后还扯出香农的信息论和理论。一时好奇就看了一下,结果当时以为是想清楚了,还和老大吹了牛逼,但是后来想想发现我理解错了。今天终于想通了,给大家汇报一下。

首先,来看看12球这个集合中总熵为多少。
熵的计算公式:http://upload.wikimedia.org/math/d/b/7/db72f4463b48f5eb522c5bb92cae5028.png

在这个题目里,12个球中任意一个小球的重量稍重都是有可能的,视为等概率,则n=12,Pi = 1/12,Hs=log(12)。在这里,log代表以2为底的对数函数。那么,根据信息论的解释,每一次称天平都在减少不确定性(也就是每称一次就越接近目标一次),不确定性的减少意味着熵的减少。当熵减少到0的时候,就是找出小球的时候。

假如一堆球分成三份的话,那么称一次可以找到是哪一堆的重量稍重,也就是说每称一次天平,获得的信息量为 -1/3log(1/3)-1/3log(1/3)-1/3log(1/3)=log3

那么,假设最少要称N次,有N*log3>=log12,即 3的N次方>=12,显然,N=3的时候满足条件。

如果题目换一种出法:给一个天平让你称3次,最多可以在多少个小球中找到那个稍微重一点的?
由刚刚的结论得出――如果称三次的话,最多可以从3的3次方=27个小球中找到目标。

当然,这种解法只给出了一个底值,但是不知道具体步骤。
over

星期二, 九月 09, 2008

python的函数调用参数

python函数调用的参数有4种
  1 Positional Arguments,如func(1,2)
  2 Keyword Arguments,如func(x=1,y=2)
  3 Non-keyword Variable Arguments (Tuple)
   如args=(1,2),func(*args)
  4 Keyword Variable Arguments (Dictionary)

星期一, 九月 08, 2008

basic tips of python(1)

basic tips:
1、切片符[0:3]指从0-3但是不包括3,类型其它语言的 (i>=0 & i<3)
2、python类中的属性也有类属性和对象属性之分,分别用classname. 以及 objcet.的前缀来调用
3、file初始化的时候可以新建或者打开文件,打开的话要传入'w'参数
4、python的try...expect\try...finally\raise 与delphi的极为相似――基本一样
5、python中有docstrings,用来作为函数、类的注释,用'''Prints the maximum of two numbers'''(3个')来表示
6、函数体中默认声明的是局部变量,加上global 关键字则是全局的
7、OS模块可以帮助写跨操作系统的程序,同时也提供了操作OS下资源的接口,比如删除文件

星期四, 五月 08, 2008

布罗代尔

法国历史学家布罗代尔就曾经指出,任何时期、任何国家的上层都是由5%的人口构成的。这种被称作“布罗代尔5%法则”的现象,在欧洲和美国表现得特别明显。