* Tuple 比 list 操作速度快。如果您定义了一个值的常量集, 并且唯一要用
它做的是不断地遍历它, 请使用 tuple 代替 list。
* 如果对不需要修改的数据进行 "写保护", 可以使代码更安全。使用 tuple
而不是 list 如同拥有一个隐含的 assert 语句, 说明这一数据是常量。如
果必须要改变这些值, 则需要执行 tuple 到 list 的转换 (需要使用一个
特殊的函数)。
* 还记得我说过 dictionary keys
<index.html#odbchelper.dictionarytypes> 可以是字符串, 整数和 "其它
几种类型"吗? Tuples 就是这些类型之一。 Tuples 可以在 dictionary 中
被用做 key, 但是 list 不行。实际上, 事情要比这更复杂。Dictionary
key 必须是不可变的。Tuple 本身是不可改变的, 但是如果您有一个 list
的 tuple, 那就认为是可变的了, 用做 dictionary key 就是不安全的。只
有字符串, 整数或其它对 dictionary 安全的 tuple 才可以用作
dictionary key。
* Tuples 可以用在字符串格式化中, 我们会很快看到。
2006年12月8日星期五
Python 内置数据类型Tuple
2006年12月7日星期四
DiveIntoPython 第一个程序和内置数据类型之Dcit/List
模块的行为如同一般的模块, 但是它们的 Python 源代码是不可用的, 因为它们不
是用 Python 写的! ( sys 模块是用 C 写的。)
在 Python 中,定义是松散的;某些对象既没有属性也没有方法(ch3
<../native_data_types/index.html>),而且不是所有的对象都可以子类化(ch5
<../object_oriented_framework/index.html>)。但是万物皆对象从感性上可以解
释为:一切都可以赋值给变量或作为参数传递给函数(ch4
<../power_of_introspection/index.html>)。
与 C 不一样, Python 不支持行内赋值, 所以不会出现想要进行比较却意外地出现
赋值的情况。
Dictionary 没有元素顺序的概念。
第一个 slice 索引指定了您想要的第一个元素, 第二个 slice 索引指定了第一个
您不想要的元素。
list中extend:参数总是复合量listA,其中的标量元素分别作为原list的元素;
list中append:参数是标量和复合量,其整个儿作为list的*1*个新元素
list中搜索(index)和删除(remove)都会在list中没有找到值时引发一个异常。
/list/ = /list/ + /otherlist/ 相当于 /list/.extend(/otherlist/)。 但 +
运算符把一个新 (连接后) 的 list 作为值返回, 而 extend 只修改存在的
list。 也就是说, 对于大型 list 来说, extend 的执行速度要快一些。
* 运算符可以作为一个重复器作用于 list。
li = [1, 2] * 3 等同于 li = [1, 2] + [1, 2] + [1, 2], 即将三个 list 连接
成一个。
2006年12月6日星期三
Python类和对象
*域*。对象也可以使用 属于 类的函数来具有功能。这样的函数被称为类的*方法
*。这些术语帮助我们把它们与孤立的函数和变量区分开来。域和方法可以合称为
类的*属性*。
域有两种类型――属于每个实例/类的对象或属于类本身。它们分别被称为*实例变量
*和*类变量*。
类使用|class|关键字创建。类的域和方法被列在一个缩进块中。
类的方法与普通的函数只有一个特别的区别――它们必须有一个额外的第一个参数名
称,但是在调用这个方法的时候你*不*为这个参数赋值,Python会提供这个值。这
个特别的变量指对象本身,按照惯例它的名称是|self|。
虽然你可以给这个参数任何名称,但是 强烈建议 你使用|self|这个名称――其他名
称都是不赞成你使用的。使用一个标准的名称有很多优点――你的程序读者可以迅速
识别它,如果使用|self|的话,还有些IDE(集成开发环境)也可以帮助你。
给C++/Java/C#程序员的注释
Python中的|self|等价于C++中的|self|指针和Java、C#中的|this|参考。
|__init__|方法在类的一个对象被建立时,马上运行。这个方法可以用来对你的对
象做一些你希望的 初始化 。
给C++/Java/C#程序员的注释
|__init__|方法类似于C++、C#和Java中的 constructor 。
记住,你*只*能使用|self|变量来参考同一个对象的变量和方法。这被称为 属性
参考 。
当对象不再被使用时,|__del__|方法运行,但是很难保证这个方法究竟在 什么时
候 运行。如果你想要指明它的运行,你就得使用|del|语句,就如同我们在以前的
例子中使用的那样。
给C++/Java/C#程序员的注释
Python中所有的类成员(包括数据成员)都是 公共的 ,所有的方法都是 有效的 。
只有一个例外:如果你使用的数据成员名称以 双下划线前缀 比如
|__privatevar|,Python 的名称管理体系会有效地把它作为私有变量。
这样就有一个惯例,如果某个变量只想在类或对象中使用,就应该以单下划线前
缀。而其他的名称都将作为公共的,可以被其他类/对象使用。记住这只是一个惯
例,并不是Python所要求的(与双下划线前缀不同)。
同样,注意|__del__|方法与 destructor 的概念类似。
一个子类型在任何需要父类型的场合可以被替换成父类型,即对象可以被视作是父
类的实例,这种现象被称为*多态现象*。
另外,我们会发现在 重用 父类的代码的时候,我们无需在不同的类中重复它。而
如果我们使用独立的类的话,我们就不得不这么做了。
|SchoolMember|类被称为 基本类 或 超类 。而|Teacher|和|Student|类被称为
导出类 或 子类 。
为了使用继承,我们把基本类的名称作为一个元组跟在定义类时的类名称之后。然
后,我们注意到基本类的|__init__|方法专门使用|self|变量调用,这样我们就可
以初始化对象的基本类部分。这一点十分重要――Python不会自动调用基本类的
constructor,你得亲自专门调用它。
一个术语的注释――如果在继承元组中列了一个以上的类,那么它就被称作 多重继承 。
2006年12月5日星期二
Python数据结构
运行主块,我们该怎么做呢?这可以通过模块的__name__属性完成。
如果需要引入,文件名不能包含-,因为import命令会报错
for in中的变量不能局部
由于你可以增加或删除项目,我们说列表是 可变的 数据类型,即这种类型是可以
被改变的。
我们使用列表的|sort|方法来对列表排序。需要理解的是,这个方法影响列表本
身,而不是返回一个修改后的列表――这与字符串工作的方法不同。这就是我们所说
的列表是 可变的 而字符串是 不可变的 。
元组和列表十分类似,只不过元组和字符串一样是 不可变的 即你不能修改元组。
给Perl程序员的注释
列表之中的列表不会失去它的身份,即列表不会像Perl中那样被打散。同样元组中
的元组,或列表中的元组,或元组中的列表等等都是如此。只要是 Python,它们
就只是使用另一个对象存储的对象。
我们可以使用|in|操作符来检验一个键/值对是否存在,或者使用|dict|类的
|has_key|方法。
列表、元组和字符串都是序列。序列的两个主要特点是*索引*操作符和*切片*操作
符。序列的神奇之处在于你可以用相同的方法访问元组、列表和字符串。
给Perl程序员的注释
记住列表的赋值语句*不*创建拷贝。你得使用切片操作符来建立序列的拷贝。
我们使用加法操作符来 级连 字符串,即把两个字符串连接在一起返回一个新的字
符串。