内置数据类型
在 Python 中, 每个值都有一种数据类型,但您并不需要声明变量的数据类型。
Python 根据每个变量的初始赋值情况分析其类型,并在内部对其进行跟踪。
Python 有多种内置数据类型。以下是比较重要的一些:
- Booleans[布尔型] 或为 True[真] 或为 False[假]。
- Numbers[数值型] 可以是 Integers[整数](1 和 2)、Floats[浮点数](1.1 和 1.2)、Fractions[分数](1/2 和 2/3);甚至是 Complex Number[复数]。
- Strings[字符串型] 是 Unicode 字符序列,例如: 一份 html 文档。
- Bytes[字节] 和 Byte Arrays[字节数组], 例如: 一份 jpeg 图像文件。
- Lists[列表] 是值的有序序列。
- Tuples[元组] 是有序而不可变的值序列。
- Sets[集合] 是装满无序值的包裹。
- Dictionaries[字典] 是键值对的无序包裹。
List 列表
- 列表创建:使用中括号包裹一系列以逗号分割的值即可。
1
2
3
|
>>> fruits = ['orange', 'apple', 'pear', 'banana', 'kiwi', 'apple', 'banana']
>>> fruits
['orange', 'apple', 'pear', 'banana', 'kiwi', 'apple', 'banana']
|
- 通过索引值访问列表元素
1
2
3
4
5
6
7
|
>>> fruits
['orange', 'apple', 'pear', 'banana', 'kiwi', 'apple', 'banana']
>>> fruits[6]
'banana'
>>> fruits[-1]
'banana'
|
使用负索引值可从列表的尾部向前计数访问元素。任何非空列表的最后一个元素总是 list[-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
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) 。
- 检索列表中的元素
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
|
- 从列表中删除元素
可使用 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
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 是 Python 的一个特殊常量。它是一个 空 值。None 与 False 不同。None 不是 0 。None 不是空字符串。将 None 与任何非 None 的东西进行比较将总是返回 False 。
None 是唯一的空值。它有着自己的数据类型(NoneType)。可将 None 赋值给任何变量,但不能创建其它 NoneType 对象。所有值为 None 变量是相等的。
参考