首页 > Python笔记 阅读数:24

Python基本数据类型(string、bool、number)

程序,本质上就是针对数据的一种处理流程。正是因为有了各种数据类型,程序才可以“有的放矢”地进行各种不同数据操作而不至于乱套。

下面我们重新回到关于 Python 基本数据类型的讨论上来。如前所述,在 Python 中,变量并不需要事先声明,但在使用前必须赋值。其实,在赋值过程中,该变量的类型及可被允许的操作才会确定下来。

在广义上,数据类型可分为标准数据类型和自定义数据类型。所谓自定义数据类型,就是面向对象编程中提到的概念——类(class)。而标准数据类型就是 Python 提供的 7 种内部数据类型,它们分别是 Number(数值型)、Boolean(布尔类型)、String(字符串型)、List(列表)、Tuple(元组)、Dictionary(字典)及 Set(集合)。本节教程先对其中的前 3 种基本数据类型进行介绍。

数值型(Number)

常用的数值型包括 int(整型)、float(浮点型)、complex(复数类型)等。对于数值型的赋值和计算都很直观,就像在大多数编程语言中一样,大部分的变量只能有一个值,当某个变量被赋予一个新值时,旧值就会被覆写掉,代码如下所示:
In [1]: x = 1        #变量 x 被赋值为 1
In [2]: x = 5        #变量 x 被重新赋值为 5
In [3]: print(x)     #输出 x 的值,可发现“新人迎来旧人弃”

我们可以用 Python 内置的 type( ) 函数查询对象的数据类型。Python 是一门纯粹的面向对象的程序设计语言,对于不同的对象类型有不同的操作。有时候,我们需要借助 type( ) 函数为我们“验明正身”,代码如下所示:
In [4]: type(x)    #x为前面定义的整数 5
Out[4]: int
In [5]: y = 1.0    #定义一个浮点数
In [6]: type(y)
Out[6]: float 

需要特别说明的是,在 Python 中,使用变量前并不需要显式声明其数据类型。诸如上述代码中的变量 x 和 y,它们都是在被赋值时根据等号=右边变量的数据类型,才“因地制宜”地变成了相应的数据类型。相比于 C、C++、Java 等强数据类型编程语言,这一点是显著不同的。

在 Python 中,我们可以给多个变量集体赋相同的值,代码如下所示。
In [7]: a = b = c = 100
In [8]: print(a, b, c)
100 100 100
上述赋值方式并没有特殊之处,很多编程语言都可以做到。

但不同于 C、C++ 和 Java 等编程语言的是,在 Python 中,允许在同一行给多个变量分别赋不同的值,代码如下所示:
In [9] : a, b, c = 10, 4.7, 3 + 10j   #给 a、b、c 三个变量赋不同的值
In [10]: print(a, b, c)
10 4.7 (3+10j)

下面我们对上述代码做简单解读。

1) 在 Python 中,我们可以同时为多个变量赋值,如 a, b = 1, 2。其实它相当于 a = 1,b = 2。对于上面 In [9] 处输入的代码,其赋值示意图如图 1 所示。

Python的多变量赋值
图 1:Python 的多变量赋值

同样,我们也可以用 type( ) 函数分别验证上述三个变量的“身份”,代码如下。
In [11]: print(type(a),type(b),type(c))
<class 'int'> <class 'float'> <class 'complex'>

2) 在 Python 中,一切皆对象。比如前面代码中提到的 a, b, c = 10, 4.7, 3+10j,实际上,等号左右两侧的都是一个对象——元组,每个元组内包含三个元素。当两个元组相互赋值时,实际上就是“丁对丁,卯对卯”,对应位置的元素相互赋值。关于元组的概念,后续会详细讨论。

3) 对于复数的表示,虚数部分的表示格式是“数值 j”,而不是数学中常用的“数值 i”。

4) 上面提及的 a、b 和 c 都是变量的标识。对于变量名称,Python 是有讲究的,即标识符只能是字母、数字、下画线(_),但变量名不能以数字开头,并且中间不能包含空格。而且,Python 中的标识符是区分大小写的,如 name 和 Name 是不同的变量。

下面我们再来简单演示一下基于数值型的运算,具体如下。
In [12]: 5 + 5       #加法
Out[12]: 10  
In [13]: 3.5 - 11    #减法
Out[13]: -7.5  
In [14]: 3 * 10      #乘法
Out[14]: 30  
In [15]: 2/4         #除法,得到一个浮点数
Out[15]: 0.5  
In [16]: 2 // 4      #注意:双斜杠除法,得到一个整数,功能类似于 C语言
Out[16]: 0
In [17]: 15 % 4      #取余
Out[17]: 3
In [18]: 2 ** 4      #乘方,相当于 2 的 4 次方,2^4
Out[18]: 16

数值型的运算比较简单直观,但需要读者注意的有两点:数值的除法/总是返回一个浮点数(如 2/4=0.5),要获取整数需使用双斜线操作符//,如 2//4=0;在多种数据类型混合计算时,Python 会把整数转换成浮点数,即进行类型转换时趋向于精确化。

布尔类型(Boolean)

Python 中的布尔类型常量有两个,True 和 False(注意首字母要大写),分别对应整型数字 1 和 0。所以在严格意义上来讲,布尔类型属于前面讲到的数值型,可视为整型(int)的子类。例如,语句 True + 2 的计算结果为 3。

Python 语言支持逻辑运算符,表 1 以 a 为 100、b 为 200 说明了 Python 中逻辑运算符的使用方法。

表1:Python中的逻辑运算符
运算符 逻辑表达式 描述 实例
and
x and y
布尔“与”:如果 x 为 False,则 x and y 返回 False,否则返回 y 的计算值 (a and b)返回 200
or x or y 布尔“或”:如果 x 非 0,则返回 x 的值,否则返回 y 的计算值 (a or b)返回 100
not not x 布尔“非”:如果 x 为 True,则返回 False;如果 x 为 False,则返回 True not(a and b)返回 False

需要特别注意的是,在 Python 中,任何非 0 和非 null 的情况都可视为 True(有点类似于 C 或 C++ 中的“非零即为真”),0 或者 null 为 False。

字符串型(String)

字符串(string,作为类别名称时用 str 表示)是由一系列字符组成的,它对文本数据的处理非常重要。在形式上,将一系列的字符用单引号' '或双引号" "包裹起来即可得到字符串,同时可用反斜杠\表示特殊的转义字符。

例如,"123" 和 'abc' 都是字符串。尽管 "123" 看起来像一个整数,但一旦被一对单引号或双引号包裹起来,那它就是一个由三个不同字符构成的字符串对象。

下面简单演示字符串的应用。
In [1]: str1 ='鸿雁来\t玄鸟归\t群鸟养羞'   #使用 Tab 键的转义字符“\t”
In [2]: print(str1,type (strl)))
鸿雁来 玄鸟归 群鸟养羞<class 'str' >

我们可以使用加号运算符+将不同的字符串连接在一起,甚至还可以用“*n”操作表示前面的字符串被重复了 n 次,示例如下。
In [3]: print ('stl'+'ing','my'*3)   # 字符串'stl' 与 'ing'连接,字符串'my',重复 3 次
string mymymy

我们可以通过内置函数 len( ) 求得字符串的长度,示例如下。
In [4]: s ='hello, world!'
In [5]: len(s)    #使用内置函数 len(),求得字符串的长度
Out[5]: 13

需要注意的是,len( ) 函数求得的字符串长度包括任意字符。例如在上述字符串对象 s 中,world 前面是有一个空格的,该字符在屏幕上是不可见的,但它也是客观存在的。因此,len( ) 在进行字符计数时也会将其考虑在内。

我们可以通过方括号[ ]内的索引(从 0 开始)来访问字符串内的某个字符,示例如下。
In [6]: s[0]    #访问索引值为 0 的字符
Out[6]:'h'
In [7]: s[-1]
Out[7]: '!'     #访问倒数第一个(索引值为-1 )字符

此外,由于字符串对象是不可变的(immutable),所以一旦某个字符串被赋值,该字符串就被视为一个常量。例如,如果我们尝试把索引值为 0 的字符 'h' 修改为大写字符 'H',以下这种尝试将不会被 Python 解释器允许。
In [8]: s[0] = 'H'

执行上述代码会返回错误信息“TypeError: 'str' object does not support item assignment”(str 对象是不支持赋值的)。这个提示信息告诉我们,str 对象是不支持变量值更新的,即保持常量属性。

在 Python 中,字符串作为一种重要的数据类型,提供了很多好用的方法(method),我们可以通过 dir 命令来查看这些方法。
In [9]: dir(str)   #查看字符串对象有哪些可用的方法
Out[9]: 
[……               #省略大部分显示
'capitalize', 'count ', ' format', 'isalnum', 'isalpha', 'isascli', 'isdecimal', 'isdigit', 'isidentifier', 'islower ', 'isnumeric', 'isprintable', ' join', 'just', 'lower', 'lstrip', 'maketrans', 'split', 'title', 'upper']

由于可用的方法太多,所以在上述输出结果中,我们省略了大部分不常用的方法。当然,这里所言的“不常用”,也是因人而异的。幸运的是,Python 内置函数的命名方式很好,对于大部分函数,即使我们没有用过,也能见名知意(了解其功能)。假设我们对某个方法的使用的确不熟悉,该怎么办呢?除了查询相关的手册,我们还可以用 help 命令来寻求在线支持。

比如说,我们想知道 split( ) 方法该如何用,可以如下操作。
In [10]: help(str.split)
Help on method_descriptor:
split(self, /, sep=None, maxsplit=-1)
    Return a list of the words in the string, using sep as the delimiter string.
sep
    The delimiter according which to split the string.
    None(the default value) means split according to any whitespace,
    and discard empty strings from the result.
maxsplit
    Maximum number of splits to do.-1(the default value) means no limit.

通常,help 提供的信息是够用的。上述信息告诉我们,split( ) 方法的功能是,通过指定分隔符(sep)对字符串进行分片(默认的分隔符可以是任意空白字符,包括空格、换行、制表符等)。参数 maxsplit 表示最大分割次数,默认为 -1, 即分隔所有满足要求的字符串,一般采用默认值即可。

split( ) 方法返回的是分割后的各个子字符串列表。下面我们举例说明它的用法。
In [11]: str_1 = "I love you Beijing" #定义一个字符串
In [12]: str_1.split (" ")  #用空格将 str_1 分开
Out[12]: [‘I' , ' love ' , 'you' , 'Beijing'] 

我们再解释一个常用的字符串处理方法 title( ),它的功能是“标题化”字符串,也就是说,让所有单词的首字母都为大写形式,其余字母均为小写形式。
In [13]: str_2 = "hello world hello python"
In [14]: str_2.title()
Out[14]: 'Hello World Hello Python'

下面我们简单介绍一下比较常用的 format( ) 方法。该方法通过字符串中的花括号{ }和冒号:这两个符号,尝试代替早期类 C语言风格的格式化输出界定符号%。format( ) 方法可接受不限个数的参数,且其显示位置也可以不同于出现的顺序。

该方法内部的参数就是我们要格式化输出的变量。如果不指定位置,则默认按照顺序依次往{}中“填空”,即 format( ) 中的第 0 个参数,就填在第 0 个{ }之内,format( ) 中第 1 个参数,就填在第 1 个{ }之内,以此类推。
In [15]: "{} {}". format ("Hellon", "Python") # 不指定参数索引,变量依次填空
Out[15]: 'Hello Python'

此外,我们还可使用花括号和数字 n 搭配的方式(即 {n} )在花括号中插入 format( ) 方法中第 n 个参数( n 从 0 计数)。这时,n 出现的顺序可“不按常规出牌”,代码如下所示。
In [16]: "{1} {0}".format ("Hello", "Python")           #代码不变,输出参数的索引不同
Out[16]: 'Python Hello'                                 #输出结果不同
In [17]: "{0} {1} {0}".format("Hellon", "Python")       # 还可以多次重复输出
Out[17]: 'Hello Python Hello'

除此之外,我们还可以在参数索引后面添加冒号:,在冒号之后添加特定的输出格式。
In [18]: "{:.2f}".format(3.1415926)       #保留小数点后两位,f 表示浮点数(float)
Out[18]: '3.14'
In [19]: "{:+.2f}".format(3.1415926)      #带符号保留小数点后两位
Out[19]:'+3.14'
In [20]: "{:.0f}".format(3.1415926)       #不显示小数
Out[20]: '3'

有关字符串处理的方法有很多,这里就不展开讨论了。读者朋友可以边学边查边用,切不可重造轮子。

上面我们讨论的数据类型,都是 Python 的基本数据类型,它们是数据表达的基础。后面我们将详细介绍 Python 中另外四种相对复杂但常用的数据类型:列表(List)、元组(Tuple)、字典(Dictionary)和集合(Set)。

相关文章