内置数据类型

在 Python 中, 每个值都有一种数据类型,但您并不需要声明变量的数据类型。

Python 根据每个变量的初始赋值情况分析其类型,并在内部对其进行跟踪。

Python 有多种内置数据类型。以下是比较重要的一些:

  1. Booleans[布尔型] 或为 True[真] 或为 False[假]。
  2. Numbers[数值型] 可以是 Integers[整数](1 和 2)、Floats[浮点数](1.1 和 1.2)、Fractions[分数](1/2 和 2/3);甚至是 Complex Number[复数]。
  3. Strings[字符串型] 是 Unicode 字符序列,例如: 一份 html 文档。
  4. Bytes[字节] 和 Byte Arrays[字节数组], 例如: 一份 jpeg 图像文件。
  5. Lists[列表] 是值的有序序列。
  6. Tuples[元组] 是有序而不可变的值序列。
  7. Sets[集合] 是装满无序值的包裹。
  8. Dictionaries[字典] 是键值对的无序包裹。

List 列表

  1. 列表创建:使用中括号包裹一系列以逗号分割的值即可。
1
2
3
>>> fruits = ['orange', 'apple', 'pear', 'banana', 'kiwi', 'apple', 'banana']
>>> fruits
['orange', 'apple', 'pear', 'banana', 'kiwi', 'apple', 'banana']
  1. 通过索引值访问列表元素
1
2
3
4
5
6
7
>>> fruits
['orange', 'apple', 'pear', 'banana', 'kiwi', 'apple', 'banana']
>>> fruits[6]
'banana'
>>> fruits[-1]
'banana'

使用负索引值可从列表的尾部向前计数访问元素。任何非空列表的最后一个元素总是 list[-1] 。

  1. 列表切片:

通过指定两个索引值 list[start:end],可以从列表中获取称作“切片”的某个部分,

[start -> end) 包含start,不包含end。返回值是一个新列表。

1
2
3
4
5
6
7
8
>>> fruits
['orange', 'apple', 'pear', 'banana', 'kiwi', 'apple', 'banana']
>>> fruits[1:3]
['apple', 'pear']
>>> fruits[:3]
['orange', 'apple', 'pear']
>>> fruits[3:-1]
['banana', 'kiwi', 'apple']
  1. 四种方法可用于向列表中增加元素

使用+号运算符,连接两个列表,返回新的列表。

1
2
3
>>> fruits + fruits
['orange', 'apple', 'pear', 'banana', 'kiwi', 'apple', 'banana', 'orange', 'apple', 'pear', 'banana', 'kiwi', 'apple', 'banana']

list.append(x)

在列表末尾添加一个元素,相当于 a[len(a):] = [x] 。

list.extend(iterable)

用可迭代对象的元素扩展列表。相当于 a[len(a):] = iterable 。
1
2
3
4
5
>>> fruits
['orange', 'apple', 'pear', 'banana', 'kiwi', 'apple', 'banana']
>>> fruits.extend(fruits)
>>> fruits
['orange', 'apple', 'pear', 'banana', 'kiwi', 'apple', 'banana', 'orange', 'apple', 'pear', 'banana', 'kiwi', 'apple', 'banana']

extend接受一个列表参数,将列表参数中的元素全部添加到该列表中。

list.insert(i, x)

在指定位置插入元素。第一个参数是插入元素的索引,因此,a.insert(0, x) 在列表开头插入元素, a.insert(len(a), x) 等同于 a.append(x) 。
  1. 检索列表中的元素

list.index(x[, start[, end]])

返回列表中第一个值为 x 的元素的零基索引。未找到指定元素时,触发 ValueError 异常。

可选参数 start 和 end 是切片符号,用于将搜索限制为列表的特定子序列。返回的索引是相对于整个序列的开始计算的,而不是 start 参数。

list.count(x)

返回列表中元素 x 出现的次数。

in 运算符判断元素是否存在列表中,总是返回 True 或 False

1
2
3
4
5
6
7
8
9
>>> fruits
['orange', 'apple', 'pear', 'banana', 'kiwi', 'apple', 'banana', 'orange', 'apple', 'pear', 'banana', 'kiwi', 'apple', 'banana']
>>> fruits.count('apple')
4
>>> fruits.index('apple')
1
>>> 'apple' in fruits
True

  1. 从列表中删除元素

可使用 del 语句从列表中删除某个特定元素

1
2
3
4
5
6
7
8
>>> fruits
['orange', 'apple', 'pear', 'banana', 'kiwi', 'apple', 'banana', 'orange', 'apple', 'pear', 'banana', 'kiwi', 'apple', 'banana']
>>> del fruits[1]
>>> fruits[1]
'pear'
>>> fruits
['orange', 'pear', 'banana', 'kiwi', 'apple', 'banana', 'orange', 'apple', 'pear', 'banana', 'kiwi', 'apple', 'banana']

list.remove(x)

从列表中删除第一个值为 x 的元素。未找到指定元素时,触发 ValueError 异常。

list.pop([i])

移除列表中给定位置上的条目,并返回该条目。 如果未指定索引号,则 a.pop() 将移除并返回列表中的最后一个条目。 如果列表为空或索引号在列表索引范围之外则会引发 IndexError。

list.clear()

删除列表里的所有元素,相当于 del a[:] 。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
>>> fruits
['orange', 'pear', 'banana', 'kiwi', 'apple', 'banana', 'orange', 'apple', 'pear', 'banana', 'kiwi', 'apple', 'banana']
>>> fruits.remove('orange')
>>> fruits
['pear', 'banana', 'kiwi', 'apple', 'banana', 'orange', 'apple', 'pear', 'banana', 'kiwi', 'apple', 'banana']
>>> fruits.pop(1)
'banana'
>>> fruits
['pear', 'kiwi', 'apple', 'banana', 'orange', 'apple', 'pear', 'banana', 'kiwi', 'apple', 'banana']
>>> fruits.clear()
>>> fruits
[]
>>> fruits.remove('orange')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: list.remove(x): x not in list

列表详解

Tuples 元组

元组 是不可变的列表。一旦创建之后,用任何方法都不可以修改元素。

元组定义方式是使用圆括号来包裹整个元素。

元组和列表的主要区别是元组不能进行修改。

元组可转换成列表,反之亦然。内建的 tuple() 函数接受一个列表参数,并返回一个包含同样元素的元组,而 list() 函数接受一个元组参数并返回一个列表。从效果上看, tuple() 冻结列表,而 list() 融化元组。

1
2
3
>>> fruits = ('orange', 'apple', 'pear', 'banana', 'kiwi', 'apple', 'banana')
>>> fruits
('orange', 'apple', 'pear', 'banana', 'kiwi', 'apple', 'banana')

元组有什么好处呢?

  • 元组的速度比列表更快。如果定义了一系列常量值,而所需做的仅是对它进行遍历,那么请使用元组替代列表。
  • 对不需要改变的数据进行“写保护”将使得代码更加安全。使用元组替代列表就像是有一条隐含的 assert 语句显示该数据是常量,特别的想法(及特别的功能)必须重写。(??)
  • 一些元组可用作字典键(特别是包含字符串、数值和其它元组这样的不可变数据的元组)。列表永远不能当做字典键使用,因为列表不是不可变的。
  1. 同时赋多个值
1
2
3
4
5
6
7
8
9
>>> v = ('a', 2, True)
>>> (x, y, z) = v
>>> x
'a'
>>> y
2
>>> z
True
>>> (MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY) = range(7)

元组和序列

Sets 集合

集合是由不重复元素组成的无序容器。基本用法包括成员检测、消除重复元素。集合对象支持合集、交集、差集、对称差分等数学运算。

创建集合用花括号或 set() 函数。注意,创建空集合只能用 set(),不能用 {},{} 创建的是空字典

1
2
3
4
5
6
7
>>> basket = set()
>>> type(basket)
<class 'set'>
>>> basket = {}
>>> type(basket)
<class 'dict'>

使用 set() 函数将列表转换为集合,转换后会对元素去重。

1
2
3
4
5
6
7
8
>>> fruits
['orange', 'apple', 'pear', 'banana', 'kiwi', 'apple', 'banana']
>>> basket = set(fruits)
>>> basket
{'banana', 'orange', 'pear', 'apple', 'kiwi'}
>>> type(basket)
<class 'set'>

对集合对象进行合集、交集、差集、对称差分等数学运算

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
>>> fruits
{'tomato', 'banana', 'orange', 'pear', 'apple', 'kiwi'}
>>> vegetables
{'tomato', 'cabbage'}

>>> fruits - vegetables
{'banana', 'orange', 'pear', 'apple', 'kiwi'}
>>> fruits | vegetables
{'apple', 'kiwi', 'cabbage', 'tomato', 'banana', 'orange', 'pear'}
>>> fruits & vegetables
{'tomato'}
>>> fruits ^ vegetables # letters in fruits or vegetables but not both
{'banana', 'orange', 'pear', 'apple', 'kiwi', 'cabbage'}

修改集合

集合中添加元素,add() 方法和 update() 方法。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
>>> fruits
{'tomato', 'banana', 'orange', 'pear', 'apple', 'kiwi'}
>>> fruits.add('cucumber')
>>> fruits
{'tomato', 'banana', 'orange', 'pear', 'apple', 'kiwi', 'cucumber'}
>>> vegetables
{'tomato', 'cabbage'}
>>> vegetables.update({'cucumber'}, {'cron'})
>>> vegetables
{'tomato', 'cron', 'cabbage', 'cucumber'}

从集合中删除某个值,discard() 和 remove() 有细微的差异。

1
2
3
4
5
6
7
8
>>> fruits
{'tomato', 'banana', 'orange', 'pear', 'apple', 'kiwi', 'cucumber'}
>>> fruits.discard('cron')
>>> fruits.remove('cron')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'cron'

  • discard() 接受一个单值作为参数,并从集合中删除该值。
  • 如果针对一个集合中不存在的值调用 discard() 方法,它不进行任何操作。不产生错误;只是一条空指令。
  • remove() 方法也接受一个单值作为参数,也从集合中将其删除。
  • 区别在这里:如果该值不在集合中,remove() 方法引发一个 KeyError 例外。

集合也有个 pop() 方法

  • pop() 方法从集合中删除某个值,并返回该值。然而,由于集合是无序的,并没有“最后一个”值的概念,因此无法控制删除的是哪一个值。它基本上是随机的。
  • clear() 方法删除集合中 所有 的值,留下一个空集合。它等价于 a_set = set(),该语句创建一个新的空集合,并用之覆盖 a_set 变量的之前的值。
  • 试图从空集合中弹出某值将会引发 KeyError 例外。

常见集合操作

Dict 字典

字典 是键值对的无序集合。

字典是以 键 进行索引的,键可以是任何不可变类型;字符串和数字总是可以作为键。 如果一个元组只包含字符串、数字或元组则也可以作为键;如果一个元组直接或间接地包含了任何可变对象,则不能作为键。 列表不能作为键,因为列表可以使用索引赋值、切片赋值或者 append() 和 extend() 等方法进行原地修改列表。

可以把字典理解为 键值对 的集合,但字典的键必须是唯一的。花括号 {} 用于创建空字典。另一种初始化字典的方式是,在花括号里输入逗号分隔的键值对,这也是字典的输出方式。

使用{}创建字典

1
2
3
4
>>> d={}
>>> type(d)
<class 'dict'>

操作字典

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
>>> d={'fruits': fruits, 'vegetables': vegetables}
>>> d
{'fruits': {'tomato', 'banana', 'orange', 'pear', 'apple', 'kiwi', 'cucumber'}, 'vegetables': {'tomato', 'cron', 'cabbage', 'cucumber'}}

>>> 'fruits' in d
True
>>> d['fruits'] = list(fruits)
>>> d
{'fruits': ['tomato', 'banana', 'orange', 'pear', 'apple', 'kiwi', 'cucumber'], 'vegetables': {'tomato', 'cron', 'cabbage', 'cucumber'}}
>>> d['fruits'][1]
'banana'
>>> d['cron']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'cron'

当查询键不存在时,会引发KeyError错误。

None

None 是 Python 的一个特殊常量。它是一个 空 值。None 与 False 不同。None 不是 0 。None 不是空字符串。将 None 与任何非 None 的东西进行比较将总是返回 False 。

None 是唯一的空值。它有着自己的数据类型(NoneType)。可将 None 赋值给任何变量,但不能创建其它 NoneType 对象。所有值为 None 变量是相等的。

参考