星期六, 十二月 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()
更多见
##############################
#类方法
##############################
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!
实际上不难看出应该是一个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()]
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
实际上不难看出应该是一个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>
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球这个集合中总熵为多少。
熵的计算公式:
在这个题目里,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
结果当然是3,这个不多说。
昨天在一个邮件列表上看到有人讨论这个问题,然后还扯出香农的信息论和熵理论。一时好奇就看了一下,结果当时以为是想清楚了,还和老大吹了牛逼,但是后来想想发现我理解错了。今天终于想通了,给大家汇报一下。
首先,来看看12球这个集合中总熵为多少。
熵的计算公式:

在这个题目里,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)
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下资源的接口,比如删除文件
订阅:
博文 (Atom)