`
zn108zn
  • 浏览: 14701 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

简明python教程(下)

 
阅读更多

简明python教程(下)
2010年06月11日
  6、数据结构
  数据结构基本上就是――它们是可以处理一些数据的结构。或者说,它们是用来存储一组相关数据的。
  在Python中有三种内建的数据结构――列表、元组和字典。
  (1)列表
  list是处理一组有序项目的数据结构,即你可以在一个列表中存储一个 序列 的项目。
  列表中的项目应该包括在方括号中,这样Python就知道你是在指明一个列表。一旦你创建了一个列表,你可以添加、删除或是搜索列表中的项目。由于你可以增加或删除项目,我们说列表是 可变的 数据类型,即这种类型是可以被改变的。
  可以在列表中添加 任何种类的对象 包括数甚至其他列表。
  使用列表的sort方法来对列表排序。需要理解的是,这个方法影响列表本身,而不是返回一个修改后的列表――这与字符串工作的方法不同。这就是我们所说的列表是 可变的 而字符串是 不可变的 。
  对象与类的快速入门:
  列表是使用对象和类的一个例子。当你使用变量i并给它赋值的时候,比如赋整数5,你可以认为你创建了一个类(类型)int的对象(实例)i。
  类也有方法,即仅仅为类而定义地函数。仅仅在你有一个该类的对象的时候,你才可以使用这些功能。使用点号来使用对象的方法。
  个类也有,它是仅仅为类而定义的变量。仅仅在你有一个该类的对象的时候,你才可以使用这些变量/名称。
  我们在print语句的结尾使用了一个 逗号 来消除每个print语句自动打印的换行符。
  (2)元组
  元组和列表十分类似,只不过元组和字符串一样是 不可变的 即你不能修改元组。元组通过圆括号中用逗号分割的项目定义。元组通常用在使语句或用户定义的函数能够安全地采用一组值的时候,即被使用的元组的值不会改变。
  我们可以通过一对方括号来指明某个项目的位置从而来访问元组中的项目,就像我们对列表的用法一样。这被称作 索引 运算符。
  含有0个或1个项目的元组。一个空的元组由一对空的圆括号组成,如myempty = ()。然而,含有单个元素的元组就不那么简单了。你必须在第一个(唯一一个)项目后跟一个逗号,这样Python才能区分元组和表达式中一个带圆括号的对象。即如果你想要的是一个包含项目2的元组的时候,你应该指明singleton = (2 , )。
  列表之中的列表不会失去它的身份,即列表不会像Perl中那样被打散。同样元组中的元组,或列表中的元组,或元组中的列表等等都是如此。只要是Python,它们就只是使用另一个对象存储的对象。
  元组最通常的用法是用在打印语句中。
  (3)字典
  字典类似于你通过联系人名字查找地址和联系人详细情况的地址簿,即,我们把键(名字)和值(详细情况)联系在一起。注意,键必须是唯一的,就像如果有两个人恰巧同名的话,你无法找到正确的信息。
  注意,你只能使用不可变的对象(比如字符串)来作为字典的键,但是你可以不可变或可变的对象作为字典的值。基本说来就是,你应该只使用简单的对象作为键。
  键值对在字典中以这样的方式标记:d = {key1 : value1, key2 : value2 }。注意它们的键/值对用冒号分割,而各个对用逗号分割,所有这些都包括在花括号中。
  记住字典中的键/值对是没有顺序的。如果你想要一个特定的顺序,那么你应该在使用前自己对它们排序。
  字典是dict类的实例/对象。
  (4)序列
  列表、元组和字符串都是序列,但是序列是什么,它们为什么如此特别呢?序列的两个主要特点是索引操作符和切片操作符。索引操作符让我们可以从序列中抓取一个特定项目。切片操作符让我们能够获取序列的一个切片,即一部分序列。
  索引同样可以是负数,在那样的情况下,位置是从序列尾开始计算的。
  切片操作符是序列名后跟一个方括号,方括号中有一对可选的数字,并用冒号分割。
  切片操作符中的第一个数(冒号之前)表示切片开始的位置,第二个数(冒号之后)表示切片到哪里结束。如果不指定第一个数,Python就从序列首开始。如果没有指定第二个数,则Python会停止在序列尾。注意,返回的序列从开始位置 开始 ,刚好在 结束 位置之前结束。即开始位置是包含在序列切片中的,而结束位置被排斥在切片外。
  (5)参考
  当你创建一个对象并给它赋一个变量的时候,这个变量仅仅 参考 那个对象,而不是表示这个对象本身!也就是说,变量名指向你计算机中存储那个对象的内存。这被称作名称到对象的绑定。
  列表的赋值语句创建拷贝。你得使用切片操作符来建立序列的拷贝。
  (6)更多字符串的内容
  字符串也是对象,同样具有方法。方法请help(str)
  你在程序中使用的字符串都是str类的对象。
  startwith方法是用来测试字符串是否以给定字符串开始。in操作符用来检验一个给定字符串是否为另一个字符串的一部分。
  find方法用来找出给定字符串在另一个字符串中的位置,或者返回-1以表示找不到子字符串。str类也有以一个作为分隔符的字符串join序列的项目的整洁的方法,它返回一个生成的大字符串。
  7、面向对象的编程
  类使用class关键字创建。类的域和方法被列在一个缩进块中。
  (1)self
  类的方法与普通的函数只有一个特别的区别――它们必须有一个额外的第一个参数名称,但是在调用这个方法的时候你不为这个参数赋值,Python会提供这个值。这个特别的变量指对象本身,按照惯例它的名称是self。
  假如你有一个类称为MyClass和这个类的一个实例MyObject。当你调用这个对象的方法MyObject.method(arg1, arg2)的时候,这会由Python自动转为MyClass.method(MyObject, arg1, arg2)――这就是self的原理了。
  这也意味着如果你有一个不需要参数的方法,你还是得给这个方法定义一个self参数。
  (2)类
  使用class语句后跟类名,创建了一个新的类。这后面跟着一个缩进的语句块形成类体。
  使用类名后跟一对圆括号来创建一个对象/实例。
  (3)对象的方法
  类/对象可以拥有像函数一样的方法,这些方法与函数的区别只是一个额外的self变量。
  (4)__init__方法
  __init__方法在类的一个对象被建立时,马上运行。这个方法可以用来对你的对象做一些你希望的 初始化 。
  最重要的是,我们没有专门调用__init__方法,只是在创建一个类的新实例的时候,把参数包括在圆括号内跟在类名后面,从而传递给__init__方法。这是这种方法的重要之处。
  (5)类与对象的方法
  事实上,它们只是与类和对象的名称空间 绑定 的普通变量,即这些名称只在这些类与对象的前提下有效。
  有两种类型的 域 ――类的变量和对象的变量,它们根据是类还是对象 拥有 这个变量而区分。
  类的变量 由一个类的所有对象(实例)共享使用。只有一个类变量的拷贝,所以当某个对象对类的变量做了改动的时候,这个改动会反映到所有其他的实例上。
  对象的变量 由类的每个对象/实例拥有。因此每个对象有自己对这个域的一份拷贝,即它们不是共享的,在同一个类的不同实例中,虽然对象的变量有相同的名称,但是是互不相关的。
  能使用self变量来参考同一个对象的变量和方法。这被称为 属性参考 。
  如同__init__方法一样,还有一个特殊的方法__del__,它在对象消逝的时候被调用。对象消逝即对象不再被使用,它所占用的内存将返回给系统作它用。
  (6)继承
  面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过 继承 机制。继承完全可以理解成类之间的 类型和子类型 关系。
  一个子类型在任何需要父类型的场合可以被替换成父类型,即对象可以被视作是父类的实例,这种现象被称为多态现象
  我们会发现在 重用 父类的代码的时候,我们无需在不同的类中重复它。而如果我们使用独立的类的话,我们就不得不这么做了。
  Python不会自动调用基本类的constructor,你得亲自专门调用它。
  Python总是首先查找对应类型的方法,在这个例子中就是如此。如果它不能在导出类中找到对应的方法,它才开始到基本类中逐个查找。基本类是在类定义的时候,在元组之中指明的。
  如果在继承元组中列了一个以上的类,那么它就被称作 多重继承 。
  8、输入输出
  (1)文件
  你可以通过创建一个file类的对象来打开一个文件,分别使用file类的read、readline或write方法来恰当地读写文件。对文件的读写能力依赖于你在打开文件时指定的模式。最后,当你完成对文件的操作的时候,你调用close方法来告诉Python我们完成了对文件的使用。
  (2)储存器
  Python提供一个标准的模块,称为pickle。使用它你可以在一个文件中储存任何Python对象,之后你又可以把它完整无缺地取出来。这被称为 持久地 储存对象。
  还有另一个模块称为cPickle,它的功能和pickle模块完全相同,只不过它是用C语言编写的,因此要快得多(比pickle快1000倍)。
  9、异常
  (1)try..except
  还可以让try..catch块关联上一个else从句。当没有异常发生的时候,else从句将被执行。
  (2)引发异常
  你可以使用raise语句 引发 异常。你还得指明错误/异常的名称和伴随异常 触发的 异常对象。你可以引发的错误或异常应该分别是一个Error或Exception类的直接或间接导出类
  (3)try..finally
  假如你在读一个文件的时候,希望在无论异常发生与否的情况下都关闭文件,该怎么做呢?这可以使用finally块来完成。注意,在一个try块下,你可以同时使用except从句和finally块。如果你要同时使用它们的话,需要把一个嵌入另外一个。
  10 、Python标准库
  (1)sys模块
  使用sys.exit函数退出正在运行的程序。
  sys模块中其他令人感兴趣的项目有sys.stdin、sys.stdout和sys.stderr它们分别对应你的程序的标准输入、标准输出和标准错误流。
  (2)os模块
  这个模块包含普遍的操作系统功能。如果你希望你的程序能够与平台无关的话,这个模块是尤为重要的。即它允许一个程序在编写后不需要任何改动,也不会发生任何问题,就可以在Linux和Windows下运行
  11、更多Python的内容
  (1)一些特殊的方法
  名称
  说明
  __init__(self,...)
  这个方法在新建对象恰好要被返回使用之前被调用。
  __del__(self)
  恰好在对象要被删除之前调用。
  __str__(self)
  在我们对对象使用print语句或是使用str()的时候调用。
  __lt__(self,other)
  当使用 小于 运算符(等等)都有特殊的方法。
  __getitem__(self,key)
  使用x[key]索引操作符的时候调用。
  __len__(self)
  对序列对象使用内建的len()函数的时候调用。
  (2)在函数中接收元组和列表
  当要使函数接收元组或字典形式的参数的时候,有一种特殊的方法,它分别使用*和**前缀。这种方法在函数需要获取可变数量的参数的时候特别有用。
  在args变量前有*前缀,所有多余的函数参数都会作为一个元组存储在args中。如果使用的是**前缀,多余的参数则会被认为是一个字典的键/值对。
  (3)lambda形式
  lambda语句被用来创建新的函数对象,并且在运行时返回它们。
  即便是print语句也不能用在lambda形式中,只能使用表达式。
  (4)exec和eval语句
  exec语句用来执行储存在字符串或文件中的Python语句。
  eval语句用来计算存储在字符串中的有效Python表达式。
  (5)assert语句
  assert语句用来声明某个条件是真的。当assert语句失败的时候,会引发一个AssertionError。
  (6)repr函数
  repr函数用来取得对象的规范字符串表示。反引号(也称转换符)可以完成相同的功能。注意,在大多数时候有eval(repr(object)) == object。
  基本上,repr函数和反引号用来获取对象的可打印的表示形式。你可以通过定义类的__repr__方法来控制你的对象在被repr函数调用的时候返回的内容。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics