2.3 数据类型概述

Python自带了一些内在数据类型(内在类型),主要内在数据类型包括数值(number)、字符串(str)、列表(list)、元组(tuple)、集合(set)、字典(dict)。

2.3.1 数值类型

数值类型不是一个单独的类型,而可分为int(整型)、float(浮点型)、complex(复数类型)、bool(布尔类型)。

bool型用于表示一个逻辑量,即一个命题的真和假,因此只有表示真和假的两个值True、False。

例如:

>>>type(5)
int
>>>type(3.14)
float
>>>type(2+3j)
complex
>>>type(False)
bool

只要计算机内存足够,Python的整型的长度就可以任意长。但浮点型的值小数点后的精度不超过15位,而复数型的值总是写成x+yi形式。

a=1234567890123456789
b=0.1234567890123456789
c=1+2j

print(a)
print(b)
print(c)

输出:

1234567890123456789
0.12345678901234568
(1+2j)

2.3.2 列表

list是一个数据元素的有序序列,定义列表时用一对左右方括号[ ]包围,元素之间用逗号隔开。list中的元素可以是不同的类型。例如:

[2, 3.14, 'python']

list中的元素的类型是任意的,当然可以包含其他的list对象。例如:

[2, 3.14, [3,6,9], 'python']

因为list是一个有序序列,所以其中的每个元素都有唯一的下标,下标从0开始,即第1、2、3、…元素的下标依次是0、1、2、…。因此,对于list对象可以用下标运算符[]访问它的一个元素或一系列连续的元素。

my_list=[2, 3.14, 8, 'python',9, 'hello']
print(type(my_list)) #打印my_list的类型,即list类型
print(my_list)
print(my_list[0])
print(my_list[3])

输出:

<class 'list'>
[2, 3.14, 8, 'python', 9, 'hello']
2
python

还可以通过向下标运算符[ ]传递起始位置和结束位置的两个下标,返回连续多个元素组成的子列表(不包含结束位置的元素)。格式如下:

list[start:end]

起始位置和结束位置下标之间用冒号:隔开。例如:

my_list=[2, 3.14, 8, 'python',9, 'hello']
print(my_list[1:4]) #从第2个到第5个,不包含第5个
print(my_list[2:])  #起始位置下标为2,没有结束位置下标,表示从起始位置下标之后的所有元素
print(my_list[:4])  #没有起始位置下标,表示起始位置下标默认为0
print(my_list[:])  #没有起始位置和结束位置下标,表示所有元素

输出:

[3.14, 8, 'python']
[8, 'python', 9, 'hello']
[2, 3.14, 8, 'python']
[2, 3.14, 8, 'python', 9, 'hello']

list对象是可修改的(mutable)。例如:

my_list=[2, 3.14, 8, 'python',9, 'hello']
my_list[2]=’小白’
print(my_list)

输出:

[2, 3.14, ’小白’, 'python', 9, 'hello']

为指定下标范围内的元素重新赋值,从而替换为另一个list。例如:

my_list=[2, 3.14, 8, 'python',9, 'hello']
my_list[2:5]=[10,25]
print(my_list)

输出:

[2, 3.14, 10, 25, 'hello']

为指定下标范围内的元素赋值一个空的list[ ],相当于删除这个范围内的元素。例如:

my_list=[2,3.14,10,25, 'hello']
my_list[2:4]=[]     #相当于删除了[2:4]之间的元素,不包括下标为4的元素
print(my_list)

输出:

[2, 3.14, 'hello']

必须给下标范围内的元素赋值一个list对象,如果赋值非list对象则会出错。例如:

my_list[1:3]=5

产生TypeError(类型错误):

----------------------------------------------------------------------
TypeError                  Traceback(most recent call last)
<ipython-input-10-22d1f85b1294> in <module>()
----> 1 my_list[1:3]=5

TypeError: can only assign an iterable

2.3.3 元组

和list一样,元组(tuple)也是一个有序序列,也就是每个元素也有唯一的下标,但tuple是不可修改的(immutable),另外,定义tuple时用圆括号而不是方括号。例如:

t=('python', [2,5],37,3.14, "https://a.hwdong.com")
print(type(t))

输出:

<class 'tuple'>

可以用下标运算符[]访问tuple的元素:

print(t[2])
print(t[0:3])
print(t[:4])

输出:37

('python', [2, 5], 37)

('python', [2, 5], 37, 3.14)

但不可以通过下标修改tuple对象,因为tuple是不可修改的。例如:

t[1]='helo'

产生下列类型错误(TypeError):

TypeError           Traceback(most recent call last)

<ipython-input-14-30808fa682a5> in <module>()
----> 1 t[1]='helo'
TypeError: 'tuple' object does not support item assignment

注意

只有一个元素的tuple的最后必须加一个逗号,如(25,)表示一个tuple,而(25)表示一个整数。

2.3.4 字符串

1.字符串(str)

字符串是UniCode字符的有序序列,可以用置于首尾的单引号或双引号包围一个字符序列来表示字符串。如果字符串的内容写在多行,则首尾分别要用三个单引号或双引号包围多行的字符序列。

单引号表示的字符串中可以包含双引号字符,但不能直接包含单引号(否则无法知道字符串的开始结尾在哪里)。同样,双引号表示的字符串中可以包含单引号,但不能直接包含双引号。例如:

print("教’小白’精通编程博客")
print(’教"小白"精通编程博客’)
print(''' ’教小白精通编程博客’
https://a.hwdong.com
python语言
''')

输出:

教’小白’精通编程博客
教"小白"精通编程博客
'教小白精通编程博客’
https://a.hwdong.com
python语言

单引号表示的字符串中不能直接包含单引号,双引号的字符串中也不能直接包含双引号。例如:

print(’教’小白精通编程博客’)#单引号表示的字符串中不能包含单引号

产生如下语法错误:

File "<ipython-input-24-11082e72943d>", line 1
    print(’教’小白精通编程博客’)  #单引号表示的字符串中不能包含单引号
                  ^
SyntaxError: invalid syntax

和tuple一样,str类型的对象也是不可修改的(immutable)。例如:

s ='hello world'
s[1]='E'

产生“字符串对象不支持赋值”的TypeError(类型错误):

----------------------------------------------------------------------
TypeError               Traceback(most recent call last)
<ipython-input-1-8616f9d54e50> in <module>()
      1 s ='hello world'
----> 2 s[1]='E'

TypeError: 'str' object does not support item assignment

2.转义字符

如果要在单引号表示的字符串中包含单引号,则可以在其前面添加反斜杠符号\构成一个单独的字符。例如,用\’表示单引号字符,这种前面加反斜杠字符表示字符’的 \’称为“转义字符”。转义字符表示的是一个字符而不是两个字符。

print('hello \'li ping\'')
print(len('hello \'li ping\''))#打印字符串的长度,\’表示的是一个字符

输出:

hello 'li ping'
15

既然反斜杠字符的特殊作用是表示“转义字符”,那么如何表示反斜杠字符呢?办法是在它前面同样加上反斜杠字符,即转义字符\\表示的是单个斜杠字符\。例如:

print('hello \\')

输出:

hello \

转义字符通常可以表示各种不可见的字符,如控制字符。例如,\t表示“制表符”, \n表示“换行符”。因为这些字符是不可见的,所以函数print()在遇到这些字符时会执行特定的动作。例如,对于制表符\t,就输出固定个数的空格,对于换行符\n就换到新的一行。例如:

print('hello\tworld\n')
print('ok')

输出:

hello world

ok

上例在输出的hello和world之间输出了固定个数的空格,并在换行符处换了一行。

同样可以用下标运算符[]访问字符串的一个或多个连续字符。例如:

s='python programming'
print(s[3])
print(s[1:9])

输出:

h
ython pr

2.3.5 集合

set是不包含重复元素的无序集合。set是用左右花括号{},包围的,以逗号隔开的一组元素。因为集合无序,所以不能用下标操作其中的元素。例如:

s={2,3, 'python',8}
print(type(s))
print(s)

输出:

<class 'set'>
{8, 2, 3, 'python'}

set中不能有相同值的元素。例如:

s={1,2,2,3,3,3}
print(s)

输出:

{1, 2, 3}

集合是根据其元素的哈希值存储元素的,所以无法计算哈希值的对象不能作为集合的元素。例如,list对象是无法计算哈希值的,所以不能作为集合的元素。例如:

s={2,3, [5,8]} #list是一个无法哈希的数据类型

产生“list不是可哈希的类型”的TypeError(语法错误):

---------------------
TypeError               Traceback(most recent call last)

<ipython-input-28-54a5e1329f94> in <module>()
----> 1 s={2,3, [5,8]}   #list不是可哈希的数据类型
TypeError: unhashable type: 'list'

2.3.6 字典

dict是一个“键-值”对(key-value pairs)的无序集合。

dict中的每个元素都以“键:值(key:value)”的形式存储。例如:

d={1:'value', 'key':2, 'hello':[4,7]}
print(type(d))
print(d)

输出:

<class 'dict'>
{1: 'value', 'key': 2, 'hello': [4, 7]}

需要通过key(,也称关键字)才能访问dict中key对应的值(value)。例如:

d['hello']

输出:

[4, 7]

再如:

d[1]

输出:

'value'

总结

● Python的内在数据类型包括int、float、complex、bool, str, list、tuple、set、dict等。

● list对象是可以修改的,而str和tuple等对象是不可修改的。

● 对于有序序列数据类型,如str、list、tuple,可以通过下标访问其中的一个或多个元素,而无序的set则不能用下标访问其中的元素。