newbie_evolve's Blog

Happy coding

namedtuple()的用法

namedtuple是python中collections模块的一个函数,它的作用是将元组封装成类类型,以python中类的形式方便用户使用。

代码如下所示:

import collections

#Human是重命名的元组(tuple)的新名字,可以将它看做一个工厂类。

Human= collections.namedtuple('Person','name age gender')
print 'Type of Human',type(Human)#结果为<type,'type'>
bob = Human(name = 'bob',age = 30,gender = 'male')
print 'Representation:',bob
jame = Human(name = 'jame',age = 29,gender = 'female')
print 'Field by name:',jame.name
for people in [bob,jame]:
    print "%s is %d years old %s"% people

经过namedtuple的Person有三个元素,分别名为name,age,gender,它们之间使用空格隔开。

可以使用bob.name来访问name属性

namedtuple(typename, field_names)

注意typename可以与所赋值的名称不一致,例如:

Human= collections.namedtuple('Person','name age gender')

编程是一种艺术创作

“软件正在吞噬世界。”——马克 · 安德森

 

在新一轮的信息技术革命中,我们已经见证,软件对社会生产的方方面面,产生了深刻的影响,它们侵入并颠覆了已经建立起来的行业架构。越来越多的大企业和行业开始依靠软件运行,并提供在线服务,从零售行业的沃尔玛,到音乐行业的苹果公司iTunes,再到动画电影公司皮克斯。

与此同时,过去的四十年中,软件行业可能创造了全世界最多的财富,很多赚到大钱的人都是顶尖的程序员,像我们熟知的Microsoft、Oracle、Amazon、Google、Facebook的创始人、丁磊、马化腾、李彦宏、周鸿祎等等。

编程是一种艺术创作
这些赚到大钱的、少数的、顶尖的程序员,创造了世界上绝大多数优秀的软件。可以说,最顶尖的5%的程序员写出了全世界99%的优秀软件。

为何会出现这种现象?能否用大量普通的程序员,取代个别优秀的程序员,通过堆大量的时间,来创作优秀的软件?

答案显然是否定的。为什么?

不仅仅因为,在工作效率上,一个优秀的程序员可以抵10个甚至更多的、普通的程序员;更因为,不管多少普通的程序员、工作多长时间所做出的东西,都无法像个别优秀程序员做的那样好,更别说做出卓越的软件。在开发普通软件上,他们可能只是效率的区别,但是在创作优秀软件、卓越软件上,普通程序员与优秀程序员之间,是有和无的效用差别,而不是60和100的效率差别,就如同,100个普通的画家,再怎么努力工作,也无法创作出媲美梵高作品的传世之作。

 

归根到底,编程是一种艺术创作(注:艾兹格 · 迪科斯彻:程序设计是一门艺术)。创作优秀软件的很多部分,并不与科学相关,它更多地需要程序员具有艺术家一样的特质:

想象力与创造力
黑客搞懂“计算理论”的必要性,与画家搞懂颜料化学成分的必要性差不多大,黑客新想法的最佳来源,并非那些名字里有“计算机”三个字的理论领域,而是来自于其解决问题的创作领域;

追求卓越、专注细节的态度
正如他们所说:

“电影人似乎不能理解创业者创建一样东西纯粹的是因为他们喜欢创建东西。” ——马克 · 扎克伯格评电影《社交网络》。

“我们不停地添加代码,像画家添加色彩,作曲家添加音符,每一个小细节都必须有依据……努力使每件事情完美地组合在一起,以一种前人未曾做过的方式。这使得工程师称为真正的艺术家。”——斯蒂夫 · 沃兹尼亚克 。

硅谷创业孵化公司Y Combinator创始人保罗 · 格雷厄姆的说法则更为直接:“程序员是现存最大的手工艺人群体,黑客与画家的共同之处,在于他们都是创作者,都试图创作出优秀的作品。”

 

为什么将编程当作一种艺术创作在中国这么重要?
“光有科技是不够的。科技要和人文、艺术联姻,才能产生让我们的心为之歌唱的结果。” ——史蒂夫 • 乔布斯

 

在中国,世人已习惯于把金钱与声誉赋予,贩卖工程师所创造产品的,商人;商人建造一部部商业机器,为追求最大利益,降低风险,他们把程序员变成流水线上的苦力;甚至有些可笑的商人,认为用许多平庸的程序员,就可以取代优秀的程序员;他们认为程序员最好不要有太多的想法和创造力,程序员唯一的职责就是将产品规格如实地翻译成代码,而不是设计软件。总之,在中国程序员被大规模代码工人化,程序员们被戏称为码农或IT民工。

中国企业更关注软件作为科学与工程的部分,但却忽略了其人文与艺术的部分,忽略了编程是一种艺术创作,这一美国软件与黑客文化的核心。这或许就是中国有不少通过CMM高等级的企业,却不能开发出被世界普遍认同、真正优秀软件的原因吧。

Steve Woz在伯克利分校的毕业典礼上宣称“人性必胜!技术天才一定能够拯救人类!”。在这个时代,在这个软件吞噬一切的时代,具有艺术家特质的程序员----黑客,永远值得我们期待。哪怕是商人,你都应明白:顶尖程序员是创造财富最稀缺的资源

蹩脚的程序员

学习编程也有四五年之久,但情况明显并未好转,至今仍然是蹩脚的程序员。

我知道单靠时间的积累对于成为一个优秀的程序员、甚至是顶尖的程序员的帮助不大。但是我不明白自己缺少了什么不可缺少的要素?

也许是我从未认真的编程,即没有对编程产生浓厚的兴趣。所以每次写程序都是兴趣索然~ 我明白这样的道理:在自己喜欢的领域中从事,这样才能距离成功更近。激情、兴趣~ 简单的两个词却可能束缚了我在编程之路上前进的脚步。张五常说“兴趣取决于你所投入的时间和精力”,他深信兴趣来源于对领域知识的探求以及精力的投入,所以要变得充满激情就必须多投入时间与精力。

也许是我学习的方法不多,编程虽然理论很重要,但是实践同样非常重要。两者都不可或缺,我以前太重视理论的学习,很少把所学的东西应用与实践,用实践来检验自己的知识。所以在学习的过程中,基本上似懂非懂的感觉,完全达不到知其所以然的境界。

告别蹩脚的程序员,是我一直追求的目标。

Eclipse+pydev常用快捷键

多行缩进(减少缩进):tab/shift+tab

复制行:Ctrl+Alt+方向键'↓'

删除行:Ctrl+d

自动完成/单词补全:Alt+/

注释:Ctrl+/注释

窗口大小:Ctrl+m

上一个/下一个光标的位置:Alt+Left/Right

上一个/下一个成员(成员对象或成员函数):Ctrl+Shift+Up/Down

在当前行下插入一行:Shift+Enter

上下移动选中的行:Alt+Up/Down

前一个/后一个单词:Ctrl+Right/Left

删除上一个/下一个单词:Ctrl+Delete/Backspace

python常用的内建函数

1、abs(x)返回x的绝对值

2、apply(function,args[,keywords]):apply()函数将args参数应用到function上。例如:apply(add,(1,2,3))等价于add(1,2,3);keywords参数应该是个字典,字典的关键字是字符串。apply(add,("hello",'world'),{'a':1,'b':2})注:'a','b'与def add(a,b)中的形参名a,b两个参数相同

3、buffer(object[,offset[,size]]):如果object对象支持缓存调用接口,buffer()函数为object对象创建一个新缓存。

4、callable(object),如果object函数是可以调用对象,则返回真True;否则为假Flase

5、chr(i):返回与ASCII码i相匹配的一个单一字符串。例如:print chr(72)+chr(101)+chr(108)+chr(111)为hello。chr()函数是ord()函数的反函数,ord()函数将字符串转换回ASCII整数码。

6、cmp(x,y):比较两个对象是否一样或大小。

7、coerce(x,y)返回一个元组,该元组由两个数值型参数组成(x,y)。

8、compile(string,filename,kind)该函数将string编译为代码对象,编译生成的代码对象接下来被exec语句执行,接着利用eval()函数对其进行求值。filename参数应是代码从其中读取的文件名。如果内部生成文件名,filename参数值应是相应的标识符。kind参数指定string参数中所含代码的类别。kind取值为exec对应语句序列,取值为eval对应对简单表达式,取值为single对应简单交互语句。例如:a = compile('print "hello world"','<string>','single');exec(a) ;eval(a)

9、complex(real,[image])该函数返回一个复数。

10、delatrr(object,name)该函数在object对象许可时,删除object对象的name属性,此函数等价于如下语句:del object.attr

11、dir([object])当没有参数时,dir()函数列出当前局部符号表中保存的名字。

12、divmod(a,b)该函数返回一个元组,该元组包含a除以b的商和余数,如下所示:divmod(7,4)为(1,3)

13、eval(expression[,global[,locals]])该函数将expression字符串作为python标准表达式进行分析并求值,返回expression字符串的值,当不可调用其他可选参数时,expression访问调用该函数的程序段的全局和局部对象。要执行混合了语句和表达式的python任意代码,使用exec语句或使用execfile()函数来动态地执行含有任意代码的文件。

14、execfile(file[,global[,locals]])该函数与exec语句等价,不同之处在于:execfile函数执行文件中的语句,而exec语句处理字符串。

15、filter(function,list)该函数根据function参数返回的结果是否为真(True)来过滤list参数中的项,最后返回一个新列表。例如:a = [1,2,3,4,5,6,7,8,9]; b = filter(lambda x:x > 6,a); print b;b = [7,8,9]

16、float(x)该函数将x参数转换为浮点数,其中x可以使字符串,也可以是数字。

17、getattr(object,name[,default])改函数返回object的name属性值,在语法上,以下语句:getattr(x,'myvalue')等价于x.myvalue,如果参数不存在,但给出了default参数的值,则该函数返回default参数值,否则引发AttributeError异常。

18、globals()该函数返回一个表示当前全局符号表的字典。这个字典通常就是当前模块的字典。如果globals()函数在一个函数或方法中被调用,它就返回定义该函数或方法的模块的符号表,而不是调用此函数的模块的符号表。

19、hasattr(object,name)如果object对象具有与name字符串想匹配的属性,hasattr()函数返回真True,否则返回Flase。

20、hash(object)该函数返回关于object对象的整数散列值。如任何两个对象比较起来是等价的,则它们的散列值是一样的。与id()效果相似?

21、hex()该函数将一个整数转换为十六进制字符串,该字符串是个有效的python表达式。

22、id()函数返回值为一个整数,是改对象的“标识”,该标识在其对应对象的生命期内,确保是唯一的和恒定不变的。

23、input()该函数与raw_input()等价

24、isinstance(object,class)该函数在object参数是class参数的一个实例是,返回为真。

25、issubclass(class1,class2)如果class1参数是class2参数的子类,issubclass函数返回真。

26、len()函数返回一序列(字符串、元组或列表)或字典对象的长度。

27、list()该函数返回列表。例如:list('abc');结果为['a','b','c']

28、locals()该函数返回表示当前局部符号表的字典。

29、long(x)该函数将字符串或数字转换为长整型数,对浮点数的转换遵循与int()相同的规则。

30、map(function,list,...)该函数将function运用到list中的每一项上,并返回新的列表,如下例所示:a = [1,2,3,4];map(lambda x:pow(x,2),a) 为[1,4,9,16]

31、max(s,*,args...+)返回序列s的最大值。当给定一列参数时,该函数返回给定参数的最大参数。

32、oct()该函数将整数转换为八进制字符串。其结果是个有效的python表达式。

33、open(filename[,mode[,bufsize]])该函数通过mode和缓存bufsize类型打开filename标识的文件,此函数返一文件对象。

34、pow(x,y[,z])该函数返回以x为底数以y为指数的幂值。如果给出z,该函数就计算x的y次幂值被z取模的值,即等价于pow(x,y)%z

35、range([start,]stop[,step])

36、reduce(funciton,sequence[,initializer])该函数一次应用function到sequence中的每个元素上,逐渐缩短整个语句直到为一个单一的值。例如:reduce(lambda x,y:x*y,[1,2,3,4])等价于(((1*2)*3)*4)

37、reload()该函数将以前导入过的模块再加载一次。重新加载包括最初导入模块是应用的分析过程和初始化过程。

38、repr()函数返回对象的字符串表示。这与将对象或属性适用单反引号的结果是一致的。

39、round(x[,n])该函数返回浮点型参数x舍入到十进制小数点后n位的值。如:round(1985,-2)为2000.0

40、setattr(object,name,value)该函数将object参数的name属性设置为value参数值。setattr()函数是getattr()函数的反函数。

41、slice([start,]stop[,step])该函数返回一序列的切片对象,该对象表示由range([start,]stop[,step])指定的索引集。例如:range[20][slice(0,5,2)]结果为[0,2,4]

42、str()该函数与repr()函数相似,唯一不同之处在于:此函数的返回值设计为可打印字符串而不是与eval()函数相兼容的字符串。

43、tuple(object)函数返回一个元组,该元组的项与项的顺序与sequence参数完全一样,例如:tuple('abc')为('a','b','c')

44、unichr(i)该函数返回代码是一个整型参数i的unicode字符的unicode字符串。要将unicode字符转换回整数格式,可以使用ord()函数,没有uniord()函数。

45、unicode(string[,encoding[,errors]])该函数利用编码格式解码器将给定的字符串从一种格式解码为另一种格式。编码的任何错误都用errors参数定义的字符串标记。

46、vars([object])该函数返回对应于当前局部符号表的字典。

47、xrange([start,]stop[,step])该函数与xrange()函数一样,唯一的区别是:xrange()函数返回一个xrange()对象。利用xrang()函数节省下来的内存比起用range()函数是相当可观的。

48、zip()函数处理一系列序列,将这些序列返回一个元组列表。其中每个元组包含了给定的每个序列的第n个元素。例如:a = [1,2,3]; b = [4,5,6] ;zip(a,b) = [(1,4),(2,5),(3,6)]

49、执行任意语句:python支持3条指令,这3条指令允许执行一些任意文件或python代码的字符串,这3条指令是exec()语句、execfile()语句和eval()语句

看不见的手

在亚当斯密所写的《国富论》说:一只看不见的手引导人们对生活必需品作出几乎同土地在平均分配给全部居民的情况下所能作出的一样的分配,从而不知不觉地增进了社会利益,并为不断增长的人口提供生活资料。

他所描述的看不见的手正是“市场机制”(目前比较普遍的观点)。同样的道理,人们在为人处事方面也被一只看不见的手操纵着,它就是“价值观”。你的价值观已经与灵魂融为一体,它不仅引导着我们的生活态度,也同样指导着我们的行为。我们的任何行为,都是自身价值观的流露。

想要了解你的态度和行为,先了解你的内在价值观。

Google公司的核心价值观:专注解决用户问题,无论多大商机,坚决不做邪恶的事情,赚钱和其他问题以后再说,坚持“最好还不足够好”的标准,永远提升自己,寻找更好的解决方案。

微软公司的核心价值观:诚实和守信,公开交流,尊重他人,与他人共同进步。善于自我批评和自我改进、永不自满等。

公司考察员工与公司价值观是否相符,大致分为四种可能:

1、绩效达标,价值观与公司吻合——很简单,公司将毫无犹豫地为他提供奖赏或晋升的机会。

2、绩效没达标,价值观与公司不吻合——也很简单,马上请他走人。

3、绩效没达标,但与公司的价值观吻合——再给他一次机会,考虑为他重新分配工作。

4、绩效达标,但价值观与公司不吻合——这一种人是能够杀死一家公司的那种人。现实证明,很多公司就是因为接受了这些能够达到绩效指标、但品格很差的员工,才走向最终的崩溃的。

企业的价值观是企业的灵魂,它吸引着那些志同道合的员工,是一个企业拥有优秀企业文化的内在动力。

价值观对于个人也同样重要,价值观的缺失也意味着灵魂的不完整。特别大众所认同的价值观甚至构成了整个社会的道德标准,例如诚信、勤劳等。

在我心中有个疑问:为何许多有相近的价值观的人,行为和态度差距甚大?可能是从内在到外在的表现程度上有差异吧。正如我们认同一种观念,却不一定按照这个观念去做事。这就是所谓的表现程度或执行力度~

纵观所能取得非凡成就或成大事之人,他们和普通民众的价值观相差不大,但是执行力度和表现程度上明显要高很多。所以慎重的思考和选择自己的价值观,然后谨慎稳健的执行与价值观相同的事情,才是言行如一,表里如一,成大事之前提。

一只看不见的手在操纵着我们的行为,它来自于我们内在的价值观,认真思考和甄别,就能看到那只手,甚至掌握和用它做我们想做的事情。

成功的定义

节选自:李开复的《做最好的自己》

成功并不遥远,也许不虚此生,就是我的成功!

中国社会有一个通病,就是希望每个人按照一个模式发展,衡量每个人是否成功时所采用的也是一元化的标准:在学校看成绩,进入社会看名利。

英雄何必论出身。一个优秀、努力、自信、有觉悟的学生,进入名牌大学,他能取得成功的概率也许是90%,进入了其他重点大学,概率也许会降到85%,进入普通高校,这个概率也不会低于80%。但是一个没有良好的价值观,没有正确态度的学生,即使进入名牌大学,他的成功率也一定为零。(愿你能把握住85%的成功机会,不要做一个自暴自弃的人)。

多元化的成功鼓励年轻人追随自己的梦想和兴趣,发掘自己最大的潜能。

成功不可复制,但可以借鉴。每个人都有自己独特的特质,所以每个人的成功都是独一无二的。“做最好的自己”是通往多元化成功的必然途径;只有一元化的成功才会强迫人们复制他人的成功模式。

每个人都有自己的特长与潜质,在多元化成功的模型中,只要主动选择,每个人都有成功的机会

我们是野生植物,不是园林植物。每个人独特的优点,就是自信的源泉。

成功同心圆,由内而外:价值观->态度->行为->成功。

成功同心圆的中心是价值观。态度是行动的前提,态度受价值观的指导,态度是为人处世的基本原则。

六种态度:积极、同理心、自信、自省、勇气、胸怀。

六种行为:追寻理想、发现兴趣、有效执行、努力学习、人际交流、合作沟通。

态度与行为的对应:以勇气指导自己追寻理想;以自信培养、发现兴趣;以自省指导有效执行;以积极的态度努力学习;以同理心指导人际交流;以胸怀促进团队合作与相互沟通。

有勇气改变可以改变的事情,有胸怀接受不可改变的事情,有智慧来分辨两者之间的不同。

知其所以然

孔子说:“学而不思则罔,思而不学则殆”。孔子不愧为大师,一句话道尽了学问的真谛。我们知道学问、学问,关键在于学与问。学而不问,那么心中的疑惑很难解决。问而不学只不过是照搬别人的思想和学问,终究还是他人的精神奴隶。所以学问贵在学和问。孔子说“不耻下问”以及“三人行,必有我师”说的也是这个道理。

最近一直在思考西方教育和中国教育的差别。如果说知识的获取需要经历三个步骤:感性认识——思考——知识。那么中国教育一般只包含了第一阶段和第三个阶段,即直接从感性认识到知识,缺少了中间“思考”的过程。这种教育方式有很大的弊端,直接让学生获得知识,告诉他们哪些是对的,直接导致学生的独立思考能力无法提升,碰到任何问题都不会主动思考,而是直接把答案死记硬背。甚至不如告诉他们错误的知识和观点,让他们自己通过分析和思考去识别。西方教育兼顾了“思考”这一过程,而且非常注重“独立思考”。

无论哪种教育方式,如果单纯的只是“知其然不知其所以然”,这种教育带来的弊端很大,通常导致经验主义和思维僵化。

最近发现自己无法专注于技术,因为长期以来一直存在着“知其然不知其所以然”的弊端,总是强记对的东西,而没有经过思考内化为自己的知识,所以想用的时候也想不起来,这就是思维僵化的缘故。

所以需要把所学的知识系统的梳理一遍,追本穷源的思考和学习,达到知其所以然,然后确定“知其然”的程度,这样才是我所追去的“独立思考”。

Python设计模式之“代理模式”

代理模式:为其他对象提供代理以控制对这个对象的访问。代理模式在客户端和目标对象之间起到中介的作用,这样起到了的作用和保护目标对象的作用。

 

class Interface():#接口类,RealSuject与Proxy都实现接口类中的Request方法

    def Request(self):

        pass


class RealSubject(Interface):

    def Request(self):

        print "I want to buy a flower"  


class Proxy(Interface):#Proxy与RealSubject类相关联,调用其Request()方法,这样客户端只知道Proxy不清楚RealSubject类的对象

    def Request(self):

        self.realsubject = RealSubject()

        self.realsubject.Request()

        

if __name__ == "__main__":

    p = Proxy()

    p.Request()

 

谈知识投资

出自《程序员修炼之道》

对知识资产的投资总能获得最好的回报

                                                  -----本杰明-富兰克林

其实知识投资就是不断学习,提高自己能力的过程,而这个能力,就是知识资产的外在表现形式。

对知识资产的投资和金融资产的投资有很多地方其实很像,对于金融投资来说,基本原则如下

  • 需要持续的投资,周期性的投资
  • 需要找有价值的股票进行投资
  • 要控制好风险,一般来说,高风险高收益,低风险低收益。需要自己评估风险,来进行组合投资。不能把鸡蛋放在一个笼子里面
  • 金融投资的基本原则是低买高卖 
  • 需要定期的分析和评估自己目前资产

 

知识投资建议:

什么是获得智力资本、从而为你的资产提供资金的最佳方式呢?这里有一些建议。

1.         每年至少学习一种新语言。

不同语言以不同方式解决相同的问题。通过学习若干不同的方法,可以帮助你拓宽思维,并避免墨守陈规。此外,现在学习许多语言已经容易许多,感谢可以自由获取的网上软件财富。

2.         每季度阅读一本技术书籍。

书店里摆满了许多书籍,讨论与你当前的项目有关的有趣话题。一旦你养成习惯,就一个月读一本书。在你掌握了你正在使用的技术之后,拓宽范围,阅读一些与你的项目无关的书籍。

3.         也要阅读非技术书籍。

记住计算机是由人——你在设法满足其需要的人——使用的,这十分重要。不要忘了等式中的人这一边。

4.         上课。

在本地的学院或大学、或是将要来临的下一次会展上寻找有趣的课程。

5.         参加本地用户组织。

不要只是去听讲,而要主动参与。与世隔绝对你的职业生涯来说可能是致命的;打听一下你们公司以外的人都在做什么。

6.         试验不同的环境。

如果你只在Windows上工作,就在家玩一玩Unix(其实可自由获取的Linux更合适)。如果你只用过makefile和编译器,就试试IDE,反之亦然。

7.         跟上潮流。

订阅商务杂志和其他期刊。选择所涵盖的技术与你当前的项目不同的刊物。

8.         上网。

想要了解某种新语言或其他技术的各种特征?要了解其他人的相关经验,了解他们使用的特定行话,等等,技术论坛是一种很好的方式。上网冲浪,查找论文、商业站点,以及其他任何你可以找到的信息来源。