2. Python 的常用数据类型#


Python 的常用数据类型包括数字,字符串,列表,字典等。

Pyton 将数据赋值给变量,变量命名时有下面的规则。

  • 变量名必须以字母(a-z 或 A-Z)或下划线(_)开头,不能以数字开头。

  • 变量名只能包含字母、数字和下划线(_),不能包含空格或特殊字符。

  • 变量名区分大小写(myVar 和 myvar 是不同的变量)。

2.1. 数字类型: 整数型,浮点型#


a = 1
a
1
b = 2.2
b
2.2

在上面的这段代码中,定义了一个数字型变量 a,并将其赋值为 1;定义了一个浮点型变量 b,并将其赋值为 2.2。

Note

Python 命名变量时是区分大小写的:A = 3 与 a = 3 是两个不同变量。

Python 并不像其他的一些编程语言那样需要明确数字的细分类型:整数型(int),浮点型(float)等。Python 可以自己判断数字类型,例如在上面的代码中,由于 a 没有小数点,Python 认为 a 是整数型,b 带了小数点,Python 认为 b 是浮点型。

我们可以利用 type 函数检验下:

type(a)
int
type(b)
float

Python 中数字类型的互换也非常方便,只需要将数据类型作为函数名即可,如下面代码:

float(a)  # 将整形数据 a 转化为浮点型数据
1.0
int(b)  # 将浮点型数据 b 转化为整形数据
2

对于四则运算:加减乘除,则用 + - * / () 符号直接输入即可:

1 + 2
3
20 - 5 * 2
10
(10 - 5) / 2
2.5
9 / 5
1.8

数字类型之间的相互运算的所生成的结果是“更宽”的数字类型:

  • 整数之间运算,如果数学意义上的结果是小数,结果是浮点数

  • 整数之间运算,如果数学意义上的结果是整数,结果是整数

  • 整数和浮点数的混合运算,输出结果是浮点数

求余数用百分号%,幂运算用两个星号**,两个数的整数商用符号 //,例如:

8 % 5
3
3**2
9
4.5 // 3
1.0

等号=结合其他运算符号(operator),Python 能够实现快速赋值操作:

x operator= y 等价于 x = x operator y

例如:

x = 1
x += 3  # 与 x = x + 3 等价
print("x = ", x)

y = 2
y *= 3  # 与 y = y*3 等价
print("y = ", y)
x =  4
y =  6

Python 对数字类型还有一些其他内置函数,例如求绝对值用函数abs,四舍五入函数用round,求最大值函数max,求最小值函数min

abs(-2.5)
2.5
round(3.4)
3
round(3.45, 1)  # 四舍五入保留一位小数
3.5
max(10, 20)
20
min(10, 20)
10

更复杂的数学运算需要调用数学包math,例如:

import math

math.sin(math.pi / 2)  # 正弦函数
1.0
math.log10(100)  # 对数函数
2.0

第一行代码调用 math 中的 sin 函数求 \(sin(\pi/2)\),其中调用了 math 中的 pi 函数表示 \(\pi\),第二行代码调用了对数函数求 \(\ln(100)\)

2.2. 字符串类型#


字符串也是 Python 中比较常见的数据类型,可以用单引号或双引号表示字符串。例如:

name = "chen"
name
'chen'
city = "Beijing"
city
'Beijing'

字符串的拼接直接用加号 + 即可:

name + city
'chenBeijing'

还有一种常用的拼接方式是用join函数:str.join(sequence),将序列中的元素以指定的字符连接生成一个新的字符串。例如:

",".join(["chen", "zhang", "li"])  # 将三个字符串用逗号拼接
'chen,zhang,li'
"-".join(["2020", "05", "13"])  # 将三个字符串用横线拼接
'2020-05-13'

若重复输出字符串,可以使用星号 *:

name = "chen"
name * 2
'chenchen'

可以将字符串视为一个数组,利用数组的索引得到字符串中的字符,例如:

name[0]  # 0 代表第 1 个索引
'c'

Note

计算机中,数组第一个元素的索引是 0;Python 支持倒序索引,最后一个元素的索引是 -1。

name[0:3]  # 截取字符串中的一部分,遵循“左闭右开”原则,得到第 1 到第 3 个字符
'che'

判断某个字符或某段字符串是否在字符串中,可以用innot in

"c" not in name
False
"Bei" in city
True

将其他数据类型转化为字符串类型,可以用str函数:

str(123)
'123'
str([1, 2, 3])
'[1, 2, 3]'

Python 中常用的字符串处理函数有:

str.capitalize() 将字符串 str 首字母转为大写
str.upper() 将字符串 str 内容全部大写
str.lower() 将字符串 str 内容转为小写
str.len() 字符串 str 的长度
str.isnumeric() 如果字符串 str 中只包含数字字符,则返回 True,否则返回 False
str.isspace() 如果字符串 str 都是空格,则返回 True,否则返回 False
str.isalpha() 如果字符串 str 的字符都是字母则返回 True, 否则返回 False
str.replace(old, new[, count]) 返回字符串的副本,old 子串被替换为 new,如果 count 给出,
则前 count 次出现的子串被替换
str.strip([chars]) 返回字符串的副本,在其左侧和右侧去掉 chars 中列出的字符
str.split(sep=None, maxsplit=-1) 返回一个根据 sep 分割的字符串列表

str = "python data science"
str.split()
['python', 'data', 'science']
str = "python Data Science"
str.lower()
'python data science'

2.3. 列表类型#


列表(List)是最常用的 Python 数据类型,它由一个中括号[ ]以及逗号分隔的不同数值或字符串组成,例如:

list1 = [34, 10, 25]
list1
[34, 10, 25]
list2 = ["chen", "zhang", "wang"]
list2
['chen', 'zhang', 'wang']
list3 = [10, "wang", 33]
list3
[10, 'wang', 33]

与字符串的索引一样,列表索引从 0 开始,第一个值的索引是位置 0,第二个索引是 1,依此类推。

list1[0]  # list1 的第 1 个元素
34
list2[1]  # list2 的第 2 个元素
'zhang'
list1[0:2]  # “左闭右开”原则,list1 第 1 到第 2 个元素
[34, 10]
list1[0:]  # list1 第 1 到之后的所有元素
[34, 10, 25]
list3 = [4, 7, 8, 9]
list3[1:3:2]  # list 从第 2 到第 4,步长为 2的所有元素
[7]

另外,Python 支持倒序索引,-1 表示倒数第 1 个元素,-2 表示倒数第 2 个元素,依次类推。

list1[-1]  # list1 的倒数第 1 个元素
25
list2[-2]  # list2 的倒数第 2 个元素
'zhang'
list1[::-1]  # 两个冒号跟上 -1 表示倒序
[25, 10, 34]

更改列表某个位置的元素,可以直接用索引更改。

list = [21, 16, 30]
list[1] = 10  # 将 list 第 2 个元素更改为 10
list
[21, 10, 30]

删除列表某个索引的元素,用del

list = [34, 46, 23]
del list[1]
list
[34, 23]

对于列表类型,运算符 + 、*、in、not in 的功能与字符串中的功能相同。下面举例说明:

list = [13, 23]
list = list + [21, 65]
list
[13, 23, 21, 65]
list * 2
[13, 23, 21, 65, 13, 23, 21, 65]
12 in list
False
12 not in list
True

二维列表,用中括号套起多个一维列表生成:

a = [[1, 2, 3], [4, 5]]
a
[[1, 2, 3], [4, 5]]

访问二维列表时,用两个中括号分别跟上索引:

a[1][0]
4

常见的列表函数还有insertappendextend

list = [34, 46, 23]
list.append(3)  # 在列表末尾添加一个元素
list
[34, 46, 23, 3]
list.insert(1, 10)  # 在列表第二个位置添加一个元素 10
list
[34, 10, 46, 23, 3]
list.extend([4, 5, 6])  # 将另一个列表(元组类型也可以)添加到该列表末尾
list
[34, 10, 46, 23, 3, 4, 5, 6]

列表的其他函数还有:

max(list) 返回列表 list 中的最大值元素
min(list) 返回列表 list 中的最小值元素
list(seq) 将其他序列类型转化为列表
len(list) 返回列表 list 的长度
list.count(obj) 统计某个元素 obj 在列表中出现的次数
list.reverse() 将列表反转
list.pop(index) 移除列表中 index 位置的元素
list.remove(element) 移除列表中内容为 element 的元素
list.clear() 清空列表

a = [1, 2, 3]
a.pop(-1)
print(a)
[1, 2]

2.4. 字典类型#


字典是另一种可变容器模型,字典的格式为{key : value},整个字典包括在花括号{ }中。键(key)必须是唯一且不可变,但值(value)可以取任何数据类型,也可以改变,key,value 之间用冒号分割。

dict = {"name": "chen", "score": 95}
dict
{'name': 'chen', 'score': 95}

访问字典里的值时,则把相应的键放入到方括号[ ]中:

dict["name"]
'chen'
dict["score"]
95

向字典增加一项,可以直接用方括号[ ]增加元素:

dict["major"] = "economy"
dict
{'name': 'chen', 'score': 95, 'major': 'economy'}

修改字典里的值时,则把相应的键放入到方括号中,赋值进行修改即可:

dict["name"] = "wang"
dict["mark"] = 80
dict
{'name': 'wang', 'score': 95, 'major': 'economy', 'mark': 80}

删除字典里的某个键值时,用 del:

del dict["name"]
dict
{'score': 95, 'major': 'economy', 'mark': 80}

注意:键必须不可变,所以可以用数字,字符串或元组充当,但用列表就不行。字典类型数据的常用函数还有:

len(dict) 返回字典 dict 中的元素个数,即键或值的个数
clear() 删除字典 dict 中的所有元素
get(key, default=None) 返回指定键的值,如果键不在字典中返回 default 设置的默认值
values() 返回一个迭代器,可以使用 list() 来转换为列表
keys() 返回一个迭代器,可以使用 list() 来转换为列表
popitem() 删除字典的最后一项,并返回这个删除的项

与列表、字符串或者元组类型一样,字典可以通过for-in语句对其元素进行遍历,返回的是字典的 key。

for i in dict:
    print(i)
score
major
mark

若要输出 value,则可以用get函数或者用方括号[ ]里面跟 key。

for i in dict:
    print(dict[i])
95
economy
80

2.5. 元祖类型#


Python 的元组(tuple)与列表类似,不同之处在于元组的元素不能修改。元组使用小括号创建,并使用逗号隔开。访问列表元素或者截取部分元组与列表非常类似:

tup = (13, "zh", 20)
tup[1]
'zh'
tup[0:2]
(13, 'zh')
tup[0:]
(13, 'zh', 20)

元组中的元素不能修改,但可以用 del 删除整个元组, 也可以用运算符 +、*、in、not in:

tup = (13, "zh", 20)
del tup  # 完全删除 tup
tup = (23, 45, 21)
tup = tup + (32, 21)
tup
(23, 45, 21, 32, 21)
tup * 2
(23, 45, 21, 32, 21, 23, 45, 21, 32, 21)
25 in tup
False
25 not in tup
True
max(tup) 返回元组 tup 中的最大值元素
min(tup) 返回元组 tup 中的最小值元素
tuple(seq) 将列表转化为元组
len(tup) 返回元组 tup 的长度,即元素个数
tup.count(obj) 统计某个元素在元组 tup 中出现的次数

2.6. 集合类型#


集合(set)是一个无序的不重复元素序列,一般使用大括号 { } 创建。注意:创建一个空集合必须用 set() 而不是 { },因为 { } 默认创建一个空字典)。

set1 = {34, 23, "chen"}
set1
{23, 34, 'chen'}
set2 = {12, "34", 10}
set2
{10, 12, '34'}

集合间的常用运算符包括:

- 删除左边集合包含,而右边集合不包含的元素
| 两个集合的并集
& 两个集合的交集
^ 不同时包含于两个集合中的元素
set1 = {34, 12, "chen"}
set2 = {12, "wang", 10}
set1 - set2
{34, 'chen'}
set1 | set2
{10, 12, 34, 'chen', 'wang'}
set1 & set2
{12}
set1 ^ set2
{10, 34, 'chen', 'wang'}

在集合中添加元素可以用add函数,添加多个元素(可以是列表、元组或字典)用update函数,删除某个元素用remove函数, 判断某个元素是否在集合中,用innot in

set = {13, 45, 67}
set.add(10)
set
{10, 13, 45, 67}
set.remove(10)
set
{13, 45, 67}
set.update([80, 44])
set
{13, 44, 45, 67, 80}
44 in set
True
44 not in set
False
len(set) 返回集合 set 中的元素个数
set.add() 向集合 set 中添加一个元素
set.remove() 集合中移除一个元素
set.update(seq) 添加多个元素,可以是列表、元组或字典
set1.issubset(set2) 判断集合 set1 是否为另一个集合 set2 的子集
set1.issuperset(set2) 判断集合 set1 是否为另一个集合 set2 的父集
set1.isdisjoint(set2) 判断两个集合是否包含相同的元素,如果没有返回 True
set1.union(set2) 返回两个集合的并集

2.7. 布尔类型#


Python 中的布尔值(Bool) 一般通过逻辑判断产生,只有两个可能的结果:TrueFalse

10 > 3
True
3 == 4
False

在做逻辑判断时,两个等号==表示是否相等,若仅有一个等号,则表示赋值。

a = 3  # 一个等号表示将 a 赋值为 3
a == 4  # 两个等号表示判断 a 是否等于 4
False

对多个逻辑判断的运算,即 “且”,”或”,“非”, python 分别提供了and, or, not

10 > 3 and 3 > 2
True
10 > 3 and 3 > 4
False
10 > 3 or 3 > 4
True
not 3 > 4
True

2.8. random 模块#


随机数在编程中应用比较普遍,Python 内置的random模块可以生成常见的伪随机数(计算机生成的随机数都是伪随机数,真随机数是不能人为产生的)。

random中的常用函数:

函数

含义

seed(a=None)

初始化随机数种子,默认值为当前系统时间

random()

生成一个 [0.0, 1.0] 之间的小数

randint(a, b)

生成一个 [a, b] 之间的随机整数

uniform(a, b)

生成一个 [a, b] 之间的随机小数

shuffle(seq)

将序列类型中的元素打乱,返回打乱后的序列

sample(pop, k)

从 pop 中随机选取 k 个元素,以列表形式返回

随机数的种子可以通过函数seed指定,只要种子相同,每次生成的随机数也相同。

import random

random.random()  # 没有设置种子,每次运行显示的随机数不一样
0.9454675250618233
random.seed(100)
random.random()  # 设置了种子,每次运行显示的随机数相同
0.1456692551041303

2.9. 练习#


Exercise 2.1

定义一个 Python 数据变量,下面表达式正确的是:

A.   int a = 5

B.   var a = 5

C.   a = 5

D.   $a = 5

Exercise 2.2

请将下面的数学表达式用 Python 程序写出来,并运算结果。

  • \(x=\frac{3^2+4-5*6}{5}\)

  • \(y= (4^{3.5}+6)*(16\mod{4})\)

Exercise 2.3

根据给定的半径值,计算圆的面积

Exercise 2.4

从字符串 ‘abcedefg’ 随机挑取 3 个字符。(提示,使用 random 库中的函数)

Exercise 2.5

通过用户输入数字 a, b, c,计算二次方程: \(ax^2 + bx +c\)。 (提示:cmath 工具包可以计算负数的开方)

Exercise 2.6

通过用户输入三角形三边长度,并计算三角形的面积。

Exercise 2.7

定义一个字典,然后计算它们所有数字值的和。。