2.1 Python变量类型

Python的标准数据类型只有5个,分别是数字、字符串、列表、元祖、字典。看起来比C语言的数据类型少了很多,但该有的功能一个不少。即使C语言的代表作链表和二叉树,Python同样能应付自如。

2.1.1 数字

Python支持以下3种不同的数值类型。

1. int类型

有符号整数,就是C语言中所指的整型,也就是数学中的整数。Python 3的int与Python 2的int略有不同。Python 2中有个sys.maxint限制了int类型的最大值,超过这个数值的将自动转换为Python 2的long类型。Python 3中没有sys.maxint,但有一个相似的sys.maxsize,这个数并没有限制Python 3中int类型数的极限。理论上来说Python 3的int类型是无限大的。查看当前系统下的sys.maxsize,使用Putty登录Linux,执行命令:

     python3
     import sys
     print(sys.maxsize)

执行结果,如图2-1所示。

图2-1 求int最大值

与C语言不同的是,Python给变量赋值时不需要预先声明变量类型。八进制数字、十六进制数字都是属于int(Long)类型的。

长整数,超过sys.maxsize的整数还是int类型。想赋值多大都行,只要内存足够大就可以。在Windows中打开cmd.exe,执行命令:

     Python
     import sys
     sys.maxsize
     type(999999999999999999999999999999)

执行结果如图2-2所示。

图2-2 Python long int

2. float类型

浮点型实数,基本和C语言的浮点型一致,也就是数学中带小数点的数,不包括无限小数,不区分精度。只要是带小数点的数都可以看作浮点型数据。

3. complex类型

复数,在C语言中是需要自定义的一个数据类型。在Python中把它单独列出来作为基本数据类型。复数包含一个有序对,表示为a + bj,其中,a是实部,b是复数的虚部。

【示例2-1】用一个简单的程序showNumType.py来显示Python的数字类型。使用Putty连接到Linux,执行命令:

     mkdir –pv code/crawler
     cd !$
     vi showNumType.py

showNumType.py代码如下:

      1 #!/usr/bin/env python3
      2 #-*- coding: utf-8 -*-
      3 __author__ = 'hstking hst_king@hotmail.com'
      4
      5 class ShowNumType(object):
      6     def __init__(self):
      7         self.showInt()
      8         self.showLong()
      9         self.showFloat()
     10         self.showComplex()
     11
     12     def showInt(self):
     13         print("##########显示整型#############")
     14         print("十进制的整型")
     15         print("%-20d,%-20d,%-20d" %(-10000,0,10000))
     16         print("二进制的整型")
     17         print("%-20s,%-20s,%-20s" %(bin(-10000),bin(0),bin(10000)))
     18         print("八进制的整型")
     19         print("%-20s,%-20s,%-20s" %(oct(-10000),oct(0),oct(10000)))
     20         print("十六进制的整型")
     21         print("%-20s,%-20s,%-20s" %(hex(-10000),hex(0),hex(10000)))
     22
     23     def showLong(self):
     24         print("##########显示长整型#############")
     25         print("十进制的整型")
     26         print("%-20Ld,%-20Ld,%-20Ld" %(-10000000000000000000,0,10000000000000000000))
     27         print("八进制的整型")
     28         print("%-20s,%-20s,%-20s" %(oct(-10000000000000000000),oct(0),
                oct(10000000000000000000)))
     29         print("十六进制的整型")
     30         print("%-20s,%-20s,%-20s" %(hex(-10000000000000000000),hex(0),
                 hex(10000000000000000000)))
     31
     32     def showFloat(self):
     33         print("##########显示浮点型#############")
     34         print("%-20.10f,%-20.10f,%-20.10f" %(-100.001,0,100.001))
     35
     36     def showComplex(self):
     37         print("##########显示复数型#############")
     38         print("变量赋值复数 var = 3 + 4j")
     39         var = 3 + 4j
     40         print("var的实部是:%d\tvar的虚部是:%d" %(var.real,var.imag))
     41
     42
     43 if __name__ == '__main__':
     44     showNum = ShowNumType()

在Putty下执行命令:

     python3 showNumType.py

得到的结果如图2-3所示。

图2-3 运行showNumType.py

showNumType.py是Linux下以C++风格编写的示范程序,展示如何标准输出各种基本数字类型。

2.1.2 字符串

在Python中,字符串是被定义为在引号(或双引号)之间的一组连续的字符。这个字符可以是键盘上的所有可见字符,也可以是不可见的“回车符”“制表符”等。

字符串的操作方法很多,这里只选出最典型的几种。

(1)字符串大小写转换

  • S.lower():字母大写转换成小写。
  • S.upper():字母小写转换成大写。
  • S.swapcase():字母大写转换或小写,小写转换成大写。
  • S.title():将首字母大写。

(2)字符串搜索、替换

  • S.find(substr, [start, [end]]):返回S中出现substr的第一个字母的标号,如果S中没有substr就返回-1,start和end的作用就相当于在S[start:end]中搜索。
  • S.count(substr, [start, [end]]):计算substr在S中出现的次数。
  • S.replace(oldstr, newstr, [count]):把S中的oldstr替换为newstr,count为替换次数。
  • S.strip([chars]):把S左右两端chars中有的字符全部去掉,一般用于去除空格。
  • S.lstrip([chars]):把S左端chars中所有的字符全部去掉。
  • S.rstrip([chars]):把S右端chars中所有的字符全部去掉。

(3)字符串分割、组合

  • S.split([sep, [maxsplit]]):以sep为分隔符,把S分成一个list。maxsplit表示分割的次数,默认的分割符为空白字符。
  • S.join(seq):把seq代表的序列—字符串序列,用S连接起来。

(4)字符串编码、解码

  • S.decode([encoding]):将以encoding编码的S解码成unicode编码。
  • S.encode([encoding]):将以unicode编码的S编码成encoding,encoding可以是gb2312、gbk、big5……

(5)字符串测试

  • S.isalpha():S是否全是字母,至少有一个字符。
  • S.isdigit():S是否全是数字,至少有一个字符。
  • S.isspace():S是否全是空白字符,至少有一个字符。
  • S.islower():S中的字母是否全是小写。
  • S.isupper():S中的字母是否全是大写。
  • S.istitle():S是否是首字母大写的。

【示例2-2】编写一个showStrOperation.py来实验一下。这次在Windows下以IDLE为IDE来编写程序。showStrOperation.py代码如下:

打开Windows的命令行工具(cmd.exe),执行命令:

     python showStrOperation.py

得到的结果如图2-4所示。

图2-4 运行showStrOperation.py

与showNumType.py不同,showStrOperation.py是在Windows下以C语言的风格编写的。实际上这两个程序并没有什么区别,使用哪种风格视个人习惯而定。

提示

字符串也可以看成一个不可修改的字符列表,所以大部分用来操作列表的方法(不涉及修改列表元素的)同样可以用来操作字符串。

2.1.3 列表

列表是Python最常用的变量类型。列表是一个可变序列,序列中的每个元素都分配一个数字,即它的位置,或者叫索引。第一个索引是0,第二个索引是1,以此类推。列表中的元素可以是数字、字符串、列表、元组、字典……Python使用中括号[ ]来解析列表,将一个变量赋值为空列表,很简单,执行命令var = []就可以了。

列表的基本操作很简单,一般是创建列表、插入数据、追加数据、访问数据、删除数据。下面实验一下。

创建列表,直接赋值即可。访问列表,只需要列表名和列表中元素的下标即可。创建一个字符的列表,执行命令:

     L1 = ['a','b','c','d','e']
     L1[0]
     L1[1]
     L1[2]
     L1[4]
     L1[5]

执行的结果如图2-5所示。

图2-5 创建列表

如图2-5所示,如果访问超出范围,Python 3则会抛出一个异常IndexError。如果只是创建一个纯字符的列表,无须逐个输入字符,执行命令L1 = list('abcde')即可。

插入、追加、删除列表数据也很简单,执行命令:

     L1.insert(0,0)
     L1.insert(-1,100)
     L1.append('python')
     L1.pop(3)
     L1.pop()

执行结果如图2-6所示。

图2-6 插入、追加、删除数据

对列表最常用的操作是列表分片。分片可以简单地理解为将一个列表分成几块。它的操作方法是list[index1:index2[:step]]。先创建一个较长的数字列表做这个分片示例,执行命令:

     L2 = []
     for i in xrange(0,101):
     L2.append(i)
     L2

这样就创建了一个包含0~100共101个数字的列表,如图2-7所示。

图2-7 创建数字列表

列表切片其实和访问列表元素很相似。例如,要访问列表L2的第10个元素,直接用L2[10]就可以了。如果要访问列表L2的第10到20个元素呢?很简单,L2[10:21]就可以了。至于list[index1:index2[:step]]中的step是步长。实验一下就清楚了,执行命令:

     L2[0:21]
     L2[21:41]
     L2[81:101]
     L2[0:21:1]
     L2[0:21:2]
     L2[0:21:3]
     L2[0:21:4]
     L2[0:21:5]

执行结果如图2-8所示。

图2-8 列表分片

【示例2-3】写个简单的程序showList.py验证一下。打开Putty连接到Linux,执行命令:

     cd code/crawler
     vi showList.py

showList.py的代码如下:

      1 #!/usr/bin/env python3
      2 #-*- coding: utf-8 -*-
      3 __author__ = 'hstking hst_king@hotmail.com'
      4
      5 class ShowList(object):
      6     def __init__(self):
      7         self.L1 = []
      8         self.L2 = []
      9
     10         self.createList()  #创建列表
     11         self.insertData()  #插入数据
     12         self.appendData()  #追加数据
     13         self.deleteData()  #删除数据
     14         self.subList()  #列表分片
     15
     16  def createList(self):
     17      print("创建列表:")
     18      print("L1 = list('abcdefg')")
     19      self.L1 = list('abcdefg')
     20      print("L2 = []")
     21      print("for i in xrange(0,10):")
     22      print("\tL2.append(i)")
     23      for i in range(0,10):
     24          self.L2.append(i)
     25      print("L1 = "),
     26      print(self.L1)
     27      print("L2 = "),
     28      print(self.L2)
     29      print('\n')
     30
     31  def insertData(self):
     32      print("插入数据")
     33      print("L1列表中第3个位置插入数字100,执行命令:L1.insert(3,100)")
     34      self.L1.insert(3,100)
     35      print("L1 = "),
     36      print(self.L1)
     37      print("L2列表中第10个位置插入字符串'python',执行命令:L2.insert(10,'python')")
     38      self.L2.insert(10,'python')
     39      print("L2 = "),
     40      print(self.L2)
     41      print('\n')
     42
     43  def appendData(self):
     44      print("追加数据")
     45      print("L1列表尾追加一个列表[1,2,3],执行命令L1.append([1,2,3]")
     46      self.L1.append([1,2,3])
     47      print("L1 = "),
     48      print(self.L1)
     49      print("L2列表尾追加一个元组('a','b','c'),执行命令L2.append(('a','b','c')")
     50      self.L2.append(('a','b','c'))
     51      print("L2 = "),
     52      print(self.L2)
     53      print('\n')
     54
     55  def deleteData(self):
     56      print("删除数据")
     57      print("删除L1的最后一个元素,执行命令L1.pop()")
     58      self.L1.pop()
     59         print("L1 = "),
     60         print(self.L1)
     61         print("删除L1的第1个元素,执行命令L1.pop(0)")
     62         self.L1.pop(0)
     63         print("L1 = "),
     64         print(self.L1)
     65         print("删除L2的第4个元素,执行命令L2.pop(3)")
     66         self.L2.pop(3)
     67         print("L2 = "),
     68         print(self.L2)
     69         print('\n')
     70
     71     def subList(self):
     72         print("列表分片")
     73         print("取列表L1的第3到最后一个元素组成的新列表,执行命令L1[2:]")
     74         print(self.L1[2:])
     75         print("取列表L2的第2个到倒数第2个元素组成的新列表,步长为2,执行命令
L2[1:-1:2]")
     76         print(self.L2[1:-1:2])
     77         print('\n')
     78
     79
     80 if __name__ == '__main__':
     81     print("演示列表操作:\n")
     82     sl = ShowList()

按Esc键,进入命令模式后输入:wq保存showList.py。showList.py显示了Python列表的基本功能——列表的创建、插入、追加、分片等。执行命令:

     python3 showList.py

得到的结果如图2-9所示。

图2-9 运行showList.py

列表还有很多其他的函数和操作方法,如有兴趣可以参考官方文档和Google。列表和元组非常相似,掌握了列表,就基本掌握了元组。列表是Python编程中必不可少的一种数据类型。

2.1.4 元组

Python的元组与列表非常相似,不同之处在于元组的元素是不可修改的,是一个不可变序列(意思是赋值后就无法再修改了。同列表一样,可以用序列号来访问,有点类似C语言中的常量)。列表使用[]声明,元组使用()声明。

元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可。创建一个空元组,执行命令var = ()。因为元组中元素是不可修改的,所以列表中的操作方法insert、append、pop等操作对于元组都没有。又因为元组与列表的高度相似性,列表的切片对元组是完全适用的(切片并不改变原始数据),所以只需要记住一个原则,列表中修改元素值的操作元组都不可用,列表中不修改元素值的操作元组基本上都可以用。

元组和列表是可以互相转换的。使用tuple(list)可以将一个列表转换成元组,反过来使用list(tuple)也可以将一个元组转换成列表。

【示例2-4】编写一个showTuple来实验一下。打开Putty连接到Linux,执行命令:

     cd code/crawler
     vi showTuple.py

showTuple.py的代码如下:

      1 #!/usr/bin/env python3
      2 #-*- coding: utf-8 -*-
      3 __author__ = 'hstking hst_king@hotmail.com'
      4
      5 class ShowTuple(object):
      6     def __init__(self):
      7         self.T1 = ()
      8         self.createTuple()  #创建元组
      9         self.subTuple(self.T1)  #元组分片
     10         self.tuple2List(self.T1)  #元组、列表转换
     11
     12     def createTuple(self):
     13         print("创建元组:")
     14         print("T1 = (1,2,3,4,5,6,7,8,9,10)")
     15         self.T1 = (1,2,3,4,5,6,7,8,9,10)
     16         print("T1 = "),
     17         print(self.T1)
     18         print('\n')
     19
     20     def subTuple(self,Tuple):
     21         print("元组分片:")
     22         print("取元组T1的第4个到最后一个元组组成的新元组,执行命令T1[3:]")
     23         print(self.T1[3:])
     24         print("取元组T1的第2个到倒数第2个元素组成的新元组,步长为2,执行命令
T1[1:-1:2]")
     25         print(self.T1[1:-1:2])
     26         print('\n')
     27
     28     def tuple2List(self,Tuple):
     29         print("元组转换成列表:")
     30         print("显示元组")
     31         print("T1 = "),
     32         print(self.T1)
     33         print("执行命令 L2 = list(T1)")
     34         L2 = list(self.T1)
     35         print("显示列表")
     36         print("L2 = "),
     37         print(L2)
     38         print("列表追加一个元素100后,转换成元组。执行命令L2.append(100)
tuple(L2)")
     39         L2.append(100)
     40         print("显示新元组")
     41         print(tuple(L2))
     42
     43
     44 if __name__ == '__main__':
     45     st = ShowTuple()

按Esc键,进入命令模式后输入:wq,保存showTuple.py。showTuple.py显示了Python元组的创建、分片和转换。执行命令:

     python3 showTuple.py

得到的结果如图2-10所示。

图2-10 运行showTuple.py

因为元组和列表高度相似,绝大部分场合都可以用列表来替代元组。

提示

元组和列表的不同仅在于一个可修改,一个不可修改。其他方面几乎没有什么区别。由于元组不可修改的特性,一般在函数中需要返回多个返回值时,可以将这些返回值放入一个元组中返回。

2.1.5 字典

从某种意义上来说,字典和列表也很相似。字典使用的是{},列表使用的是[],元素分隔符都是逗号。所不同的是列表的索引只是从0开始的有序整数,不可重复;而字典的索引实际上在字典里应该叫键。虽然字典中的键和列表中的索引一样是不可重复的,但键是无序的,也就是说字典中的元素是没有顺序而言的。字典中的元素任意排列都不影响字典的使用,所以也就无法用字典名+索引号的方式来访问字典元素。

字典的键可以是数字、字符串、列表、元组……几乎什么都可以,一般用字符串来做键,键与键值用冒号分割。在列表中通过索引来访问元素,而在字典中是通过键来访问键值的。因为字典按“键”寻值而不同于列表的按“索引”寻值,所以字典的操作方法与列表稍有区别。

首先创建一个字典试验一下,执行命令:

     ironMan = {'name':'tony stark','age':47,'sex':'male'}

这样就建立了一个简单的IronMan字典。因为字典的键值是无序的,所以插入一个数据无须insert之类的方法。直接定义即可,执行命令:

     ironMan['college'] = 'NYU'
     ironMan['Nation'] = 'America'

如需添加资料,继续添加即可。如果发现资料有误,修改字典,同样也是直接定义,执行命令:

     ironMan['college'] = 'MIT'

如果要删除某个元素,可以使用del命令。del命令可以理解为取消分配给变量的内存空间。执行命令:

     del ironman['Nation']

del命令不只是可以删除字典的元素,类似字典元素、用户定义的变量都可以用del来删除。它可以删除数字变量、字符串变量、列表、元组、字典等。

字典还有一些独特的操作。以下是字典中最常用的操作:

  • dict.keys():返回一个包含字典所有key的列表。
  • dict.values():返回一个包含字典所有value的列表。
  • dict.items():返回一个包含所有(键,值)元组的列表。
  • dict.clear():删除字典中所有的元素。
  • dict.get(key):返回字典中key所对应的值。

【示例2-5】编写一个showDict来实验一下。打开Putty连接到Linux,执行命令:

     cd code/crawler
     vi showDict.py

showDict.py的代码如下:

得到的结果如图2-11所示。

图2-11 运行showDict.py

Python 3的基本变量类型就是这些。其他的类型几乎都是由这些基本类型组合而来(Python还有特殊的数据类型None和boolean)。

提示

字典的键和键值可以是任何类型。在没有什么特殊要求的情况下,尽可能地使用字符串作为键。如果把键设置得太复杂了,就失去字典的意义了。