2.1 Python常用内置对象

在Python中的一切都是对象,整数、实数、复数、字符串、列表、元组、字典、集合是对象,zip、map、enumerate、filter等函数返回的也是对象,函数和类也是对象。Python中的对象有内置对象、标准库对象和扩展库对象,其中内置对象可以直接使用,标准库对象需要导入之后才能使用,扩展库对象需要先安装相应的扩展库然后才能导入并使用。Python常用的内置对象如表2-1所示。

表2-1 Python内置对象

(续)

2.1.1 常量与变量

所谓常量,是指不能改变的字面值,例如,一个数字3.0j,一个列表[1, 2, 3],一个字符串"Hello world.",一个元组(4, 5, 6),都是常量。而变量一般是指值可以变化的量。在Python中,不仅变量的值是可以变化的,变量的类型也是随时可以发生改变的。另外,在Python中,不需要事先声明变量名及其类型,赋值语句可以直接创建任意类型的变量。例如,下面第一条语句创建了整型变量x,并赋值为5。

     > > > x = 5                 #整型变量
     > > > type(x)               #内置函数type()用来查看变量类型
    <class 'int' >
     > > > type(x) == int
    True
     > > > isinstance(x, int)   #内置函数isinstance()测试变量是否为指定类型
    True

下面的语句创建了字符串变量x,并赋值为'Hello world.',之前的整型变量x不复存在。

     > > > x = 'Hello world.'   #字符串变量

下面的语句又创建了列表对象x,并赋值为[1, 2, 3],之前的字符串变量x也就不再存在了。

     > > > x = [1, 2, 3]

赋值语句的执行过程是:首先把等号右侧表达式的值计算出来,然后在内存中寻找一个位置把值存储进去,最后创建变量并指向这个内存地址。

也就是说,Python变量并不直接存储值,而是存储了值的内存地址或者引用,这也是变量类型随时可以改变的原因。

另外需要注意的是,虽然不需要在使用之前显式地声明变量及其类型,并且变量类型随时可以发生变化。但Python是一种不折不扣的强类型编程语言,Python解释器会根据赋值运算符右侧表达式的值来自动推断变量类型。

最后,在Python中定义变量名的时候,需要遵守下面的规范。

● 变量名必须以字母或下划线开头。

● 变量名中不能有空格或标点符号。

● 不能使用关键字作变量名,如if、else、for、return这样的变量名都是非法的。

● 变量名对英文字母的大小写敏感,如student和Student是不同的变量。

● 不建议使用系统内置的模块名、类型名或函数名以及已导入的模块名及其成员名作变量名,如id、max、len、list这样的变量名都是不建议使用的。

2.1.2 数字类型

在Python中,内置的数字类型有整数、实数和复数。其中,整数类型除了常见的十进制整数,还有如下进制。

● 二进制。以0b开头,每一位只能是0或1。

● 八进制。以0o开头,每一位只能是0、1、2、3、4、5、6、7这八个数字之一。

● 十六进制。以0x开头,每一位只能是0、1、2、3、4、5、6、7、8、9、a、b、c、d、e、f之一。

在Python中,不必担心数值的大小问题,Python支持任意大的数字。另外,由于精度的问题,对于实数运算可能会有一定的误差,应尽量避免在实数之间直接进行相等性测试,而是应该以二者之差的绝对值是否足够小作为两个实数是否相等的依据,如下所示。

     > > > 99999999999 ** 9            #这里**是幂乘运算符
    99999999991000000000359999999991600000000125999999998740000000008399999999 9640000000000899999999999
     > > > 0.4 - 0.1                   #实数相减,结果稍微有点偏差
    0.30000000000000004
     > > > 0.4 - 0.1 == 0.3            #应尽量避免直接比较两个实数是否相等
    False
     > > > abs(0.4-0.1 - 0.3) < 1e-6#这里1e-6表示10的-6次方
    True

Python内置支持复数类型及其运算,形式与数学上的复数完全一致。举例如下。

     > > > x = 3 + 4j                #使用j或J表示复数虚部
     > > > y = 5 + 6j
     > > > x + y                     #支持复数之间的算术运算
    (8+10j)
     > > > x * y
    (-9+38j)
     > > > abs(x)                    #内置函数abs()可用来计算复数的模
    5.0
     > > > x.imag                    #虚部
    4.0
     > > > x.real                    #实部
    3.0
     > > > x.conjugate()             #共轭复数
    (3-4j)

为了提高可读性,Python 3.6.x以及更高版本支持在数字中间位置插入单个下划线,下划线可以出现在中间任意位置,但不能出现开头和结尾位置,也不能使用多个连续的下划线,具体用法如下所示。

     > > > 1_000_000
    1000000
     > > > 1_2_3_4
    1234
     > > > 1_2 + 3_4j
    (12+34j)
     > > > 1_2.3_45
    12.345

2.1.3 字符串

在Python中,没有字符常量和变量的概念,只有字符串类型的常量和变量,即使是单个字符也是字符串。Python使用单引号、双引号、三单引号、三双引号作为定界符来表示字符串,并且不同的定界符之间可以互相嵌套。另外,Python 3.x全面支持中文,中文和英文字母都作为一个字符对待,甚至可以使用中文作为变量名。

除了支持使用加号运算符连接字符串,使用乘号运算符对字符串进行重复,使用切片访问字符串中的一部分字符以外,很多内置函数和标准库对象也支持对字符串的操作。另外,Python字符串还提供了大量的方法支持查找、替换、排版等操作。这里先简单介绍一下字符串对象的创建、连接和重复,更多详细内容请见第7章。

     > > > x = 'Hello world.'                #使用单引号作为定界符
     > > > x = "Python is a great language." #使用双引号作为定界符
     > > > x = '''Tom said, "Let's go."'''   #不同定界符之间可以互相嵌套
     > > > print(x)
    Tom said, "Let's go."
     > > > x = 'good ' + 'morning'           #连接字符串
     > > > x
    'good morning'
     > > > x = 'good '
     > > > x = x + 'morning'
     > > > x
    'good morning'
     > > > x * 3                             #字符串重复
    'good morninggood morninggood morning'

2.1.4 列表、元组、字典、集合

列表、元组、字典和集合是Python内置的容器对象,其中可以包含多个元素。另外,range、map、zip、filter、enumerate等迭代对象是Python中比较常用的内置对象,支持某些与容器类对象类似的用法。

这里先介绍一下列表、元组、字典和集合的创建与简单使用,更详细的介绍请参考第3章。

     > > > x_list = [1, 2, 3]                #创建列表对象
     > > > x_tuple = (1, 2, 3)               #创建元组对象
     > > > x_dict = {'a':97, 'b':98, 'c':99} #创建字典对象,其中元素形式为“键:值”
     > > > x_set = {1, 2, 3}                 #创建集合对象
     > > > print(x_list[1])                  #使用下标访问指定位置的元素
    2
     > > > print(x_tuple[1])                 #元组也支持使用序号作为下标
    2
     > > > print(x_dict['a'])                #字典对象的下标是“键”
    97
     > > > x_set[1]                          #集合不支持使用下标随机访问
    Traceback (most recent call last):
      File "<pyshell#6 >", line 1, in <module >
        x_set[1]
    TypeError: 'set' object does not support indexing
     > > > 3 in x_set                        #成员测试
    True