左
左轻侯
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,似乎还没有看到。
目前还只写了三篇,以后的我会陆续贴出
原文在我的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,似乎还没有看到。