python闭包(closure)

python闭包(closure)其实并不是什么很复杂的东西,其定义是:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure)。它只不过是个“内层”的函数,由一个名字(变量)来指代,而这个名字(变量)对于“外层”包含它的函数而言,是本地变量。

简单的闭包例子:

def add(num):

   def add_inner(num_inner):

       return num+num_inner

   return add_inner

 

执行p=add(23)将会产生内层函数add_inner的一个闭包,这个闭包在内部引用了名字num,而num绑定到23上了。

test=add(20)

test1=add(20)

print test(100),test1(120)

 

阅读全文 »

python 菜谱(python cookbook) 1.8 判断一个字符集是否在另一个字符集中

挑战任务1:判断一个字符串是否在另外一个字符串中

对于处理一个字符串时候在另外一个字符串中,使用in是最简单的解决方案。

ast='a in b'

bst='this a in b only'

ast is in bst

挑战任务2:判断一个字符集是否在另一个字符集中

  • 简单的处理方法是判断每个出现在一个字符串的字符是否出现在一个字符串中

          for c in ast:

              if c in bst

                  ......

  • 另外set(集合)能很好的处理这个问题。

              set(ast).issubset(set(bst))

 

阅读全文 »

python 菜谱(python cookbook) 1.7 反转字符或者按照单词反转

 

挑战任务1:反转单个字符

切片方法是最好解决这个问题的办法,步长为-1的切片方法就能解决,但是需要注意的是字符串是不能修改,所以通过赋值(拷贝):

value=astring[::-1]

挑战任务2:按照单词反转

列表有内置的反转函数,所以首先能把,接着反转列表,接着拼接列表中的元素就能解决问题:

words=astring.split()         #一段字符串放入列表

words.reverse()                 #反转列表

' '.split(words)                    #拼接列表中的元素

挑战任务3:按照单词反转,但是还需要保持原来的空格符原样  “this  a top”->"top a  this"

上面这种方法虽然能实现反转,但是无法保持原来空格符原样,如果需要保持原来空格符原样的话,需要记住空格符的个数,正则能很好的实现这个目的。
import re
words=re.split('\s+',astring)     #切割
words.reverse()                        #反转列表
''.split(words)                            #拼接列表中的元素
 
上面的解决方案都是最基本的,各位可以通过更简洁的方式去实现,这个挑战就交给各位自己了!

阅读全文 »

python科普(转自 潘俊勇)

python科普(转自 潘俊勇) 软件业的特点,就是层出不穷的新东东涌现。Windows早就革了DOS的命,浏览器差不多革了桌面软件的命,云计算准备再革所有软件的命,最后还追上个乔布斯说一切听他的。 动荡的软件界,让人眼花缭乱。这一切的后面,是失落的编程族:好容易才精通的东西,随之变得一钱不值。曾经的人才,如同数码产品般的迅速贬值。乃至好多人怀疑,编程是吃青春饭的行当。 在我前10年的编程经历里,重复着同样的杯具。Turbo C学完了,用Borland C,Visual C++太麻烦,开始用PowerBuilder快速开发,接上去Delphi、C++Builder、JBuilder,十八般武艺都学完了,结果又蹦出个新时髦。哪天有个终结?在软件的浪潮里,程序员太渺小了。我们害怕自己,会同过气的语言一样昙花一现,成为过眼烟云。 不是我见异思迁,而是潮流不可阻挡。但直至Python出现,故事开始转折。 起源于上世纪80年代末的Python语言(http://python.org),是一种开放源代码的解释型高级动态类型语言,语法简练、类库丰富,以开发效率高著称。 20多年的发展时间,Python是愈久弥香,经历住了时间的考验。Python是Goolge的三大语言之一;全球最大的视频网站YouTube,以及国内的豆瓣网也是采用Python开发;最新最热的行当中,python是往往web game的首选开发语言之一,谷歌和国内的易度云计算开发平台也都选择了Python语言。 这就是神奇的Python,在交错的语言大战中,Python却成为一颗长青树,不断焕发新的光彩。 而Python也成为我最近8年的编程生涯的主体,或许这将是我作为程序员的归属,一直走下去。让我们一起分享下这不一样的Python。 简单是硬道理 ==================== php被很多严肃的开发人员诟病,太简单、太脏了。然而php却被企业所喜欢,连yahoo和facebook都选择了php, php不断在发展,生命力异常旺盛。 为什么?因为简单。 程序语言,从机器语言到汇编,到高级语言,不就是简单在驱动吗?程序员也是人,需要更容易使用的语言。时髦点的话,就是语言也要多为咱程序员服务了,人机接口、用户体验要好。 因为简单,所以开发效率高;因为简单,所以容易阅读和维护;因为简单,所以不怕没人接手;因为简单,重构下也无妨;因为简单,项目经理就不必写伪代码了,直接Coding出框架代码吧. 简单带来的优势,是成指数级别增长。简单省了钱,加快的进度,减少的项目风险,首先老板会喜欢。简单是硬道理。.net同样是靠简单占领了不小的市场份额。 python语言最早设计指导思想之一,就是想提高代码的可读性。Python语言采用缩进来标识代码块,而Java采用的是配对的大括号来标识。不仅仅是排版更漂亮,Python的数据结构非常简单和统一,Python自带非常庞大的类库,很多东西拿来即可。这样,相同的逻辑,使用python可能只需要java五分之一的代码量。 很多软件爱拿自己 数百万行代码 出来说事,表明自己很强大。而在Python的世界里,人们在炫耀相同的功能后,喜欢说我只有几千行代码(比如Python上的对象数据库系统ZODB就只有不到5千行代码)。背后的意思是,放心用吧,有问题你也很容易维护这个系统;或者如果有时间,你自己也可以接管这个代码。 Pythonic之美 ====================== php靠一个 简单 占领了市场,php的哲学是quick and dirty;Python同样简单,但Python的哲学是Pythonic。Pythonic是什么?Pythonic是quick and not dirty,也就是quick and beautiful. 这个Pythonic之美,代表了程序员的素养和品味。什么是好的代码?什么是漂亮的代码?有一本书,叫做《unix编程艺术》,实际上一本对编程审美进行洗脑的经典书籍。而Python语言的设计理念,正符合了这种编程审美。因此,Python深受高端开发人员的喜欢,Python和他们有相同的文化。这如同,很多人将拥有Mac机作为自己审美品味的象征一样。 让我们再一次领略下Pythonic的禅意,它作为一个彩蛋隐藏在python的this模块:: import this 下面是我基于赖勇浩先生的首译,稍作更改后的翻译:: (让我们来说说该如何写代码:) 优美胜于丑陋, 清晰明了胜于晦涩, 简洁胜于复杂, 而复杂又胜于杂乱。 扁平胜于多层嵌套, 适当空行、错落有致胜于拥挤不堪, 可读性很重要。 虽然实用主义往往和上述规则矛盾, 但所有特例都不足以打破他们。 绝不要忽略异常(不写 except:pass), 除非你进行精准地捕获。 当你遇到含糊不清,不要尝试猜测可能, 一定有一种,而且绝对是唯一的一种明显的处理方法。 虽然你可能一开始很难找到这条路,除非你是 Python 之父。 现在就动手好过永远不做, 虽然不做通常好于蛮干。 实现方法如果难以表述,那这思路就肯定不对; 反之如果容易表述,那可能是个好想法。 命名空间是一个值得叫好的想法,我们应当多加利用。 Python宝库 =================== Python号称自带电池(Battery Included),也就是有强大的类库。 Python内建的类库就已经非常全面了。从web抓取,到xml解析,到嵌入式数据库,到压缩包的处理,到邮件协议,到json解析,而且不断在增长。 如果你还觉得不够,可到http://pypi.python.org上去找,这里有1万多种第三方的类库。从图片处理、到加密算法,到excel文件解析生成,到pdf文件转换,可谓应有尽有,无所不能。探访这里的乐趣,就如同海边拾贝,如同山间采菌,那种惊喜,那种 大国大民 的优越感,让你在心底涌现出投身Python的幸福,进而归属感倍增。 更重要的是,所有的这些宝贝,全部开源,而且大都是类 BSD协议的开源,您直接用于商业。有了这些,我会经常为自己选择了Python而庆幸,这使得我们像易度这样庞大的应用快速构建起来。 Python自带强大的包管理机制,简简单单一个easy_install命令,您就可以在线安装升级、卸载这些包。这类似debian/ubuntu的apt包管理机制一般方便。 全能选手 =============== 可能是因为Python语言练就了动态语言的以柔克刚、借力打力的太极推手功夫,加上Python简单导致的生产力指数级增长效应,Python应该是应用最全面的一种语言了。 从脚本、到web开发、到嵌入使用、到客户端、到云计算,python都干得不错。你只需要学会Python这一门语言,老板给你什么任务你几乎都能完成。让我们随着时间的年轮滚进,看看Python应乎潮流的72变。 操作系统脚本 ------- ...

阅读全文 »

python中的异常

python中的异常 异常是指程序中的例外,违例情况。异常机制是指程序出现错误后,程序的处理方法。当出现错误后,程序的执行流程发生改变,程序的控制权转移到异常处理。 Exception类是常用的异常类,该类包括StandardError,StopIteration, GeneratorExit, Warning等异常类。 StandardError类是python中的错误异常,如果程序上出现逻辑错误, 将引发该异常。StandardError类是所有内敛异常的基类,放置在默认的命名空间中,因此使用IOEroor, EOFError, ImportError等类,不需要导入exception模块。 StopIteration类判断循环是否执行到尾部,如果循环到尾部,则抛出该异常。 GeneratorExit类是由Generator函数引发的异常,当调用close()时引发该异常。 Warning类表示程序中的代码引起的警告。 python中的异常使用继承结构创建,可以在异常处理程序中捕获基类异常,也可以捕获各种子类异常,python中使用try...except语句捕获异常,异常子句定义在try子句后面。 try...except的使用方法 try...except用于处理问题语句,捕获可能出现的异常。try子句中的代码块放置可能出现异常的语句,except子句中的代码块处理异常。 演示try...except语句捕获IOError异常 try: file( hello.txt , r ) #如果文件不存在,引发异常 print 读文件 except IOError: #捕获IO异常 print 文件不存在 except: #其它异常 print 程序异常 python与Java的异常处理模式相似,异常处理语句也可以嵌套,演示如下: try: s = hello try: print s[0] + s[1] print s[0] - s[1] except TypeError: print 字符串不支持减法运算 except: print 异常 如果外层try子句中的代码引发异常,程序将直接跳转到外层try对应的except子句,而内部的try子句将不会被执行。 try...finally的使用方法 try...except后还可以添加一个finally子句。无论异常是否发生,finally子句都会被执行。所有的finally子句通常用于关闭因异常而不能释放的系统资源。 try: f = open( hello.txt , r ) try: print f.read(5) except: print 读文件异常 finally: print 释放资源 f.close() except IOError: print 文件不存在 使用raise抛出异常 当程序出现错误,python会自动引发异常,也可以通过raise显示地引发异常。一旦执行了raise语句,raise后面的语句将不能执行。 演示raise用法 try: s = None if s is None: print s 是空对象 raise NameError #如果引发NameError异常,后面的代码将不能执行 print len(s) except TypeError: print 空对象没有长度 自定义异常 python允许程序员自定义异常,用于描述python中没有涉及的异常情况,自定义异常必须继承Exception类,自定义异常按照命名规范以 Error 结尾,显示地告诉程序员这是 异常。自定义异常使用raise语句引发,而且只能通过人工方式触发。 from __future__ import division class DivisionException(Exception): def __init__(self, x, y): Exception.__init__ (self, x, y) #调用基类的__init__进行初始化 self.x = x self.y = y if __name__ == __main__ : try: x = 3 y = 2 if x % y 0: #如果大于0, 则不能被初始化,抛出异常 print x/y raise DivisionException(x, y) except DivisionException,div: #div 表示DivisionException的实例对象 print DivisionExcetion: x/y = %.2f % (div.x/div.y) assert语句的使用 assert语句用于检测某个条件表达式是否为真。assert语句又称为断言语句,即assert认为检测的表达式永远为真,if语句中的条件判断都可以使用assert语句检测。 ...

阅读全文 »

python常用的时间(time)的方法

我们先导入必须用到的一个module import time 设置一个时间的格式,下面会用到 ISOTIMEFORMAT= %Y-%m-%d %X 看一下当前的时间,和其他很多语言相似这是从epoch(1970 年 1 月 1 日 00:00:00)开始到当前的秒数。 time.time() 1180759620.859 上面的看不懂,换个格式来看看 time.localtime() (2007, 6, 2, 12, 47, 7, 5, 153, 0) localtime返回tuple格式的时间,有一个和它类似的函数叫gmtime(),2个函数的差别是时区,gmtime()返回的是0时区的值,localtime返回的是当前时区的值。 time.strftime( ISOTIMEFORMAT, time.localtime() ) 2007-06-02 12:54:29 用上我们的时间格式定义了,使用strftime对时间做一个转换,如果取现在的时间,time.localtime() 可以不用。 time.strftime( ISOTIMEFORMAT, time.localtime( time.time() ) ) 2007-06-02 12:54:31 time.strftime( ISOTIMEFORMAT, time.gmtime( time.time() ) ) 2007-06-02 04:55:02 上面展示了gmtime和localtime的区别。 查看时区用 time.timezone -28800 上面的值是一个秒值,是当前时区和0时区相差的描述,-28800=-8*3600,即为东八区。 帖几个简单的函数 def ISOString2Time( s ): convert a ISO format time to second from:2006-04-12 16:46:40 to:23123123 把一个时间转化为秒 return time.strptime( s, ISOTIMEFORMAT ) def Time2ISOString( s ): convert second to a ISO format time from: 23123123 to: 2006-04-12 16:46:40 把给定的秒转化为定义的格式 return time.strftime( ISOTIMEFORMAT, time.localtime( float( s ) ) ) def dateplustime( d, t ): d=2006-04-12 16:46:40 t=2小时 return 2006-04-12 18:46:40 计算一个日期相差多少秒的日期,time2sec是另外一个函数,可以处理,3天,13分钟,10小时等字符串,回头再来写这个,需要结合正则表达式。 return Time2ISOString( time.mktime( ISOString2Time( d ) )+time2sec( t ) ) def dateMinDate( d1, d2 ): minus to iso format date,return seconds 计算2个时间相差多少秒 d1=ISOString2Time( d1 ) d2=ISOString2Time( d2 ) return time.mktime( d1 )-time.mktime( d2 ) ...

阅读全文 »

Python 入门指南

注意: 目前已经用 Sphinx 重新整理一次,可以直接访问 http://www.pythondoc.com/pythontutorial3/index.html 或者 http://www.pythondoc.com/ The Python Tutorial Python 入门指南 Release: 3.1 Date: September 05, 2009 Python is an easy to learn, powerful programming language. It has efficient high-level data structures and a simple but effective approach to object-oriented programming. Python’s elegant syntax and dynamic typing, together with its interpreted nature, make it an ideal language for scripting and rapid application development in many areas on most platforms. Python是一门简单易学且功能强大的编程语言。 它拥有高效的高级数据结构,并且能够用简单而又高效的方式进行面向对象编程。 Python优雅的语法和动态类型,再结合它的解释性,使其在大多数平台的许多领域成为编写脚本或开发应用程序的理想语言。 The Python interpreter and the extensive standard library are freely available in source or binary form for all major platforms from the Python Web site, http://www.python.org/ , and may be freely distributed. The same site also contains distributions of and pointers to many free third party Python modules, programs and tools, and additional documentation. 你可以自由的从Python官方点,http://www.python.org,以源代码或二进制形式获取Python解释器及其标准扩展库,并可以自由的分发。 此站点同时也提供了大量的第三方Python模块、程序和工具,及其附加文档。 The Python interpreter is easily extended with new functions and data types implemented in C or C++ (or other languages callable from C). Python is also suitable as an extension language for customizable applications. 你可以很容易的使用C或C++(其他可以通过C调用的语言)为Python解释器扩展新函数和数据类型。 Python还可以被用作定制应用程式的一门扩展语言。 This tutorial introduces the reader informally to the basic concepts and features of the Python language and system. It helps to have a Python interpreter handy for hands-on experience, but all examples are self-contained, so the tutorial can be read off-line as well. 本手册非正式的向读者介绍了Python语言及其体系相关的基本知识与概念。 在学习实践中结合使用Python解释器是很有帮助的,不过所有的例子都是完整的,所以本手册亦可离线阅读。 For a description of standard objects and modules, see the Python Library Reference document. The Python Reference Manual gives a more formal definition of the language. To write extensions in C or C++, read Extending and Embedding the Python Interpreter and Python/C API Reference. There are also several books covering Python in depth. 如果需要了解相关标准库或对象的详细介绍,请查阅Python库参考文档。 Python参考手册提供了更多语言相关的正式说明。 如果想要使用C或C++编写扩展,请查阅Python解释器扩展和集成章节或Python/C API参考手册。 当然也可阅读一些深入介绍Python知识的图书。 This tutorial does not attempt to be comprehensive and cover every single feature, or even every commonly used feature. Instead, it introduces many of Python’s most noteworthy features, and will give you a good idea of the language’s flavor and style. After reading it, you will be able to read and write Python modules and programs, and you will be ready to learn more about the various Python library modules described in the Python Library Reference. 本手册不会尝试涵盖Python的全部知识和每个特性,甚至不会涵盖所有常用的特性。 相反的,它介绍了Python中许多最引人瞩目的特性,并且会给你一个关于语言特色和风格的认识。 读完之后,你将能够阅读和编写Python模块或程序,并为以后使用Python库参考手册继续学习诸多Python模块库做好准备。 The Glossary is also worth going through. 1. Whetting Your Appetite Appetitle 开胃菜 2. Using the ...

阅读全文 »

Twisted Web 代码示例

twisted.web.client getpage.py - 使用twisted.web.client.getPage 下载页面. dlpage.py -在下载页面过程中增加一个回调函数到twisted.web.client.downloadPage 用来显示错误信息 XML-RPC xmlrpc.py XML-RPC 服务器的几个方法 包括 echoing, faulting, returning deferreds 以及 failed deferreds xmlrpcclient.py - 使用 twisted.web.xmlrpc.Proxy来调用远程XML-RPC方法. advogato.py 使用twisted.web.xmlrpc添加日志到advogato.org,需要一个advogato.org帐号. 虚拟主机和代理 rootscript.py twisted.web.vhost.NameVirtualHost的例子 web.py 使用twisted.web.vhost.VHostMonsterResource作为反向代理处理某些特定文件. proxy.py -使用twisted.web.proxy把任何http请求通过代理端口转发到指定网站 hello.rpy.py - 使用twisted.web.static创建一个静态资源服务 fortune.rpy.py - 创建一个返回服务器运行进程输出的资源 l j.rpy.py - 使用twisted.web.microdom,twisted.web.domhelpers和回调链来提取显示一个LiveJournal用户的RSS页面. vhost.rpy.py - 创建一个twisted.web.vhost.VHostMonsterResource资源 report.rpy.py - 显示一个资源的各种属性,包括路径,主机和端口. users.rpy.py - 使用 twisted.web.distrib 发布一个 社区网站 的用户目录 simple.rtl 使用 twisted.web.resource.ResourceTemplate的模板示例 杂项 webguard.py -使用twisted.cred 来对twisted.web进行验证防止未授权的用户访问. silly-web.py - 使用wisted.web.distrib and twisted.spread.pb发布一个最基本的主从模型的分布式网站. google.py - 使用twisted.web.google获取我的手气不错的搜索页 soap.py 使用 twisted.web.soap 发布SOAP方法. 来源: http://twistedmatrix.com/documents/current/web/examples/#auto0 ...

阅读全文 »

Google 是如何做代码审查的

在上一篇文章中提到过,我已经不在Google工作了。我还没有想清楚应该去哪里 有两三个非常好的工作机会摆在我面前。因为在这段做决定时间里,我不再受雇于任何人,我想可以写一些专业性的东西,一些很有趣,但也会在同事和管理工作中导致关系紧张的东西。 Google是一个非常优秀的公司。他们做出了很多令人称赞的东西 既是公司外部,人们可以看到的东西,也是公司内部。有一些在公司内部并不属于保密的事情,在外部并没有给予足够广泛的讨论。这就是我今天要说的。 让Google的程序如此优秀的一个最重要的事情看起来是非常的简单:代码审查。并不是只有Google做这个事情 代码审查已经被广泛的认可为一种非常好的做法,很多人都在这样做。但我还没有看到第二家这样大的公司能把这种事情运用的如此普遍。在Google, 没有程序 ,任何产品、任何项目的程序代码,可以在没有经过有效的代码审查前提交到代码库里的。 所有人 都要经过代码审查。并且很正规的:这种事情应该成为任何重要的软件开发工作中一个基本制度。并不单指产品程序 所有东西。它不需要很多的工作,但它的效果是巨大的。 从代码审查里能得到什么? 很显然:在代码提交前,用第二群眼睛检查一遍,防止bug混入。这是对其最常见的理解,是对代码审查的好处的最广泛的认识。但是,依我的经验来看,这反倒是它 最不重要 的一点。人们确实在代码审查中找到了bug。可是,这些在代码审查中能发现的绝大部分bug,很显然,都是微不足道的bug,程序的作者花几分钟的时间就能发现它们。真正需要花时间去发现的bug不是在代码审查里能找到的。 代码审查的最大的功用是纯社会性的。如果你在编程,而且 知道 将会有同事检查你的代码,你编程态度就完全不一样了。你写出的代码将更加整洁,有更好的注释,更好的程序结构 因为你 知道 ,那个你很在意的人将会查看你的程序。没有代码审查,你知道人们最终还是会看你的程序。但这种事情不是立即发生的事,它不会给你带来同等的紧迫感,它不会给你相同的个人评判的那种感受。 还有一个非常重要的好处。代码审查能 传播知识 。在很多的开发团队里,经常每一个人负责一个核心模块,每个人都只关注他自己的那个模块。除非是同事的模块影响了自己的程序,他们从不相互交流。这种情况的后果是,每个模块只有一个人熟悉里面的代码。如果这个人休假或 但愿不是 辞职了,其他人则束手无策。通过代码审查,至少会有两个人熟悉这些程序 作者,以及审查者。审查者并不能像程序的作者一样对程序十分了解 但他会熟悉程序的设计和架构,这是极其重要的。 当然,没有什么事情能简单的做下来的。依我的经验,在你能正确的进行代码审查前,你需要花时间锻炼学习。我发现人们在代码审查时经常会犯一些错误,导致不少麻烦 尤其在一些缺乏经验的审查者中经常的出现,他们给了人们一个很遭的代码审查的体验,成为了人们接受代码审查制度的一个障碍。 最重要的一个原则:代码审查用意是在代码提交前找到其中的问题 你要发现是它的 正确 。在代码审查中最常犯的错误 几乎每个新手都会犯的错误 是,审查者根据自己的编程习惯来评判别人的代码。 对于一个问题,通常我们能找出十几种方法去解决。对于一种解决方案,我们能有百万种编码方案来实现它。作为一个审查者,你的任务不是来确保被审查的代码都采用的是你的编码风格 因为它不可能跟你写的一样。作为一段代码的审查者的任务是确保由作者自己写出的代码是正确的。一旦这个原则被打破,你最终将会倍感折磨,深受挫折 这可不是我们想要的结果。 问题在于,这种错误是如此的普遍而易犯。如果你是个程序员,当你遇到一个问题,你能想到一种解决方案 你就把你想到的方案作为标准答案。但事情不是这样的 作为一个好的审查者,你需要明白这个道理。 代码审查的第二个易犯的毛病是,人们觉得有压力,感觉非要说点什么才好。你知道作者用了大量的时间和精力来实现这些程序 不该说点什么吗? 不,你不需要。 只说一句 哇,不错呀 ,任何时候都不会不合适。如果你总是力图找出一点什么东西来批评,你这样做的结果只会损害自己的威望。当你不厌其烦的找出一些东西来,只是为了说些什么,被审查人就会知道,你说这些话只是为了填补寂静。你的评论将不再被人重视。 第三是速度。你不能匆匆忙忙的进行一次代码审查 但你也要能迅速的完成。你的同伴在等你。如果你和你的同事并不想花太多时间进行代码复查,你们很快的完成,那被审查者会觉得很沮丧,这种代码审查带来的只有失望的感觉。就好象是打搅了大家,使大家放下手头的工作来进行审查。事情不该是这样。你并不需要推掉手头上的任何事情来做代码审查。但如果中途耽误了几个小时,你中间还要休息一会,喝杯茶,冲个澡,或谈会儿闲话。当你回到审查现场,你可以继续下去,把事情做完。如果你真是这样,我想没有愿意在那干等着你。 ...

阅读全文 »

python challenge 33解题总结

网页注释中提示: !--If you are blinded by the light, remove its power, with its might. Then from the ashes, fair and square, another truth at you will glare.-- python challenge 33网址: www.pythonchallenge.com/pc/rock/beer.html 注意到图像名称是beer1.jpg,看看 http://www.pythonchallenge.com/pc/rock/beer2.jpg 图上提示 no, png,看看 http://www.pythonchallenge.com/pc/rock/beer2.png 好像是个有个x的灰度杂波图 查看图片信息(通过img.getcolors()) 可知,图像有66种颜色: [(1532, 1), (232, 2), (963, 7), (189, 8), (724, 13), (329, 14), (549, 19), (243, 20), (144, 25), (424, 26), (119, 31), (328, 32), (126, 37), (339, 38), (126, 43), (357, 44), (107, 49), (225, 50), (79, 55), (609, 56), (181, 61), (356, 62), (70, 67), (298, 68), (23, 73), (164, 74), (26, 79), (354, 80), (47, 85), (341, 86), (139, 91), (257, 92), (104, 97), (505, 98), (192, 103), (224, 104), (114, 109), (310, 110), (32, 115), (183, 116), (238, 121), (198, 122), (117, 127), (327, 128), (110, 133), (342, 134), (118, 139), (342, 140), (145, 145), (323, 146), (152, 151), (324, 152), (161, 157), (323, 158), (175, 163), (317, 164), (183, 169), (317, 170), (171, 175), (337, 176), (198, 181), (318, 182), (241, 187), (283, 188), (1348, 193), (272, 194) 仔细看发现,每两种颜色值相邻,可以分为一组(1和2, 7和8, 13和14 ...), 每组颜色的像素数累加后开平方可得一个整数,比如颜色1和2的像素数 sqrt(1532+232)=42, 颜色1,2,7和8的像素数 sqrt(1532+232+963+189)=54 颜色1,2,7,8,13和14的像素数 sqrt(1532+232+963+189+724+329)=63 再根据提示中的 light , remove its power 和 square 猜想: 0) 以所有像素为整体开始; 1) 以当前像素数开平方的值做为宽高建立新图片; 2) 将当前像素中颜色值最大的一组像素标为最暗其他则标为最亮(反过来也行),然后输出到新图片中; 3) 从当前像素中去掉当前颜色值最大的一组(因为最亮嘛),然后转到第1)步; 如此循环共建立33个新图片,查看一下输出是否有意义 源代码如下: amp;amp;amp;lt;br / amp;amp;amp;gt; amp;amp;lt;br / amp;amp;gt; amp;lt;br / amp;gt; lt;br / gt; br / def level_33(): amp;amp;amp;lt;br / amp;amp;amp;gt; amp;amp;lt;br / amp;amp;gt; amp;lt;br / amp;gt; lt;br / gt; br / img=Image.open(r amp;amp;amp;amp;#39;d:beer2.png amp;amp;amp;amp;#39;) amp;amp;amp;lt;br / amp;amp;amp;gt; amp;amp;lt;br / amp;amp;gt; amp;lt;br / amp;gt; lt;br / gt; br / colors=img.getcolors() amp;amp;amp;lt;br / amp;amp;amp;gt; amp;amp;lt;br / amp;amp;gt; amp;lt;br / amp;gt; lt;br / gt; br / cl=len(colors) amp;amp;amp;lt;br / amp;amp;amp;gt; amp;amp;lt;br / amp;amp;gt; amp;lt;br / amp;gt; lt;br / gt; br / l=img.getdata() # 当前操作的像素集合 amp;amp;amp;lt;br / amp;amp;amp;gt; amp;amp;lt;br / amp;amp;gt; amp;lt;br / amp;gt; lt;br / gt; br / ## starttime=clock() amp;amp;lt;br / amp;amp;gt; amp;lt;br / amp;gt; lt;br / gt; br / amp;amp;amp;lt;/p amp;amp;amp;gt; amp;amp;lt;br / amp;amp;gt; amp;lt;br / amp;gt; lt;br / gt; br / amp;amp;amp;lt;p amp;amp;amp;gt; amp;amp;lt;br / amp;amp;gt; amp;lt;br / amp;gt; lt;br / gt; br / i=cl-1 # 65 amp;amp;amp;lt;br / amp;amp;amp;gt; amp;amp;lt;br / amp;amp;gt; amp;lt;br / amp;gt; lt;br / gt; br / while i amp;amp;amp;amp;gt;0: amp;amp;amp;lt;br / amp;amp;amp;gt; amp;amp;lt;br / amp;amp;gt; amp;lt;br / amp;gt; lt;br / gt; br / dim=sqrt(len(l)) # 确定宽高 amp;amp;amp;lt;br / amp;amp;amp;gt; amp;amp;lt;br / amp;amp;gt; amp;lt;br / am ...

阅读全文 »