python challenge 29解题总结

python challenge 29网址:www.pythonchallenge.com/pc/ring/guido.html用户名是repeat 密码是 switch

查看网页源代码会发现提示silence!
发现网页源码后面后很多行长短不一的空格行
用每行空格的数量组成列表
转成字符串,是BZh打头
用bz2解压字符串,得到 yankeedoodle

源代码如下:

 

def level_29():
	auth=urllib2.HTTPBasicAuthHandler()
	auth.add_password('the order matters','www.pythonchallenge.com','repeat','switch')
	openr=urllib2.build_opener(auth)
	r=openr.open('http://www.pythonchallenge.com/pc/ring/guido.html')
	data=r.read().split('n') # 读取网页内容
	print len(data)
	sdata=[x for x in data if x.strip()==u''] # 过滤掉非空格行
	print len(sdata)
	s=''.join([chr(len(x)) for x in sdata]) # 把每行空格数转成字符
	print s # 看到是BZh打头的
	rslt=bz2.decompress(s) # 用bz2解压之
	print rslt

下一关的网址:www.pythonchallenge.com/pc/ring/yankeedoodle.html用户名是repeat 密码是 switch

阅读全文 »

python challenge 30解题总结

python challenge 30网址:www.pythonchallenge.com/pc/ring/yankeedoodle.html用户名是repeat 密码是 switch )。


  • 网页注释提示 <!-- while you look at the csv file -->
  • 下载 http://www.pythonchallenge.com/pc/ring/yankeedoodle.csv
  • 打开一看是逗号分割的,每行七个小于1的浮点数,总共有900多行
  • 基本思路是:将浮点数的总数(7367)做因式分解,得到53和139
  • 然后以此做为宽和高,用浮点数与256的乘积作为灰度值画成图片,
  • 调整方向后得到公式
  • 根据公式对浮点数3个一组操作,将结果转换为字符,得到下一关的名称。

源代码:

def level_30():
	f=open(ur'd:yankeedoodle.csv')
	data=' '.join(f.read().splitlines())
	f.close()
	fields=data.split(', ') # 注意是逗号加空格!如果只是空格,则后面拼message时只会得到乱码。
	print len(fields)

	n=len(fields) # 输出 7367

	# 因式分解之
	def factor(n):
		"Adapted from http://www.math.utah.edu/~carlson/notes/python.pdf"
		d = 2
		factors = []
		while not n % d:
			factors.append(d)
			n /= d
		d = 3
		while n > 1 and d * d <= n:
			if not n % d:
				factors.append(d)
				n /= d
			else:
				d += 2
		if n > 1:
			factors.append(n)
		return factors

	print factor(n) # 输出 [53,139],也就是说 53*139=7367

##	im=Image.new('L',(53,139))
##	idata=[chr(int(float(x)*256)) for x in fields]
##	im.fromstring(''.join(idata))
	im=Image.new('F',(53,139)) # 'F'表示直接使用浮点数
	im.putdata(map(float,fields),256)
	im=im.transpose(Image.FLIP_LEFT_RIGHT) # 左右翻转
	im=im.transpose(Image.ROTATE_90) # 旋转90度
	im.show() # 能看到公式 n=str(x[i])[5]+str(x[i+1])[5]+str(x[i+2])[6]

	nlist=[]
	for i in range(0,n-2,3):
		n=chr(int(fields[i][5]+fields[i+1][5]+fields[i+2][6]))
		nlist.append(n)
	print ''.join(nlist)

下一关网址:www.pythonchallenge.com/pc/ring/grandpa.html用户名是repeat 密码是 switch )。

阅读全文 »

python challenge 31解题总结

python challenge 31网址: www.pythonchallenge.com/pc/ring/grandpa.html ( 用户名是repeat 密码是 switch) 点击岛礁图片 要求用户名和密码,uri是"island : country" 网页注释中提示 !-- short break, this ***REALLY*** has nothing to do with Python -- 先猜猜哪个岛礁是哪里? google 礁石 形状像性器官,找到 http://www.szvipp.com/ctrip/thalland/thallandscenici.html 再google 拉迈海滩之南 性器官 找到 http://www.successfultravel.com.hk/travel_info/koh_samui.htm 原来是泰国(thailand)的苏梅岛(koh samui),这里有两块岩石分别很像男女性器官,分别叫做叫 祖父石 (Hin Ta) 和祖母石 (Hin Yai) 用 kohsamui 和 thailand 做用户名密码,进入 http://www.pythonchallenge.com/pc/rock/grandpa.html 网页显示 That was too easy. You are still on 31... UFOs? 没思路啦 看攻略。。。。。和分形图有关 网页中的图像名为 mandelbrot.gif google 得知 mandelbrot 是法国数学家和分形理论家,其发现了著名的 mandelbrot集合 定义  曼德布洛特集合(Mandelbrot set)是在复平面上组成分形的点的集合。Mandelbrot集合可以用复二次多项式f(z)=z^2+c来定义。 其中c是一个复参数。对于每一个c,从z=0开始对f(z)进行迭代 序列 (0, f(0), f(f(0)), f(f(f(0))), .......)的值或者延伸到无限大,或者只停留在有限半径的圆盘内。 曼德布洛特集合就是使以上序列不延伸至无限大的所有c点的集合。 从数学上来讲,曼德布洛特集合是一个复数的集合。一个给定的复数c或者属于曼德布洛特集合M,或者不是。 根据网页注释中的提示 left="0.34" top="0.57" width="0.036" height="0.027" 将上面的数字作为分形函数的参数,攻略上说参数“top”实际上应该是“bottom” 自己按照给出的参数画出同样的分形图 下面的分形函数 mandelbrot 直接抄袭自官方攻略 源代码: def level_31(): url = 'http://kohsamui:thailand@www.pythonchallenge.com/pc/rock/mandelbrot.gif' ufos = Image.open(StringIO(urllib.urlopen(url).read())) def mandelbrot(left=0.34, bottom=0.57, width=0.036, height=0.027,max=128, size=(640, 480)): xstep = width / size[0] ystep = height / size[1] for y in xrange(size[1] - 1, -1, -1): for x in xrange(size[0]): c = complex(left + x * xstep, bottom + y * ystep) z = 0+0j for i in xrange(max): z = z * z + c if abs(z) 2: break yield i # 因式分解之 def factor(n): "Adapted from http://www.math.utah.edu/~carlson/notes/python.pdf" d = 2 factors = [] while not n % d: factors.append(d) n /= d d = 3 while n 1 and d * d = n: if not n % d: factors.append(d) n /= d else: d += 2 if n 1: factors.append(n) return factors mandel = ufos.copy() # 直接使用原图的类型、大小和调色板 mandel.putdata(list(mandelbrot())) mandel.show() # 自己画出的图像看上去和给出的图一样 # 通过比较像素确定自己画的图和给出的图的差异 differences = [(a - b) for a, b in zip(ufos.getdata(), mandel.getdata()) if a != b] print len(differences) # 输出 1679,说明实际上有1679处不同 print set(differences) # 输出set([-16, 16]),说明实际上所有差异都是16或者-16 # 调用level30里面用过的因式分解函数 print factor(len(differences)) # 输出 [23, 73] ,说明可以解析为23×73的图像 # 构造 23×73的图像,放大10倍后显示 plot=Image.new('L',(23,73)) plot.putdata([(i 16) and 255 or 0 for i in differences]) # 是-16则设为255,否则设为0 plot.resize((230, 730)).show() # 显示一幅奇怪的图像 # google得知 上面显示的图是由位于美国波多里格的Arecibo天文台的目前全球最大的射电望远镜 # 发射到外太空以期与外星人沟通的无线电信号。Arecibo天文台的射电望远镜口径350米,就是007《黄金眼》 # 中出现的那个超大的湖水下的大碗(又想起了里面的漂亮MM ^_^)。 # 信号含义见 http://zh.wikipedia.org/wiki/%E9%98%BF%E9%9B%B7%E8%A5%BF%E5%8D%9A%E4%BF%A1%E6%81%AF # 下一关的key就是 arecibo == http://www.pythonchallenge.com/pc/rock/arecibo.html 下一关网址: www.pythonchallenge.com/pc/rock/arecibo.html (用户名是kohsamui ,密码是thailand ) ...

阅读全文 »

python challenge 32解题总结

python challenge 32网址: www.pythonchallenge.com/pc/rock/arecibo.html 好像是个游戏 每行没列前头都用数字表示本行本列各连续方块的个数 网页提示 Fill in the blanks !-- for warmup.txt -- 下载 http://www.pythonchallenge.com/pc/rock/warmup.txt Dimensions 9 9 Horizontal 2 1 2 1 3 1 5 7 9 3 2 3 2 2 3 2 2 3 2 Vertical 2 1 3 1 2 3 3 8 9 8 3 1 2 3 2 1 3 网上查了一下,这种根据行列连续块的信息还原点阵图的游戏有个专门的名称叫Nonogram 见 http://zh.wikipedia.org/zh-cn/Nonogram 完成程序的过程比较曲折: 1)一开始看到是9*9的小图,就直接用0-512枚举生成每行每列的可能, 然后用穷举的方式通过正则匹配测试,得到了画着上箭头的图 == http://www.pythonchallenge.com/pc/rock/up.html 此时得到的需要还原的图是 32*32 的大图,原来的生成每行每列可能排列的方法的效率太低,没法用了; 2)然后用非递归方式写出生成每行每列可能排列的新方法(genlist()),但是在进行穷举时,发现 需要穷举的次数是个天文数字了,根本不可能短时间内算出结果; 3)经过仔细研究,开始尝试先从现有的可能排列中得到能确定是留空还是填充的点,再根据这些点反过来再次过滤所有 可能以去掉不符合的排列,然后再根据保留下的可能排列再次得到能确定的新的留空/填充的点,再用这些点反过来 过滤掉不符合的排列,如此反复进行 确定留空/填充点- 过滤不符合排列- 确定新的留空/填充点,经过26次后 终于将32*32个点都确定,最终得到画着蟒蛇的图; 4)最初的程序需要执行近22秒,经过优化后,单独执行大概需要近2秒,基本满意。后来从攻略中看到了 通过递归生成每行每列可能排列的函数(genv()),稍微修改就拿来用了,比genlist()要快0.5秒。 现在的程序算这个32*32的蟒蛇图需要约1.5秒(test3())。 5)考虑到应该尽早的以行/列新确定的点为过滤条件减少对应列/行的可能排列,这样可以减少迭代次数,并且减少函数调用 将主要逻辑放在一起,经测试32*32需要约1.3秒(test4()) 根据蟒蛇图 == http://www.pythonchallenge.com/pc/rock/python.html ps: 值得注意是网页也给出了解出的蟒蛇图js代码( http://www.pythonchallenge.com/pc/rock/python.js ) 网页提示: Congrats! You made it through to the smiling python. Free as in Free speech , not as in free... 上面每个单词都认识,组合起来啥意思不知道:(,google之 搜 Free as in Free speech, not as in free 搜到第一条是 http://www.gnu.org/philosophy/free-sw.html 中的 Free software is a matter of liberty, not price. To understand the concept, you should think of free as in free speech, not as in free beer. 好像意思是说自由软件指权利上的自由而不是指免费。要理解这一点,你可以比较 自由演讲 和 免费啤酒 中的free的区别。 所以提示中 free... 中的 ... 指的是 beer == http://www.pythonchallenge.com/pc/rock/beer.html 源代码如下: def level_32(): def test3(width,height): UNKNOWN,FILL,EMPTY='?','1',' ' resovled=[[UNKNOWN for _ in xrange(width)] for _ in xrange(height)] totalnumber=width*height print totalnumber def genv(v,l,marks): '''递归方式获取可能的排列 v=描述串(tuple列表) l=行/列长度 marks=(填满,留空) ''' r=[] j=0 if v: if len(v)==1: j=1 for i in range(l+2-len(v)-sum(v)): ri=marks[1]*i+marks[0]*v[0]+marks[1]*(1-j) if j: rr=[marks[1]*(l-len(ri))] else: rr=genv(v[1:],l-len(ri),marks) r+=[ri+vv for vv in rr] return r else: return [marks[1]*l] # 非递归方式获取可能的排列,比上面递归方式的genv要慢一点 def genlist(dim,blocklist,marks=('1','0')): '''非递归方式获取可能的排列 dim=行/列长度 blocklist=描述串(tuple列表) marks=(填满,留空) ''' ret=[] blankcnt=dim-sum(blocklist) blockcnt=len(blocklist) idxl=[1 for i in xrange(blockcnt+1)] idxl[0]=0 idxl[-1]=blankcnt-(blockcnt-1) cur=len(idxl)-2 tmp=cur while tmp!=-1: tmpstr=''.join([ marks[1]*idxl[x]+marks[0]*blocklist[x] for x in range(blockcnt)]+[marks[1]*idxl[-1],]) ret.append(tmpstr) if idxl[-1]==0: # 需要进位 tmp=cur-1 # 上一位 while tmp!=-1: # tmp=-1 无位可进,说明列举完毕,退出 if idxl[tmp] blankcnt-(blockcnt-tmp-1)-sum(idxl[:tmp]): # 此位可以再增加1 idxl[tmp]+=1 for i in range(tmp+1,blockcnt): idxl[i]=1 idxl[-1]=blankcnt-sum( ...

阅读全文 »

从两道趣味题目看python的简洁性

本文给出了两道趣味题目的 python 解法,足以说明 python 的简洁和可爱

  

下面给出了两道趣味题:

  1. 题目1是要求算一任意长度字符串中不同的字符以及它的个数。
  2. 题目2是把一段字符串用“右起竖排”的古文格式输出。

都是针对字符串的操作,逻辑比较简单,灵活在对不同语言、语法的掌握程度。

看了大家用Java、C#、C++等语言的实现,总感觉牛刀杀鸡太麻烦,有兴趣的朋友可以自己写写看或者直接看原文的网友回复。最近一段时间 Python写的比较多,读到这些题目时候,就有一种跃跃欲试的冲动。因为我知道用Perl, Python, Ruby等动态语言来做这类题目,会是非常理想的。后来我做了这两道题目,结果也令人满意,代码之简洁保持在所有答案的前列。

先看第一题:

dic = {}
for s in "abcdefgabc":
    dic[s] = 1 if s not in dic else (dic[s]+1)
print 'n'.join('%s,%s' % (k, v) for k, v in dic.items())

输出结果:

a,2
c,2
b,2
e,1
d,1
g,1
f,1

四行代码分别做了dictionary的声明,赋值,字符串的遍历,以及高效拼接。

如果还没有看出它的简洁和强大的话,请看第二题的解法:

def main(offset=6):
    string = u'静夜思 李白床前明月光,疑似地上霜。举头望明月,低头思故乡。090131'
    a = [[' ']*offset for row in xrange(offset)]
    for i in xrange(offset):
        for j in xrange(offset):
            a[i][j] = string[j + i*offset]
    b = [[r[col] for r in a[::-1]] for col in xrange(len(a[0]))]
    print 'n'.join([u'┊'.join(unicode(c) for c in row)for row in b])

输出结果:

0┊低┊举┊疑┊床┊静
9┊头┊头┊似┊前┊夜
0┊思┊望┊地┊明┊思
1┊故┊明┊上┊月┊ 
3┊乡┊月┊霜┊光┊李
1┊。┊,┊。┊,┊白

这题如果用C#等实现,代码要在20行以上。下面我简单介绍一下这几行代码:

  1. 第3行,在Python里面二维“数组”通过嵌套list来实现,这里初始化一个6行6列的二维数组;
  2. 第7行,我们把“矩阵”顺时针旋转了90度(行列置换,并且对置换后的行首尾对调-这里的::-1就是用来置换一个list的 trick);
  3. 最后一行,我们把数组里的每行中元素,每行之间分别用两个不同字符拼接起来。join方法以及for..in..语句在python中是 相当常见的用法。

通过这两题,我们看到Python在处理字符串时候的十分灵活方便,虽然一种语言的好坏不应完全靠是否简洁来衡量,但对于我个人而言,Python 是目前我用过的最好的语言。而且对于趣味题来说,这不就是我们解题的趣味所在吗?

阅读全文 »

Mac Port简介和基本使用方法

熟悉开源系统的人可能就知道port(包管理的一种方式)是BSD世界里的东西,而Mac Port即是为开源项目而诞生的.你可以利用命令行安装很多开源库的软件.Mac Port其实类似debian的apt, redhat里的yum. 1.Mac Port的简介: Mac Port 官方网站: http://www.macports.org/ Mac Port的下载地址 http://www.macports.org/install.php Mac Port的说明文档 http://guide.macports.org/ Mac Port安装方式:DMG安装方式不需要介绍,唯一需要主要的是在最后的过程中会一直出现剩余1分钟,运行脚本,这就是由于网络的原因,可以尝试多试几次,如果还不能成功的话,只能选择从源码,如果不需要更改任何东西的话,直接./configure make sudo make install就行了。 Mac Port中第三方软件下载包存放的默认路径是:/opt/local/var/macports/distfiles/ 。为了提高安装速度,可以在安装新port时直接将此目录下的文件拷贝到新的Mac Port相同的目录中就可以避免Port去网上下载。 2.Mac Port的基本使用方法: 使用Mac Port前应该首先更新Port的index :sudo port selfupdate $ sudo port selfupdate Password: Warning: port definitions are more than two weeks old, consider using selfupdate --- Updating the ports tree --- Updating MacPorts base sources using rsync MacPorts base version 1.9.2 installed, MacPorts base version 1.9.2 downloaded. --- MacPorts base is already the latest version The ports tree has been updated. To upgrade your installed ports, you should run port upgrade outdated 查看Mac Port中当前可用的软件包及其版本 : port list $ port list rabbitmq-server @2.4.0 net/rabbitmq-server AppHack @1.1 aqua/AppHack AppKiDo @0.985 aqua/AppKiDo AquaLess @1.6 aqua/AquaLess ArpSpyX @1.1 aqua/ArpSpyX AssignmentTrackerX @2.0beta3.1 aqua/AssignmentTrackerX BigSQL @1.0 aqua/BigSQL BiggerSQL @1.3.9 aqua/BiggerSQL Books @3.2.5c aqua/Books ...... 搜索需要安装的软件包:port search XXX $ port search maven maven @1.0.2 (java, devel) A java-based build and project management environment. maven-ant-tasks @2.0.10 (devel, java) Use many of Maven's artifact handling features from Ant. maven2 @2.2.1 (java, devel) A java-based build and project management environment. maven3 @3.0.3 (java, devel) A java-based build and project management environment. maven_select @0.3 (sysutils) Switch the default Maven java build tool Found 5 ports. 查看具体的软件包的内容和说明:port info XXX $ port info maven2 maven2 @2.2.1, Revision 3 (java, devel) Description: Maven is a Java project management and project comprehension tool. Maven is based on the concept of a project object model (POM) in that all the artifacts produced by Maven are a result of consulting a well defined model for your project.Builds, documentation, source metrics, and source cross-references are all controlled by your POM. Maven 2.0 is a complete rewrite of Maven 1.0 and as such is better organized, faster and easier to use. Homepage: http://maven.apache.org/ Build Dependencies: kaffe Library Dependencies: maven_select Platforms: darwin License: unknown Maintainers: blair@macports.org, gk5885@kickstyle.net 查看即将安装的或者已经安装的软件包的依赖关系:port deps XXX $ port deps maven2 Full Name: maven2 @2.2.1_3 Build Dependencies: kaffe Library Dependencies: maven_select 查看了软件包的内容和说明,并确认确实要安装:sudo port install XXX 安装完毕之后,清除安装时产生的临时文件 :sudo port clean --all XXX 卸载已经用Mac Port安装的软件 :sudo port uninstall XXX ...

阅读全文 »

enumerate初识

一直在研究怎么写代码更加pythonic,今天在读《The Python Standard Library》的时候重新研究了一下内置的函数enumerate(): enumerate(sequence[, start=0]) )返回一个枚举对象,sequence必须是一个序列、迭代器或者具有具有迭代功能的对象。enumerate()是适用于获得索引集:(0, seq[0]), (1, seq[1]), (2, seq[2]), .... 以前处理序列的时候经常使用以前写C的风格: [c] for (int i = 0; i &lt; list.Length; i++) { //todo with list[i] } [/c] 于是在用python写代码的时候就习惯使用: [python] for i in range(len(sequence)): process(sequence[i]) [/python] 看了内置的函数enumerate后,发现以后处理就直接可以: [python] for i,element in enumerate(sequence): process(i,element) [/python]

阅读全文 »

Good to Great Python reads

A col­lec­tion of python “must reads”: The Python yield key­word explained Python’s super() con­sid­ered super! Under­stand­ing Python Decorators What is a meta­class in Python? Meta­classes Demystified Try/Catch for val­i­da­tion or speed? Python (and Python C API): __new__ ver­sus __init__ Python “self” keyword Python and the Prin­ci­ple of Least Astonishment A Curi­ous Course on Corou­tines and Concurrency Gen­er­a­tor Tricks for Sys­tems Programmers Code like a Python­ista: Idiomatic Python (2007) The entire Python Mod­ule of the week archive Also see the book — “ Python Stan­dard Library by Exam­ple ” (By me) Python Threads and the global inter­preter lock (By me) Get with the pro­gram as con­text manager How to write a Lisp inter­preter in Python Uni­code in Python, Com­pletely Demystified Uni­code for Dum­mies — Just use UTF-8 Debug­ging in Python How to han­dle mul­ti­ple inher­i­tance of ABCs that imple­ment each oth­ers abstract methods AOSA: Python Packaging 10 Rea­sons Python Rocks for Research (And a Few Rea­sons it Doesn’t) Beej’s Guide to Net­work Programming How to use Linux epoll with Python Python beginner’s Mistakes Com­mand Line syn­tax: Some basic Concepts Be care­ful with exec and eval in Python Dec­o­ra­tors make magic easy The detailed guide to “Tim­sort” (which Java adopted, FWIW) Notes on opti­miz­ing dictionaries How-to guide for Python Descriptors Python is Not Java (2004) Java is not Python, either Python Inter­faces are not Java Interfaces Begin­ner Python: http://wiki.python.org/moin/BeginnersGuide/Programmers A crash course into Python Python Style: PEP8: The Python Style Guide Python Books: Learn Python the Hard Way Dive into Python 3 A Byte of Python Port­ing to Python 3: An in-depth Guide Python Videos: Python Miro Com­mu­nity This con­tains hun­dreds of videos from Python con­fer­ences all over the world includ­ing past PyCons. Python Classes: Inter­me­di­ate and Advanced Soft­ware Car­pen­try in Python (2007) Google’s Python class Intro­duc­tion to Algo­rithms (with Python) Python Inter­nals: Python’s Innards: Introduction Python’s Innards: Objects 101 Python’s Innards: Objects 102 ( And the cor­rec­tion ) Python’s Innards: Pystate Python’s Innards: Naming Python’s Innards: Code Objects Python’s Innards: Inter­preter Stacks Python’s Innards: Hello, ceval.c Python His­tory: Guido Van Rossum’s “Python His­tory” blog (all of it!) Inter­faces or Abstract Base Classes (2005) Of Python and Road Maps (or the lack thereof) PyPy: Tuto­r­ial: Writ­ing an Inter­preter with PyPy Part 1 Tuto­r­ial: Writ­ing an Inter­preter with PyPy Part 2: Adding a JIT ...

阅读全文 »

python测试框架总结

If you are a developer or tester using Python, you live in exciting, ebullient times. There are Python-based testing frameworks newly-announced or recently-updated almost every day. Here is a rundown of the latest I'm aware of: 如果你是一个python开发人员或者python测试人员,令人沸腾的时刻到来了。这里介绍了许多python测试框架,它们或是最新发布的或者是最近都在保持更新的。下面就是我所知道的一些框架的列表: Unit testing 单元测试 py.test : no recent new release, but changes are happening almost daily in svn py.test :没有最近的新版本,但变化正在发生,几乎每天都在SVN.(目前最新的版本是2.2.0) TestOOB : version 1.16 was released on 2009 (TestOOB is an enhancement to the standard unittest module, offering many features that py.test offers) TestOOB :1.16版本发布于2009,以后没有更新。TestOOB是一个标准的unittest模块的增强,提供了许多功能,这些功能py.test也提供。 nose : version 1.1.2 was freshly released 0n 2011.7.13 (nose provides an alternate test discovery and running process for unittest, one that is intended to mimic the behavior of py.test as much as is reasonably possible without resorting to too much magic) nose :version 1.1.2 是发布于 0n 2011.7.13(nose为unittest提供另一种测试发现和测试处理的替代方式,它希望能够尽可能合理地和适度地模仿py.test,而不是采用太多具有魔力的方式) Web application testing web应用测试 twill : version 0.7.4 was released on Thursday, December 27th, 2007( twill is a simple language that allows users to browse the Web from a command-line interface. With twill, you can navigate through Web sites that use forms, cookies, and most standard Web features.) twill : version 0.7.4是在2007年12月27日星期四发布的。(twill是一种简单的语言,使用户能够从一个命令行界面的浏览网络。使用twill,您可以通过使用用户表单,临时文件,和最标准的Web功能。) FunkLoad : version 1.6.1 was released on 2011-07-28 (FunkLoad offers functional, performance, load and stress testing of Web applications) FunkLoad :version 1.6.1在2011-07-28上发布的(FunkLoad提供Web应用程序的功能,性能,负载和压力测试) zope.testbrowser : version 4.0.2 was released on 2011-05-25 (zope.testbrowser is the stand-alone version of the Zope 3 functional testing framework) zope.testbrowser: version 4.0.2 发布于2011-05-25(zope.testbrowser是Zope3功能测试框架的独立版本) Django's own doctest-based test framework: 目前python的web框架都或多或者提供了测试框架这里就不再一一说明了。 GUI testing 界面测试 guitest : version 0.31 was released on 2005 (guitest is a Python helper library for testing Python GUI applications, with pyGTK support being the most mature) guitest :version 0.31于2005年发布,以后没有更新。(guitest是一个用于测试python GUI应用的python辅助库,对pyGTK的支持是最成熟的,最适合于测试pyGTK应用。) Various 其他 retest(re-try) : version 0.6.1 was released on 2006 (retest enables tests of Python regular expressions in a webbrowser; it uses SimpleHTTPServer and AJAX) retest(re-try) :version 0.6.1发布于2006年,2009年更名为re-try,并且发布0.7.0(retest能够用于在浏览器上测试python的正则表达式,它使用了SimpleHTTPServer and AJAX) I also want to mention MochiKit as an example of an application that makes it a point to offer top-notch tests and documentation. MochiKit is a JavaScript library that is very "Pythonical" in nature, which is not surprising given that one of its main developers is Bob Ippolito , well-known for his contributions in the Python community. One of the goals of MochiKit is to maintain 100% documentation coverage , and ano ...

阅读全文 »

MongoDB 入门教程

原文参见: http://www.mongodb.org/display/DOCS/Tutorial 启动数据库 下载 MongoDB, 解压后并启动: $ bin/mongod MongoDB 默认存储数据目录为 /data/db/ (或者 c:\data\db), 当然你也可以修改成不同目录, 只需要指定 –dbpath 参数: $ bin/mongod --dbpath /path/to/my/data/dir 获取数据库连接 现在我们就可以使用自带的shell工具来操作数据库了. (我们也可以使用各种编程语言的驱动来使用MongoDB, 自带的shell工具可以方便我们管理数据库) 启动 MongoDB JavaScript 工具: $ bin/mongo 默认 shell 连接的是本机localhost 上面的 test库, 会看到: MongoDB shell version: 0.9.8 url: test connecting to: test type "help" for help “connecting to:” 这个会显示你正在使用的数据库的名称. 想换数据库的话可以: use mydb 可以输入 help 来查看所有的命令. 插入数据到集合 下面我们来建立一个test的集合并写入一些数据. 建立两个对象, j 和 t , 并保存到集合中去. 在例子里 ‘ ’ 来表示是 shell 输入提示 j = { name : "mongo" }; {"name" : "mongo"} t = { x : 3 }; { "x" : 3 } db.things.save(j); db.things.save(t); db.things.find(); {"name" : "mongo" , "_id" : ObjectId("497cf60751712cf7758fbdbb")} {"x" : 3 , "_id" : ObjectId("497cf61651712cf7758fbdbc")} 有几点需要注意下 : 不需要预先建立一个集合. 在第一次插入数据时候会自动建立. 在例子其实可以存储任何结构的数据, 当然在实际应用我们存储的还是相同元素的集合. 这个特性其实可以在应用里很灵活, 你不需要类似alter table 来修改你的数据结构 每次插入数据时候对象都会有一个ID, 名字叫 _id. 当你运行不同的例子, 你的对象ID值都是不同的. 下面再加点数据: for( var i = 1; i 10; i++ ) db.things.save( { x:4, j:i } ); db.things.find(); {"name" : "mongo" , "_id" : ObjectId("497cf60751712cf7758fbdbb")} {"x" : 3 , "_id" : ObjectId("497cf61651712cf7758fbdbc")} {"x" : 4 , "j" : 1 , "_id" : ObjectId("497cf87151712cf7758fbdbd")} {"x" : 4 , "j" : 2 , "_id" : ObjectId("497cf87151712cf7758fbdbe")} {"x" : 4 , "j" : 3 , "_id" : ObjectId("497cf87151712cf7758fbdbf")} {"x" : 4 , "j" : 4 , "_id" : ObjectId("497cf87151712cf7758fbdc0")} {"x" : 4 , "j" : 5 , "_id" : ObjectId("497cf87151712cf7758fbdc1")} {"x" : 4 , "j" : 6 , "_id" : ObjectId("497cf87151712cf7758fbdc2")} {"x" : 4 , "j" : 7 , "_id" : ObjectId("497cf87151712cf7758fbdc3")} {"x" : 4 , "j" : 8 , "_id" : ObjectId("497cf87151712cf7758fbdc4")} 请注意下, 这里循环次数是10, 但是只显示到8, 还有2条数据没有显示. 如果想继续查询下面的数据只需要使用 it 命令, 就会继续下面的数据: {"x" : 4 , "j" : 7 , "_id" : ObjectId("497cf87151712cf7758fbdc3")} {"x" : 4 , "j" : 8 , "_id" : ObjectId("497cf87151712cf7758fbdc4")} 继续 it {"x" : 4 , "j" : 9 , "_id" : ObjectId("497cf87151712cf7758fbdc5")} {"x" : 4 , "j" : 10 , "_id" : ObjectId("497cf87151712cf7758fbdc6")} 从技术上讲 find() 返回一个游标对象. 但在上面的例子里, 并没有拿到一个游标的变量. 所以 shell 自动遍历游标, 返回一个初始化的set, 并允许我们继续用 it 迭代输出. 当然我们也可以直接用游标来输出, 不过这个是下一部分的内容了. 查询数据 在没有深入查询之前, 我们先看看怎么从一个查询中返回一个游标对象. 可以简单的通过 find() 来查询, 他返回一个任意结构的集合. 如果实现特定的查询稍后讲解. 实现上面同样的查询, 然后通过 while 来输出: var cursor = db.things.find(); while (cursor.hasNext()) { print(tojson(cursor.next())); } {"name" : "mongo" , "_id" : ObjectId("497cf60751712cf7758fbdbb")} {"x" : 3 , "_id" : ObjectId("497cf61651712cf7758fbdbc")} {"x" : 4 , "j" : 1 , "_id" : ObjectId("497cf87151712cf7758fbdbd")} {"x" : 4 , "j" : 2 , "_id" : ObjectId("497cf87151712cf7758fbdbe")} {"x" : 4 , "j" : 3 , "_id" : ObjectId("497cf87151712cf7758fbdbf")} {"x" : 4 , "j" : 4 , "_id" : ObjectId("497cf87151712cf7758fbdc0")} {"x" : 4 , "j" : 5 , "_id" : ObjectId("497cf87151712cf7758fbdc1")} {"x" : 4 , "j" : 6 , "_id" : ObjectId("497cf87151712cf7758fbdc2")} { ...

阅读全文 »