Chinaunix

标题: python 的特点? [打印本页]

作者: tianqio    时间: 2008-05-24 23:23
标题: python 的特点?
最近用pyhton写了几千行代码,感觉写的代码与java的很相似,没有体会到用python写的快感,当然我没有涉及到函数式编程的方面,相反动态语言使得IDE没法充分做代码的自动补全,让我觉得写代码的速度降低不少,请问python最大的特点是什么?要怎样写才能与其他语言不一样,实在是不想用所有的语言写出的代码都一个样,求教中
作者: shhgs    时间: 2008-05-25 04:26
第一,把函数当作参数传。

第二,把方法动态地插入对象或者类里。

第三,运用duck typing的思想。也就是说,不要过分重视类的继承关系,重视类的接口。

第一点比较简单,第二点和第三点相辅相成,属于高手有高手的想法和做法,俗手有俗手的做法。

建议楼主去看看Dive into Python。
作者: 2gua    时间: 2008-05-25 09:13
Python真的这么好啊?
作者: ttkk1024    时间: 2008-05-25 09:25
又见shhgs!!!!!!!!!!!!
崇拜中。。。。。。。。。。。
作者: broader    时间: 2008-05-25 11:31
原帖由 tianqio 于 2008-5-24 23:23 发表
最近用pyhton写了几千行代码,感觉写的代码与java的很相似,没有体会到用python写的快感,当然我没有涉及到函数式编程的方面,相反动态语言使得IDE没法充分做代码的自动补全,让我觉得写代码的速度降低不少,请 ...

python最大的特点个人认为是“直接”,你想做什么就做什么,来来回回主要就是处理List/Dictionary/Tuple这三种数据结构和关于这三种数据结构的方法,至于再外层的方法/形式多看看其他写的好的代码慢慢就熟悉了,如果你用java的思路写当然像java了,更多的时间还是花在算法上值一些。python做的开源项目其相关文档都对系统的数据结构描述的很清楚而且篇幅很多,因为其它的也没什么好写的,一看就懂,java可就不一样了,光整理一遍程序流程就能累个半死,文档中很多都在介绍架构、规范,内容很多、也很漂亮,就是不知道和具体的工作有什么关系?简而言之,java的废话太多!
python写的代码量大致应是java的2/3甚至1/2,比java还要更好阅读一些,这个效率不可小看,当初主要因为这个原因选择了python。
python的自省功能对于开发调试非常有用,喜欢问为什么的技术人员自然喜欢这样的开发语言。
python是posix标准的操作系统下的主流开发语言之一,而posix对于技术人员来说技术寿命更长、劳动价值更被认可一些。
曾经用GanttProject做过一个计划管理的项目,后面的维护过程痛苦不堪,击碎了对java的所有幻想。
最后,推荐一段python写的拼写检查代码,作者是Google 研究主任 Peter Norvig
http://norvig.com/spell-correct.html
中文翻译:
http://blog.youxu.info/spell-correct.html

[ 本帖最后由 broader 于 2008-5-25 11:59 编辑 ]
作者: luffy.deng    时间: 2008-05-25 21:19
shhgs说的第二第三点谁给个例子看看?
作者: tianqio    时间: 2008-05-25 21:25
python的oo现在用的还不熟练,正在学习之中,感觉与c++,java的区别还是比较大的,下一步加强领会first class的函数带来的好处,谢谢大家
作者: shhgs    时间: 2008-05-25 23:35
动态插入方法的例子。


  1. import datetime
  2. class Dummy():
  3.     pass
  4. o = Dummy()

  5. o.getTimestamp = lambda : datetime.datetime.now().strftime('%c')

  6. print o.getTimestamp()

复制代码


这是我所说的俗手的方法,不过这个方法最容易理解。如果你对Py能作什么还不了解到话,这个例子还是比较容易懂的。

真正搞产品的时候,应该做一个metaclass,然后让类去继承这个metaclass。我不太懂AOP,但好像AOP就是搞这个的。

第三点,最简单的用途是用在回调函数方面。

  1. def echo(s) :
  2.     return s

  3. CMD_MAP = {
  4.     'ECHO' : echo,
  5.     'UPPERCASE' : lambda s : s.upper()
  6. }

  7. class MyProtocol(LineReceiver):
  8.     def lineReceived(self, line):
  9.         try :
  10.             cmd, content = line.split(' ', 1)
  11.         except :
  12.             content = ''
  13.             cmd = line.strip()
  14.         self.transport.write(CMD_MAP[cmd](content) + '\r\n')
  15.         self.transport.loseConnection()
复制代码


这是我工作当中写的程序的一个片段,当然做了一些修改,不过大致的意思没变。这里,这个protocol实现的命令是完全可以扩展的。你只要定义一个接受string,同时返回string的函数,然后到CMD_MAP里面注册一把就行了。
作者: bingruoice    时间: 2008-05-26 08:47
shhgs  太崇拜了
作者: uumylife    时间: 2008-05-26 22:06
看了broader  提供的blog,感谢,学习中。
作者: xiaonanln    时间: 2008-05-29 22:18
原帖由 tianqio 于 2008-5-24 23:23 发表
最近用pyhton写了几千行代码,感觉写的代码与java的很相似,没有体会到用python写的快感,当然我没有涉及到函数式编程的方面,相反动态语言使得IDE没法充分做代码的自动补全,让我觉得写代码的速度降低不少,请 ...

可能你太object-oriented了,不够dirty
作者: chrisyan    时间: 2008-06-03 17:53
原帖由 shhgs 于 2008-5-25 23:35 发表
动态插入方法的例子。


import datetime
class Dummy():
    pass
o = Dummy()

o.getTimestamp = lambda : datetime.datetime.now().strftime('%c')

print o.getTimestamp()



这是我所说的俗 ...


看到了LineReceiver,transport,protocol,是twisted的代码?可否拿出来研究以下?
作者: 2gua    时间: 2008-06-03 21:45
Python
作者: shhgs    时间: 2008-06-04 09:07
原帖由 chrisyan 于 2008-6-3 17:53 发表


看到了LineReceiver,transport,protocol,是twisted的代码?可否拿出来研究以下?


公司的财产。再说太长了,根本没法讲。
作者: chrisyan    时间: 2008-06-04 11:42
哦,既然是这样,我就问shhgs兄一个困扰了我一段时间的问题吧,前提声明我不太熟悉网络编程,正在补习当中....
一个用twisted的服务器,接受用户的一个请求,可能开始有一个验证,然后会发过来一堆数据,服务器处理后把结果返回。
过程就是最普通的方式,不过我想不太出来如果client发过来的是二进制文件,服务器端怎么来区分数据的开头和结尾呢?因为发送开始和发送之后可能会有一些控制命令,以任何字符做为结尾,都不能保证二进制数据当中肯定没有这样的组合吧?这样就有可能把数据文件解释成控制命令了吧。难道要像sip一样控制流和数据流分开?我前段时间看了看smtp服务器的实现,因为smtp服务器是以\n\r作为控制命令结尾的,但是我也没看出来如果发送附件的时候,它是怎么判断附件已经发送完了的。
另:一般在传二进制数据的时候是用struct模块来做的吧?

如果能解答,不胜感激!!!
作者: shhgs    时间: 2008-06-04 12:11
binary协议对网络编程来说,一直是个难题。如果你看过The Art of Unix Programming之后,就会理解为什么Internet上这么多成功的协议,都是面向text的,甚至是基于行的了。如果这个协议是你设计的,那么我建议你尽量避免兩进制。如果一定要用,可以在发送发数据之前,预先通知server数据的大小,以及md5的checksum。有了大小之后,server就可以安排窗口,计算流量了。如果这个都不行,那我也不知道了。或许你得一个字节一个字节地数了。
作者: chrisyan    时间: 2008-06-04 13:24
嗯,好的,多谢提点。
这个协议是我来设计的,而且发的东西肯定是二进制的,没有办法用text来发。
那我就按照你所的来做,如果我用tcp来发,就算算md5和数据流大小。
如果用udp来发,那我就每个包都编上号,都算上md5,和数据长度,晕,貌似udp不是一般的烦啊
作者: shihyu    时间: 2008-06-04 14:23
原帖由 shhgs 于 2008-5-25 04:26 发表
第一,把函数当作参数传。

第二,把方法动态地插入对象或者类里。

第三,运用duck typing的思想。也就是说,不要过分重视类的继承关系,重视类的接口。

第一点比较简单,第二点和第三点相辅相成,属于 ...

___________________________________________________________________________


第一,把函数当作参数传。 可以舉個例子看看嗎?
作者: honglang13    时间: 2008-06-04 16:21
原帖由 shihyu 于 2008-6-4 14:23 发表

___________________________________________________________________________


第一,把函数当作参数传。 可以舉個例子看看嗎?



在python中万物皆对象,也就是函数也是对象,
不知道这个例子算不算:
import os
type(dir(os))




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2