# Python 数据类型

> 原文： [http://zetcode.com/lang/python/datatypes/](http://zetcode.com/lang/python/datatypes/)

在 Python 编程教程的这一部分中，我们讨论 Python 数据类型。

电子表格，文本编辑器，计算器或聊天客户端等计算机程序可处理数据。 用于各种数据类型的工具是现代计算机语言的基本组成部分。

## Python 数据类型定义

数据类型是一组值以及对这些值的允许操作。

Python 有很多有用的数据类型。 Python 的数据类型构建在语言的核心中。 它们易于使用和直接。

## Python 布尔值

我们的世界建立了双重性。 有天与地，水与火，阴与阳，男人与女人，爱与恨。 在 Python 编程语言中，布尔数据类型是具有以下两个值之一的原始数据类型：`True`或`False`。 这是基本的数据类型。 有趣的是，这种数据类型从一开始就不存在，但是后来才创建。

快乐的父母正在等待孩子的出生。 他们为两种可能性都选择了名称。 如果要成为男孩，他们可能选择了约翰。 如果要成为女孩，他们可能选择了维多利亚。

`kid.py`

```py
#!/usr/bin/env python

# kid.py

import random

male = False
male = bool(random.randint(0, 1))

if male:
   print("We will use name John")
else:
   print("We will use name Victoria")

```

该脚本使用随机整数生成器来模拟我们的情况。

```py
import random

```

在这里，我们导入用于计算随机数的随机模块。

```py
male = bool(random.randint(0, 1))

```

在这里，我们使用两个函数。 `randint()`函数从给定的整数边界返回一个随机数。 在我们的情况下为 0 或 1。`bool()`函数将整数转换为布尔值。

```py
if male:
    print("We will use name John")
else:
    print("We will use name Victoria")

```

我们打印名称。 `if`关键字适用于布尔值。 如果`male`为`True`，则在控制台上打印“我们将使用名称 John”。 如果它具有`False`值，我们将打印另一个字符串。

以下脚本显示了一些常见的值，它们被认为是`True`或`False`。

`bool_fun.py`

```py
#!/usr/bin/env python

# bool_fun.py

print(bool(True))
print(bool(False))
print(bool("text"))
print(bool(""))
print(bool(' '))
print(bool(0))
print(bool())
print(bool(3))
print(bool(None))

```

该示例打印九个布尔值。

```py
$ ./bool_fun.py 
True
False
True
False
True
False
False
True
False

```

这是`bool_fun.py`脚本的输出。

## Python `None`

还有另一种特殊的数据类型-`None`。 此数据类型表示不存在，未知或为空。

`none.py`

```py
#!/usr/bin/env python

# none.py

def function():
    pass

print(function())

```

在我们的示例中，我们定义一个函数。 功能将在本教程的后面部分介绍。 该功能不执行任何操作。 它不会显式返回任何值。 这样的函数将隐式返回`None`。

```py
$ ./none.py 
None

```

这是`none.py`脚本的输出。

## Python 数字

在 Python 编程语言中，我们有整数，浮点数和复数。

如果我们使用整数，那么我们将处理离散实体。 我们将使用整数来计算苹果。

`apples.py`

```py
#!/usr/bin/env python

# apples.py

# number of baskets
baskets = 16

# number of apples in a basket
apples_in_basket = 24

# we get the total number of apples
total = baskets * apples_in_basket

print("There are total of", total, "apples")

```

在脚本中，我们计算了苹果的总量。 我们使用乘法运算。

```py
$ ./apples.py 
There are total of 384 apples

```

这是脚本的输出。

浮点数表示计算中的实数。 实数测量连续量。 假设一个短跑运动员跑了 1 个小时，跑了 9.87 秒。 他的公里/小时速度是多少？

`sprinter.py`

```py
#!/usr/bin/env python

# sprinter.py

# 100 m is 0.1 km

distance = 0.1

# 9.87 s is 9.87/60*60 h

time = 9.87 / 3600

speed = distance / time

print("The average speed of a sprinter is {0} km/h".format(speed))

```

为了获得速度，我们将距离除以时间。

```py
print("The average speed of a sprinter is {0} km/h".format(speed))

```

我们使用`format()`功能构建消息并将其打印到控制台。

```py
$ ./sprinter.py 
The average speed of a sprinter is  36.4741641337 km/h

```

这是`sprinter.py`脚本的输出。 值 36.4741641337 是浮点数。

## Python 字符串

字符串是代表计算机程序中文本数据的数据类型。

可以使用单引号，双引号和三引号在 Python 中创建字符串。 当我们使用三引号时，字符串可以跨越多行而无需使用转义符。

`strings.py`

```py
#!/usr/bin/env python

# strings.py

a = "proximity alert"
b = 'evacuation'
c = """
requiem 
for
a 
tower
"""

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

```

在我们的示例中，我们为`a`，`b`和`c`变量分配了三个字符串文字。 然后我们将它们打印到控制台。

```py
$ ./strings.py 
proximity alert
evacuation

requiem 
for 
a 
tower

```

这是`strings.py`脚本的输出。

在处理字符串时，可以使用转义序列。 转义序列是在字符串中使用时具有特定用途的特殊字符。

```py
print("   bbb\raaa") # prints aaabbb

```

回车`\r`是行尾到行首的控制字符。

`strophe.py`

```py
#!/usr/bin/env python

# strophe.py

print("Incompatible, it don't matter though\n'cos someone's bound to hear my cry")
print("Speak out if you do\nYou're not easy to find")

```

新行是一个控制字符，它开始新的一行文本。

```py
$ ./strophe.py 
Incompatible, it don't matter though
'cos someone's bound to hear my cry
Speak out if you do
You're not easy to find

```

接下来，我们检查退格控制字符。

```py
print("Python\b\b\booo") # prints Pytooo

```

退格控制字符`\b`将光标向后移动一个字符。 在本例中，我们使用三个退格字符删除三个字母，并用三个`o`字符替换它们。

```py
print("Towering\tinferno") # prints Towering        inferno

```

水平选项卡在文本之间放置一个空格。

```py
"Johnie's dog"
'Johnie\'s dog'

```

单引号和双引号可以嵌套。 或者，如果仅使用单引号，则可以使用反斜杠来转义单引号的默认含义。

```py
print("eagle has", len("eagle"), "characters")

```

我们可以使用`len()`函数来计算字符串的长度（以字符为单位）。

如果在字符串后附加`r`，则会得到原始字符串。 转义序列不被解释。

`raw.py`

```py
#!/usr/bin/env python

# raw.py

print(r"Another world\n")

```

```py
$ ./raw.py 
Another world\n

```

我们得到的字符串包括换行符。

在下一个示例中，我们显示了字符串乘法和连接。

`strings2.py`

```py
#!/usr/bin/python

# strings2.py

print("eagle " * 5)

print("eagle " "falcon")

print("eagle " + "and " + "falcon")

```

`*`运算符将字符串重复 n 次。 在我们的情况下是五次。 彼此相邻的两个字符串文字会自动连接在一起。 我们还可以使用`+`运算符显式连接字符串。

```py
$ ./strings2.py 
eagle eagle eagle eagle eagle 
eagle falcon
eagle and falcon

```

这是`strings.py`脚本的输出。

Python 具有几种用于处理值集合的内置数据类型：元组，列表，集合和字典。

## Python 元组

元组是不可变序列数据类型。 元组可以包含混合数据类型。

```py
fruits = ("oranges", "apples", "bananas")

```

使用圆括号创建元组。 在这里，我们有一个由三种水果类型组成的元组。

```py
fruits = "apples", "oranges", "bananas"
print(fruits)  # prints  ('apples', 'oranges', 'bananas')

```

括号不是必须的。 我们可以省略它们。

`tuples.py`

```py
#!/usr/bin/env python

# tuples.py

first = (1, 2, 3)
second = (4, 5, 6)

print("len(first) : ", len(first))
print("max(first) : ", max(first))
print("min(first) : ", min(first))
print("first + second :", first + second)
print("first * 3 : ", first * 3)
print("1 in first : ", 1 in first)
print("5 not in second : ", 5 not in second)

```

此示例显示了元组的几个基本操作。 `len()`函数返回第一个元组中的元素数。 `max()`功能返回最大值，`min()`最小值。 加法运算符将两个元组相加，乘法运算符将元组相乘。 `in`运算符确定该值是否在元组中。

```py
$ ./tuples.py
len(first) :  3
max(first) :  3
min(first) :  1
first + second : (1, 2, 3, 4, 5, 6)
first * 3 :  (1, 2, 3, 1, 2, 3, 1, 2, 3)
1 in first :  True
5 not in second :  False

```

这是脚本的输出。

接下来，我们将进行一些索引编制。

`tuples2.py`

```py
#!/usr/bin/env python

# tuples2.py

five = (1, 2, 3, 4, 5)

print("five[0] : ", five[0])
print("five[-1] : ", five[-1])
print("five[-2] : ", five[-2])
print("five[:] : ", five[:])
print("five[0:4] : ", five[0:4])
print("five[1:2] : ", five[1:2])
print("five[:2] : ", five[:2])
print("five[:-1] : ", five[:-1])
print("five[:9] : ", five[:9])

```

为了从元组中获取值，我们使用方括号`[]`。 请注意，我们从 0 开始计算索引。如果一个元组中有五个对象，则索引为`0...4`。 如果使用负索引，则从元组的末尾获得一个值。 因此，索引-1 获得最后一个元素，-2 获得最后一个但只有一个元素。 Python 支持从元组创建切片。 为此，我们使用`:`分隔符。 例如，`[0:4]`给出`(1, 2, 3, 4)`。 请注意，不包括最后一个元素。

我们可以省略切片中的一个或两个索引。 `[:4]`给出`(1, 2, 3, 4)`。 它来自第一个元素。 `[0:]`给出（`1,2,3,4,5`）。 这次，包含了最后一个元素。 如果超出范围，我们只需将所有元素都包含在元组中。

```py
$ ./tuples2.py 
five[0] :  1
five[-1] :  5
five[-2] :  4
five[:] :  (1, 2, 3, 4, 5)
five[0:4] :  (1, 2, 3, 4)
five[1:2] :  (2,)
five[:2] :  (1, 2)
five[:-1] :  (1, 2, 3, 4)
five[:9] :  (1, 2, 3, 4, 5)

```

这是输出。

元组可以包含几种混合数据类型。

`tuples_mix.py`

```py
#!/usr/bin/env python

# tuples_mix.py

mix = (1, 2, "solaris", (1, 2, 3))

print("mix[1] :", mix[1])
print("mix[2] :", mix[2])
print("mix[3] :", mix[3])
print("mix[3][0] :", mix[3][0])
print("mix[3][1] :", mix[3][1])
print("mix[3][2] :", mix[3][2])

```

在我们的示例中，我们将数字，字符串和元组放入了混合元组中。

```py
$ ./tuples_mix.py 
mix[1] : 2
mix[2] : solaris
mix[3] : (1, 2, 3)
mix[3][0] : 1
mix[3][1] : 2
mix[3][2] : 3

```

为了从嵌套元组中获取元素，我们使用了两个方括号。

当我们处理包含一个元素的元组时，会有一个例外。 括号也用在表达式中。 我们如何区分一个表达式和一个元素元组？ Python 编程语言的创建者决定使用逗号来表示我们正在使用元组。

`tuple_one.py`

```py
#!/usr/bin/env python

# tuple_one.py

print((3 + 7))
print((3 + 7, ))

```

在第一种情况下，我们有`and`表达式。 我们将 10 号打印到控制台。 在第二种情况下，我们处理一个元组。 我们打印一个包含数字 10 的元组。

```py
$ ./tuple_one.py 
10
(10,)

```

这是输出。

## Python 列表

列表是可变序列数据类型。 它可以包含混合数据类型。 列表和元组具有许多共同的特征。 由于列表是可修改的数据类型，因此它具有一些其他操作。 一整章专门介绍 Python 列表。

```py
actors = ["Jack Nicholson", "Antony Hopkins", "Adrien Brody"]

```

该列表是使用方括号`[]`创建的。

`list_simple.py`

```py
#!/usr/bin/env python

# simple_list.py

num = [0, 2, 5, 4, 6, 7]

print(num[0])
print(num[2:])
print(len(num))
print(num + [8, 9])

```

如前所述，我们可以在列表上使用与元组相同的操作。

```py
$ ./list_simple.py 
0
[5, 4, 6, 7]
6
[0, 2, 5, 4, 6, 7, 8, 9]

```

这是输出。

接下来，我们将对列表进行排序。

`list_sorting.py`

```py
#!/usr/bin/env python

# list_sorting.py

numbers = [4, 3, 6, 1, 2, 0, 5]

print(numbers)
numbers.sort()
print(numbers)

```

在脚本中，我们有一个数字列表。 要对这些数字进行排序，我们使用内置的`sort()`函数。

```py
$ ./list_sorting.py 
[4, 3, 6, 1, 2, 0, 5]
[0, 1, 2, 3, 4, 5, 6]

```

`reverse()`函数将以相反的顺序对列表的元素进行排序。

```py
numbers.reverse()   #  [5, 4, 3, 2, 1, 0]

```

使用`count()`方法对列表中的元素进行计数。

`list_counting_elements.py`

```py
#!/usr/bin/env python

# list_counting_elements.py

numbers = [0, 0, 2, 3, 3, 3, 3]

print("zero is here",  numbers.count(0), "times")
print("one is here",   numbers.count(1), "times") 
print("two is here",   numbers.count(2), "time") 
print("three is here", numbers.count(3), "times") 

```

该脚本对列表中出现的次数进行计数。

```py
$ ./list_counting_elements.py 
zero is here 2 times
one is here 0 times
two is here 1 time
three is here 4 times

```

接下来，我们将处理从列表中插入和删除项目。

`list_modify.py`

```py
#!/usr/bin/env python

# list_modify.py

names = []

names.append("Frank")
names.append("Alexis")
names.append("Erika")
names.append("Ludmila")

print(names)

names.insert(0, "Adriana")
print(names)

names.remove("Frank")
names.remove("Alexis")
del names[1]
print(names)

del names[0]
print(names)

```

在我们的示例中，我们首先创建一个空名称列表。 我们使用`append()`功能将新项目添加到列表中。 元素以连续方式附加。 `insert()`函数在给定位置插入新元素。 现有元素不会被删除，它们将被重定位。 `remove()`功能从列表中删除特定项目。 如果要基于索引删除项目，请使用`del`关键字。

```py
$ ./list_modify.py 
['Frank', 'Alexis', 'Erika', 'Ludmila']
['Adriana', 'Frank', 'Alexis', 'Erika', 'Ludmila']
['Adriana', 'Ludmila']
['Ludmila']

```

这是`list_modify.py`脚本的输出。

以下程序提供了另外两个功能。

`list_modify2.py`

```py
#!/usr/bin/env python

# list_modify2.py

first = [1, 2, 3]
second = [4, 5, 6]

first.extend(second)
print(first)

first[0] = 11
first[1] = 22
first[2] = 33
print(first)

print(first.pop(5))
print(first)

```

`extend()`方法将整个列表追加到另一个列表。 要修改列表中的元素，我们可以使用赋值运算符。 `pop()`方法从列表中获取一个项目并返回它。

```py
$ ./list_modify2.py 
[1, 2, 3, 4, 5, 6]
[11, 22, 33, 4, 5, 6]
6
[11, 22, 33, 4, 5]

```

这是输出。

在下面的示例中，我们将找出元素的索引。

`list_index.py`

```py
#!/usr/bin/env python

# list_index.py

numbers = [0, 1, 2, 3, 3, 4, 5]

print(numbers.index(1))
print(numbers.index(3))

```

要在列表中查找索引，我们使用`index()`方法。 如果有更多的元素出现，则该方法返回第一个元素的索引。

```py
$ ./list_index.py 
1
3

```

这是`list_index.py`脚本的输出。

接下来，我们将进行一些转换。

`list_transform.py`

```py
#!/usr/bin/env python

# list_transform.py

first = [1, 2, 3]
second = (4, 5, 6)

print(tuple(first))
print(list(second))

print(first)
print(second)

```

我们可以使用`tuple()`函数从列表中创建一个元组，并使用`list()`函数从元组中创建一个列表。 注意原始对象没有被修改； 函数仅返回那些转换后的集合。

```py
$ ./list_transform.py 
(1, 2, 3)
[4, 5, 6]
[1, 2, 3]
(4, 5, 6)

```

## Python 集

`set`是无重复数据的无序数据集合。 集合支持诸如并集，相交或求差的运算； 与数学相似。

`sets.py`

```py
#!/usr/bin/env python

set1 = set(['a', 'b', 'c', 'c', 'd'])
set2 = set(['a', 'b', 'x', 'y', 'z'])

print("set1: " , set1)
print("set2: " , set2)
print("intersection: ", set1 & set2)
print("union: ", set1 | set2)
print("difference: ", set1 - set2)
print("symmetric difference: ", set1 ^ set2)

```

在我们的示例中，我们有两组。 我们使用`set()`功能创建集合。 相交操作返回都在`set1`和`set2`中的元素。 联合操作返回两个集合中的所有元素。 差异返回`set1`中的元素，但不是`set2`的元素。 最后，对称差返回`set1`或`set2`中的元素，但两者都不是。

```py
$ ./sets.py 
set1: set(['a', 'c', 'b', 'd'])
set2: set(['a', 'x', 'b', 'y', 'z'])
intersection: set(['a', 'b'])
union: set(['a', 'c', 'b', 'd', 'y', 'x', 'z'])
difference: set(['c', 'd'])
symmetric difference: set(['c', 'd', 'y', 'x', 'z'])

```

这是`sets.py`脚本的输出。

接下来，我们介绍一些其他带有集合的操作。

`set2.py`

```py
#!/usr/bin/env python

# sets2.py

set1 = set([1, 2])
set1.add(3)
set1.add(4)

set2 = set([1, 2, 3, 4, 6, 7, 8])
set2.remove(8)

print(set1)
print(set2)

print("Is set1 subset of set2 ? :", set1.issubset(set2))
print("Is set1 superset of set2 ? :", set1.issuperset(set2))

set1.clear()
print(set1)

```

`add()`方法将一个项目添加到集合中。 `remove()`项目从集中删除一个项目。 `clear()`方法从集合中删除所有项目。 如果`set2`中的每个元素也在`set1`中，则`set1`是`set2`的超集。 如果`set1`中的每个元素也位于`set2`中，则`set1`是`set2`的子集。

```py
$ ./sets2.py 
set([1, 2, 3, 4])
set([1, 2, 3, 4, 6, 7])
Is set1 subset of set2 ? :  True
Is set1 superset of set2 ? :  False
set([])

```

如果我们需要一个不可变的集合，可以使用`frozenset()`函数创建一个冻结集合。

```py
fs = frozenset(['a', 'b', 'c'])

```

该行从列表中创建一个冻结集。

## Python 字典

Python 字典是一组键值对。 字典中的元素由键索引。 字典中的键必须唯一。 由于字典数据类型的重要性，本 Python 教程中有整整一章介绍了字典。

`dictionary_simple.py`

```py
#!/usr/bin/env python

# dictionary_simple.py

words = { 'girl': 'Maedchen', 'house': 'Haus', 'death': 'Tod' }

print(words['house'])

print(words.keys())
print(words.values())
print(words.items())

print(words.pop('girl'))
print(words)

words.clear()
print(words)

```

我们的第一个示例显示了字典数据类型的一些基本用法。 我们打印特定的值，字典的键和值。 `items()`方法返回一个字典（键，值）对的列表作为元组。

```py
$ ./dictionary_simple.py 
Haus
['house', 'girl', 'death']
['Haus', 'Maedchen', 'Tod']
[('house', 'Haus'), ('girl', 'Maedchen'), ('death', 'Tod')]
Maedchen
{'house': 'Haus', 'death': 'Tod'}
{}

```

在 Python 教程的这一部分中，我们描述了 Python 数据类型。