Learning Python学习笔记(0分)

  • 主题发起人 主题发起人 左轻侯
  • 开始时间 开始时间

左轻侯

Unregistered / Unconfirmed
GUEST, unregistred user!
最近正在努力学习Python,写下了一些读书笔记,希望与有兴趣的朋友共享
目前还只写了三篇,以后的我会陆续贴出
原文在我的blog上面:
http://www.bloggern.com/Project.php?ProjectId=4
1
Learning Python
来自:左轻侯 406字节 2006-08-14 11:53:19 点击:10 回复:0
所属分类:生活

--------------------------------------------------------------------------------

昨天晚上在看从老孟那里蹭到的Learning Python 2ed影印版,一不小心看到了凌晨3点半。
我好象已经很久没有这样的热情去学习一门新的语言。上一门语言是C#,看的书是O'Reilly的Programming C#。书虽然是好书,但是C#太过庞大笨重,最后实在没有太多热情。写了这些年的PHP以后,对轻量级的Scripting Language有特殊的好感。
同时称赞一下东南大学这本影印版的质量,非常不错。
2
Learning Python: Page 48
来自:左轻侯 888字节 2006-08-14 21:12:54 点击:19 回复:1
所属分类:技术随笔

--------------------------------------------------------------------------------

以前读英文版的TIJ,一天能读50页,现在两天才读了50页,难道是老了?
前三章介绍了Python的基础知识,我认为最重要的部分就是Python的Runtime Execution Model。跟我想象的不一样,在某种意义上,Python和传统的解释型的脚本语言不一样,而是更接近于Java/C#这样的中间语言。
Python的code不是由解释器直接执行,而是先编译成Byte Code,然后在一个虚拟机中执行。因此,和Java一样,Python也有编译后的文件(.pyc),也有虚拟机(PVM),也有Just-In-Time编译器(Psyco),也能够被直接编译成本地代码(Frozen Binaries)。相比之下,Perl和PHP就没有中间代码这个层次。
但是,Python仍然具有解释型脚本语言的优势,它不需要额外的complie,它的complie是在run的时候自动运行的。它也可以以Interactive prompt的方式运行。
另外,Python的架构比Java更加开放,除了可以被编译为pyc以外,它也可以被编译成其他的Byte Code,例如Java Byte Code,在JVM上运行,或者.NET IL,在CLR上运行。这使得Jython、IronPython或者其他版本的Python很容易被实现。
3
Learning Python: Page 85
来自:左轻侯 3463字节 2006-08-16 01:59:46 点击:6 回复:1
所属分类:技术随笔

--------------------------------------------------------------------------------

数据类型。
相对C/C++,Python中的数据类型进行了明显的简化。我一直认为,面向应用的语言,不需要太多的数据类型。以Number为例,简单的int和float就可以满足绝大多数的需要了,至于是short还是long,是signed还是unsigned,可以由编译器和runtime去做优化。太过复杂的数据类型,虽然在底层开发时有用,但是在做应用的时候只会把人搞晕,特别是初学者。
Python的设定让我很满意,除了用于专门场合的八进制/十六进制类型和复数类型,只分成int、long和float,而从Python 2.2以后,int和long在使用上已经没有区别了。Python会自动进行映射和转换。这是一种优雅的设计。
随便可以提一下的是,Delphi在这一问题上的设计。Delphi提供了两种数据类型:简化的Generic Type和原始的Fundamental Type。以Integer为例,Generic integer type只有两种:
Type Range Format
Integer -2147483648..2147483647 signed 32-bit
Cardinal 0..4294967295 unsigned 32-bit
但Fundamental integer types有7种之多,覆盖了各种情况:
Type Range Format
Shortint -128..127 signed 8-bit
Smallint -32768..32767 signed 16-bit
Longint -2147483648..2147483647 signed 32-bit
Int64 -2^63..2^63-1 signed 64-bit
Byte 0..255 unsigned 8-bit
Word 0..65535 unsigned 16-bit
Longword 0..4294967295 unsigned 32-bit
Generic Type根据情况不同,被映射不同的Fundamental Type,例如在Win32下,Integer被映射到LongInt。程序员在平时可以使用Generic Type以简化开发,在需要开发底层程序,或者和其他语言打交道的时候,可以直接使用Fundamental Type。
这种方式较好地解决了Delphi的定位:既是一门主要面向应用的语言,又保留了底层开发的能力。当然,从另一方面来说,也可能是把人绕得更晕了。
运算符重载
Python支持运算符重载,这一点大出我的意料之外。即使是在C++中,运算符重载也是一种相当“前卫”的技术。C#/Delphi直到近期才加入对运算符重载的支持,Java似乎至今没有支持。让我感到吃惊的,当然不是Python赶了这个时髦,而是因为运算符重载是这样一种技术:使用得好,可以写出非常简洁而优雅的代码,但是如果使用不当,将会带来灾难性的后果。它对程序员的水平要求很高,并且会增加程序的复杂性。如果Python是作为一种简化的脚本语言来设计,那么它似乎不应该支持这样的技术。
我想,让Python支持运算符重载,应该是出于深思熟虑的选择。如果真是那样的话,可能证实了我的一种感觉,即:Python的目的,并不是象Java那样,创造一种简化的语言,通过去掉某些复杂的特性和限制程序员的行为,来降低使用的难度。Python(至少是CPython)的目的,就是为C++程序员提供一种更加简洁的表达方式,它其实对程序员的水平有很高的要求,它包含了几乎所有C++的复杂性。
如果说C++是专业的单反相机,那么Python不是傻瓜相机,它是一台带有全部手动功能的专业相机的袖珍版本。
这就是我在寻求的语言。
Python对象模型
第4章结尾处的The Dynamic Typing Interlude一段,应该是至今我读到的最精彩的一段。它说明了Python的动态数据类型的原理,事实上描叙了Python的对象模型。
Python使用了refenrence机制,这一点和Delphi/Java/C#如出一辙。但是,它没有区分Primitive Type和Object,而是对所有的数据都采用了refenrence,包括最简单的int。对它来说,真正做到了Everything is An Object。这样虽然会在效率上有一点损失,但是在实现上更加简洁,使用上也更加灵活。(我不知道它是否把所有的数据都放在Heap中,还是会自动区分Primitive Type并把后者放在Stack中)
Python在所有的immutable object上使用了COW(Copy-On-Write)技术,它称之为shared refenrence。书中举出的例子,和若干年前我在Marco Cantu的Mastering Delphi 4中看到的几乎一模一样。当时我就想:这是个好东西啊,为什么不用在String以外的对象上呢?现在Python替我们实现了。
到底哪些对象是immutable,哪些是mutable,似乎还没有看到。
 
精彩, 顶了 。
 
支持笔记创作
老左 可以去美河看看
那有很多python的资料
 
Learning Python: Page 111
来自:左轻侯 1701字节 2006-08-17 02:07:32 点击:2 回复:0
所属分类:技术随笔
--------------------------------------------------------------------------------

String
String是immutable的,因此,不要试图修改String。如果调用replace这样的方法,将会返回一个新的String对象。如果通过index直接对String的某个位置赋值,将会出错。
这一点和Java/C#很象:String是不能改变的,如果需要在一个大的循环中对String进行多次累加这样的计算,应该使用StringBuffer/StringBuilder这样的对象(就是常被简称为SB的那个),以避免效率上的损失。
那么在Python中呢?书中建议,先将String转换成mutable的list,然后再对这个list进行操作,最后再转换为String:
S = 'spammy'
L = list(S)
L[3] = 'x'
L[4] = 'x'
S = ''.join(L)
这种方式看上去十分古怪。可能会导致什么样的side effect,我现在还没有想到。
为什么不用直接用list来实现String?Java/C#都没有这么干。可能是因为效率上的原因?
List和Dictionary
List和Dictionary应该是Python中最主要的两种容器(Tuple的大小是固定,似乎无法列入传统意义上的容器)。这是一种适度的简化,相比Java和C++中多得令人眼花缭乱的容器来说,我认为这两种容器已经足够应付绝大多数的应用了。(也许有很多C++的老手会愤怒地指责这一观点,但肯定会有更多的新手站出来支持这一观点。)PHP中的容器只剩下array一种,虽然也能够覆盖List和Dictionary的功能,但是也未免太粗陋了,使用起来往往让人有bad smell的感觉。总而言之,我认为这是Python的又一个优雅的设计。
但是简单也有简单的问题。Dictionary是用Hash Table实现的,这一点书中已有明言。但是List是用什么实现的呢?书中说:“In fact, lists really are C arrays inside the Python interpreter.”但是,List不太可能是一个简单的array,根据它可以自动增长的性质来说,可能是一个linked list。但它又可以按index进行随机访问。
Java提供了ArrayList和LinkedList这两种不同的实现,供程序员选择,以适合不同的情况:前者适用于大量的随机访问,后者适用于大量的增加和删除操作。Python似乎没有提供这一选择。
有时间写个小程序测试一下,就可以知道它是用哪种方式实现的了。
 
谢谢捧场
不能没有你:
请问美河在什么地方?
 
感谢左大侠:)
即然Python可以被编译为Java Byte Code,而Java的字节码可以被反编译,是不是可以认
为,Python代码可以几乎无损的被转化为Java源代码呢? :-D
最近在设计跨语言的逻辑,参考了不少语言。Delphi的String是很强的,但是用类来描述
就会比较奇怪。为了迎合Java等其它的语言,可能要设计另一个String类才行... 另外,我
粗看了一下“动态语言”,觉得很多情况都是将SQL语言中的Where的功能移植到了内存数据
中,如果将这个功能移植到其它的语言(或者执行引擎)中... 嘿嘿:P
另外,现在在设计System核心类,遇到了一点问题——是不是需要认为各种具体的整数类
型就是高层integer类的子类呢?——如果是这样的化,核心类之间的继承关系也会变得比
较复杂,是否不太值得? 不知道左大侠有什么建议?:)
 
Learning Python: Page 136
来自:左轻侯 866字节 2006-08-22 22:27:02 点击:4 回复:0
所属分类:技术随笔

--------------------------------------------------------------------------------

Tuple
Tuple这种数据结构,好象在其他的语言中从来没有见过。在Java,Delphi,C++,C#中,似乎所有的container都是mutable的。Java/C#中的String是immutable的,但并不是基于某个通用的container。(这一点我不是十分确定)但是,可以想象,Tuple这种container确实用处很广泛,而且效率很早。
File
Python中处理文件的方式简洁而直观,跟Java中“圆环套圆环”的方式形成鲜明的对比。而且,file内置了cache机制。但是,我对Python为什么把file作为一种build-in类型感到奇怪。照我看来,用一个regular的class来实现file,更加优雅一些,例如Delphi中的TFileStream。Bjarne说,不应该有太多的编译器魔法……不过话又说回来,对于script language,可能不适用这个标准。
Comparison
Python中使用==来比较对象的内容,用is来比较是否为同一个对象(是否为同一个reference)。这一点比Java要好:Java用==来比较是否为同一个对象,用equals()方法来比较对象的内容,经常把人搞晕,特别是对于同时使用几种语言的程序员,更是如此。
 
to creation-zy:
>即然Python可以被编译为Java Byte Code,而Java的字节码可以被反编译,是不是可以认
>为,Python代码可以几乎无损的被转化为Java源代码呢? :-D
我理解应该是这样,但我还没有用过Jython
> 另外,现在在设计System核心类,遇到了一点问题——是不是需要认为各种具体的整数类
>型就是高层integer类的子类呢?——如果是这样的化,核心类之间的继承关系也会变得比
>较复杂,是否不太值得? 不知道左大侠有什么建议?:)
我没有做过类似框架的设计,恐怕无法给你很好的建议。在Python中,具体的整数类型就是int的子类型。Python作为script language,效率并不是最优先的考虑因素。我个人觉得,两层继承不算复杂,只要在运算中没有频繁地用到动态方法,应该也不会在效率上存在太大问题。当然你应该视具体情况而定。
 
感谢左大侠的指点 8-D
继续听课~~ ;-)

关于运算符重载,我觉得就是将二元运算幻化成了实际上的函数调用。例如:
i + n * m <==> Add(i, Mul(n, m)) <==> Integer(i).Add(Integer(n).Mul(m))
这样看来,运算符的重载实际上是可以被运用于任何支持函数或者方法的语言的。
关于Tuple,看起来有些像Delphi中的常量数组嘛。Python的集合运算能力太强了,提供
了非常方便的求取子集的方式(t[1:3]),这是时下流行的多数语言所没有的功能。
 
不错,对python也比较感兴趣,只是一直没有时间学习,先收藏贴子,有空时再来参才[:D]
 
简单的用过一下python。
发现还是不是很习惯脚本语言[:(]。
python的好还没被发掘出来就被玩腻了[:(]。
有时候和语言的熟悉程度还是挺有关系的。
 
python实在不错
使用简捷,数据结构也丰富,还支持面向对象语言
 
左轻侯,好多年都没有来过了
 
后退
顶部