锁定老帖子 主题:Why not Python?
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2006-11-15
Suninny 写道 要是Python也具备Closure(Block)的话我绝不会多瞧下Ruby。
那么你可以不瞧ruby了 :) Python的函数是first class的,可以象block一样传递,功能一样,感觉比block更自然。 |
|
返回顶楼 | |
发表时间:2006-11-15
qiezi 写道 我倒觉得相比起ruby来,python只能算是中规中矩,没多少出彩的地方。
ruby我认为最强的地方是可以open一个类,扩充它。另一个强的地方是关键字,ruby的关键字很少,而且很多关键字可以当成方法名来用,限制很少,只要你愿意,可以随意地扩充ruby,把它看成是语言的一部分。 应该说python更加叛逆一点。而ruby顺着另外一条莫测的道路多走了几步。 python最叛逆的是空白缩进强制性。ruby则是在把新的特性引入,但是是好是坏,确实很莫测。 |
|
返回顶楼 | |
发表时间:2006-11-15
qiezi 写道 我倒觉得相比起ruby来,python只能算是中规中矩,没多少出彩的地方。
ruby我认为最强的地方是可以open一个类,扩充它。另一个强的地方是关键字,ruby的关键字很少,而且很多关键字可以当成方法名来用,限制很少,只要你愿意,可以随意地扩充ruby,把它看成是语言的一部分。 Python也具有Open Class 的特色的呀,你也可以实现这样的功能的。 class openclass(): def test(): print "test" open = openclass() open.test() def test1(): print "test1" open.test=test1 open.test() 还有那个method missing,python也有的。 目前个人感觉ruby比较明显的就是语法大多数比较简洁,从字符数上来说。 BTW:听说你对D语言挺了解,什么时候发点关于D语言的Function的帖子吧 |
|
返回顶楼 | |
发表时间:2006-11-15
geradle 写道 qiezi 写道 我倒觉得相比起ruby来,python只能算是中规中矩,没多少出彩的地方。
ruby我认为最强的地方是可以open一个类,扩充它。另一个强的地方是关键字,ruby的关键字很少,而且很多关键字可以当成方法名来用,限制很少,只要你愿意,可以随意地扩充ruby,把它看成是语言的一部分。 Python也具有Open Class 的特色的呀,你也可以实现这样的功能的。 class openclass(): def test(): print "test" open = openclass() open.test() def test1(): print "test1" open.test=test1 open.test() 还有那个method missing,python也有的。 目前个人感觉ruby比较明显的就是语法大多数比较简洁,从字符数上来说。 BTW:听说你对D语言挺了解,什么时候发点关于D语言的Function的帖子吧 这个 python open class 的代码是运行期的行为。 能否更 declaraction 一点? ruby 的 open class 严格来说,也是运行期的行为。因为就没有编译期。 不过,那个 include module 还有点 declaration 的影子。 method missing 不错。p 说明,理论上, python 的 web framework 也应该能够达到rail 的这个程度。 |
|
返回顶楼 | |
发表时间:2006-11-15
geradle 写道 Python也具有Open Class 的特色的呀,你也可以实现这样的功能的。 class openclass(): def test(): print "test" open = openclass() open.test() def test1(): print "test1" open.test=test1 open.test() 还有那个method missing,python也有的。 目前个人感觉ruby比较明显的就是语法大多数比较简洁,从字符数上来说。 BTW:听说你对D语言挺了解,什么时候发点关于D语言的Function的帖子吧 python似乎没办法扩充那些核心类呀,比如str类,ruby就没什么限制。 D语言的Function方面没多少可挖掘的,它有C的函数指针,C#的委托,C++的函数对象(仿函数),仅仅在语法上优于C/C++,并没有多少新东西,我还没深入研究,但目前看来应该还没多少亮点。 |
|
返回顶楼 | |
发表时间:2006-11-15
buaawhl 写道 这个 python open class 的代码是运行期的行为。 能否更 declaraction 一点? ruby 的 open class 严格来说,也是运行期的行为。因为就没有编译期。 不过,那个 include module 还有点 declaration 的影子。 geradle的那个代码更多的是open object methods的功能,而且不像是python的代码,方法的第一个不是self啊 python在open class和open object methods的实现上有非常微妙的差别,主要就是这个self引起的。针对class的修改是含self的(需要声明,但调用时不需要给出,解释器自动添加这个参数),并且影响到这个类所有的对象(包括以前生成的);对object的属性的赋值是不带self的(解释器不会自动添加self参数),并且只影响到被修改的对象。 我估计和ruby的区别主要是python中function是first class造成的,而方法是函数的一个特例,从而产生绑定和非绑定的区别。但仔细思考之后,发现这个处理方式是自洽的 如: >>> class A(object): ... def xxx(self): ... print 'xxx' ... >>> a = A() >>> a <__main__.A object at 0x00B33C90> >>> a.xxx() xxx 这里A是一个普通类,有一个xxx方法。 a是A的对象 >>> a.xxx = lambda :15 >>> a.xxx <function <lambda> at 0x00B30AB0> >>> a.xxx() 15 将a的xxx方法替换成 lambda : 15. 成功。说明这个时候解释器不会自动添加self >>> a.xxx=lambda self:15 >>> a.xxx() Traceback (most recent call last): File "<stdin>", line 1, in ? TypeError: <lambda>() takes exactly 1 argument (0 given) 将a的xxx方法替换成 lambda self:15,执行失败,进一步说明这个时候解释器不会自动添加self >>> a.xxx(a) 15 手工添加第一个参数,成功. >>> a1 = A() >>> a1.xxx() xxx >>> A.xxx = lambda :16 >>> a1.xxx() Traceback (most recent call last): File "<stdin>", line 1, in ? TypeError: <lambda>() takes no arguments (1 given) 上面代码在类层次上修改方法,执行结果说明解释器自动传入了self作为第一参数,该方法处理上是bound的 >>> a.xxx() Traceback (most recent call last): File "<stdin>", line 1, in ? TypeError: <lambda>() takes exactly 1 argument (0 given) 说明a.xxx一旦在对象作用域内并重新赋值,则必然覆盖类作用域中的定义和重新定义 但是类定义更改后的新对象,以及那些没有在对象作用域内的同名方法赋值的老对象,将调用修改后的类定义中的新方法,如下 >>> A.xxx = lambda self : 16 >>> a1.xxx() 16 >>> a.xxx() Traceback (most recent call last): File "<stdin>", line 1, in ? TypeError: unbound method <lambda>() must be called with A instance as first ar ument (got nothing instead) >>> a.xxx(a) 12 |
|
返回顶楼 | |
发表时间:2006-11-16
首先纠正的一点是我上面的代码错误。
class openclass(): def test(): print "test" 修改后的代码应该是: class openclass(): def test(self): print "test" 缺少了Self在调用中是会出错的,昨天拷贝失误不好意思。 如果缺少self的话,调用会出现如下的错误: >>> open.test() Traceback (most recent call last): File "<pyshell#18>", line 1, in <module> open.test() TypeError: test() takes no arguments (1 given) >>> open.test=lambda:5 >>> open.test <function <lambda> at 0x00B46EB0> >>> open.test() 5 但是当我们对openclass的instance的test方法进行改变,却能正确运行。为什么会这样呢,我想应该和python对对象方法的搜寻路径有关,当我们改变了open.test之后,可以看出其地址为 <function <lambda> at 0x00B46EB0> 关于Charon在前面提到,可以直接改变类的方法,导致的Bound&Unbound的问题,我觉得应该也可以从对象方法搜索上来解释。这方面暂时没有任何了解,希望知道人share一下。过阵子自己也看看。 BTW:在写这个帖子的时候发现预览功能的一个defect,只在预览的时候有,提交了就没有。 |
|
返回顶楼 | |
发表时间:2006-11-17
引用 python感觉就是缺少了一个非常明确的应用方向.好像很多都可以做,让人难选择.
因为python可以做很多事情,而且还碰巧都干得不错,所以没有明确的应用方向?大家想要得是只能干一样事的语言? Charon的解释不错,其实py和rb之间几乎没有什么是一个做得了一个完全没办法的,当然代价有不同。总的来说rb在open class/mixin上的确更加简洁优雅,而py则明显差了一点。 楼主引用的这篇文章讲得很清楚啦,py的最大优势在于它可以用来做几乎任何事情,毕竟,很多应用不是ROR这样一个web framework可以涵盖的。从语法上讲,rb9分的话py可以有8分,从应用的范围讲,py9分的话,rb大概只有5分左右(完全毫无根据的个人印象分)。 忍不住广告一番: NumPy:科学运算库,已经是最新的官方发布的一部分了,NASA用它来计算运行轨道,所以应该还是值得信赖的。 google crawler 是python + C++写的。 bittorrent的官方实现。 twisted,超全的网络库。 Jython/Iron Python,可以使用绝大多数的python标准库以及java/.net库。 Django,数个python web framework中的一个,代表站点芝加哥犯罪网(http://www.chicagocrime.org/), 这是一个整合了芝加哥公共犯罪数据库,google map, 以及相关犯罪的新闻报道的站点。 SqlAlchemy:数据库工具包,从最底层的简单包装到ORM,已经与Django集成,大大提升了Django对遗留数据库系统的支持。 wxPython,不夸张地讲,这个项目重新激活了wxWindows项目。 ... 太多太多,我现在做的一个项目,delphi画界面,python实现功能,就一个字,爽,呵呵。 很喜欢rb的语法,但是如果不能迅速扩大应用范围的话,可能最后连web这一块都悬,这个世界毕竟不是只有web项目的,web项目也毕竟不是只做教程上做的事情的。 |
|
返回顶楼 | |
发表时间:2006-11-17
javavsnet 写道 那么你可以不瞧ruby了 :) Python的函数是first class的,可以象block一样传递,功能一样,感觉比block更自然。
你是说Python中受限的lambda问题可以由def func:之类的来解决吧。--功能性是能达到,却不符合简洁和审美的需要。给你看两段Ruby代码: create_table "forums", :force => true do |t| t.column "name", :string t.column "description", :string t.column "topics_count", :integer, :default => 0 t.column "posts_count", :integer, :default => 0 t.column "position", :integer end task "prepare-release" => ["clobber"] do puts "Preparing release of #{PROJECT} version #{VERSION}" Rake::Task["test"].invoke Rake::Task["rdoc"].invoke Rake::Task["package"].invoke end |
|
返回顶楼 | |
发表时间:2006-11-17
Suninny 写道 你是说Python中受限的lambda问题可以由def func:之类的来解决吧。--功能性是能达到,却不符合简洁和审美的需要。给你看两段Ruby代码: create_table "forums", :force => true do |t| t.column "name", :string t.column "description", :string t.column "topics_count", :integer, :default => 0 t.column "posts_count", :integer, :default => 0 t.column "position", :integer end 这个和 users_table = Table('users', meta, Column('user_id', Integer, primary_key=True), Column('user_name', String(16)), Column('password', String(20)) ) 没啥本质区别吧. 最大的差别是ruby在方法调用时可以省略括号造成的. 但从审美上来说看起来更加自然一些: 用最朴实的方式以同样的简洁实现了同样的功能,何必要求诸于block? |
|
返回顶楼 | |