现在的位置: 首页 > 综合 > 正文

通过对比学Python(2)

2013年10月19日 ⁄ 综合 ⁄ 共 1964字 ⁄ 字号 评论关闭

集合对象

任何一门语言的集合对象都是重中之重,一般包括固定数组,可变数组,字典(hashtable),还有其他一些特殊集合,.net里System.Collection以System.Collection.Specialize下的类,Java中Java.util.Collections包中的类就是与此相关.另外,这两种环境中的数组都为固定长度数组,但是也同时提供可变长度的列表类ArrayList(两种环境都叫这个名字).

而php中,数组和字典混合了起来,也就是说,即可以通过顺序方式访问,也可以为数组的每个元素设置一个key

那么python里面的集合类是怎么使用又具有什么特点呢?

Lists(列表类):

这个类可以类比为.Net和java中的ArrayList,是一个可变长度,没有类型约束的数组;

  • 创建列表对象

myTags=['a','aa','b','A','啊'],这个语句创建了一个列表对象,并赋予了初始值,注意这里初始值用中括弧[]括起来,后面还有其他的集合类型,他们的符号稍微不同,千万小心

  • 添加删除修改元素

下面的语句往刚刚初始化的数组中添加一个整数类型的对象

myTags.append(0),这个语句吧0这个整数加入到列表中去

与之对应的删除一个元素的方法为Remove,比如下面语句把内容为b的元素删除

myTags.remove('b'),注意如果list中有两个内容为b的元素,remove方法会删除序号小的那个,而如果列表中么有内容为"b"的元素,那么会报错

myTags[0]="abc",把这个列表的第一项修改为"abc",注意这里数组还是从0开始,而不像VB和Fortran(没听说过?有代沟...)是从1开始的.

  • 打印列表内容

打印这个列表的方法非常简单

print myTags

输出结果为:
['a', 'aa', 'b', 'A', u'/u554a',0]

不用进行任何循环,呵呵,方便吧,更强大的功能还在后面

  • 对列表进行排序

我们还可以为对list对象进行排序,

myTag.sort()

上面的语句执行结果是

>>> print myTags
[0, 'A', 'a', 'aa', 'b', u'/u554a']

可以看出排序是按照ascii码表的对应顺序来的,中文被转化为unicode表示显示并排在最后,.net和java里都有这个功能,实现各有不同,参看下面的翻转列表

  • 反转列表
    通过myTags.reverse()这个方法,我们就可以把列表翻转,再次打印,输出结果为

[u'/u554a', '{', 'b', 'aa', 'a', '//', 'A', 0]

这个方法.net的ArrayList也有提供,而java中用通过Collection类的reverse静态方法操作一个集合对象来实现如ArrayList list=new ArrayList(),Collection.reverse(list),这个类同时也提供了排序,获得最大/小值,拷贝,循环等等方法,但是这个实用的类却常常被忽略,呜呼哀哉!

  • 其他方法

     

    list类还有学多方法,包括用count属性查看列表长度,pop弹出指定位置的数据,我们就不一一讲解了,有兴趣的可以通过dir命令查看List对象具有的方法

Tuple(不变列表)

这个类的名称对.Net和Java的程序员很不直观,没有对应的名词,但是他的概念其实很简单,即一旦创建就不能改变,虽然Tuple没有公开的方法来增加元素,但是通过一些内置方法,我们仍然可以做到这点

  • 创建Tuple
    myTuple=('Field','Method','Class') 是不是很类似于.net中数组的声明和初始化string[] myTags ={ ".Net", "DataBase", "Python" };
    注意这里用原括弧(),而不是中括弧,也不是.net中申明数组的大括弧{}
  • Tuple在输出语句中的用法
    print '%s is %d years old' % (name, age),这个语句把姓名和年龄按照顺序填到字符串的置顶位置,然后输出,用过c语言的人对%s,%d肯定不陌生,一个置顶内容为字符串,一个指定内容为数字.后面那个%d也可以写成s%,实际上所有的情况你都可以写成%s,让python自己来搞定转换工作,但是写出正确的类型可以杜绝下面的情况,比如你的程序有错误,不小心往年龄里添了个字符串,这是运行到这里代码就报错了.
    .net里面实现这个功能类似的语法是这样来做Console.WriteLine("'{0} is {1} years old",name,age),可以看到.net要灵活一些,后面的name和age不一定要按照顺序给出,比如Console.WriteLine("'{1} is {0} years old",age,name)和上面的语句有同样的效果

 

 

抱歉!评论已关闭.