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'
判断某个字符或某段字符串是否在字符串中,可以用in
或not 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
常见的列表函数还有insert
,append
,extend
:
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
函数, 判断某个元素是否在集合中,用in
或not 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) 一般通过逻辑判断产生,只有两个可能的结果:True
或False
。
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
Solution to Exercise 2.1
C
Exercise 2.2
请将下面的数学表达式用 Python 程序写出来,并运算结果。
\(x=\frac{3^2+4-5*6}{5}\)
\(y= (4^{3.5}+6)*(16\mod{4})\)
Solution to Exercise 2.2
x = (3**2 + 4 - 5 * 6) / 5
print("x = ", x)
y = (4**3.5 + 6) * (16 % 4)
print("y = ", y)
Exercise 2.3
根据给定的半径值,计算圆的面积
Solution to Exercise 2.3
import math
r = 10
area = math.pi * r**2
print("圆的面积为 %.6f" % area)
Exercise 2.4
从字符串 ‘abcedefg’ 随机挑取 3 个字符。(提示,使用 random 库中的函数)
Solution to Exercise 2.4
import random
random.sample('abcedefg', 3)
Exercise 2.5
通过用户输入数字 a, b, c,计算二次方程: \(ax^2 + bx +c\)。 (提示:cmath 工具包可以计算负数的开方)
Solution to Exercise 2.5
# 导入 cmath(复杂数学运算) 模块
import cmath
a = float(input("输入 a: "))
b = float(input("输入 b: "))
c = float(input("输入 c: "))
# 计算
d = (b**2) - (4 * a * c)
# 两种求解方式
sol1 = (-b - cmath.sqrt(d)) / (2 * a)
sol2 = (-b + cmath.sqrt(d)) / (2 * a)
print("结果为 {0} 和 {1}".format(sol1, sol2))
Exercise 2.6
通过用户输入三角形三边长度,并计算三角形的面积。
Solution to Exercise 2.6
# 导入 cmath(复杂数学运算) 模块
a = float(input("输入三角形第一边长: "))
b = float(input("输入三角形第二边长: "))
c = float(input("输入三角形第三边长: "))
# 计算半周长
s = (a + b + c) / 2
# 计算面积
area = (s * (s - a) * (s - b) * (s - c)) ** 0.5
print("三角形面积为 %0.2f" % area)
Exercise 2.7
定义一个字典,然后计算它们所有数字值的和。。
Solution to Exercise 2.7
def dictSum(myDict):
sum = 0
for i in myDict:
sum = sum + myDict[i]
return sum
dict = {'a': 100, 'b':200, 'c':300}
print("Sum :", returnSum(dict))