跳转至

三、Python 的基本数据类型

1、字符串

字符串英文 string ,是 python 中随处可见的数据类型,字符串的识别也非常的简单,就是用「引号」括起来的。

引号包括单引号 ' ' ,双引号 " " 和 三引号 ''' ''' ,比如 'abc'"123" 等等。

这里请注意,单引号 '' 或双引号 "" 本身只是一种表示方式,不是字符串的一部分,因此,字符串 'abc' 只有 a,b,c 这 3 个字符。

如果善于思考的你,一定会问?

为什么要有单引号 ' ' ,双引号 " " 和 三引号 ''' ''' 啊,直接定死一个不就好了,搞那么麻烦,那么多规则表达同一个东西干嘛?

对,一般来说一种语法只用一个规则来表示是最好的,竟然现在字符串有三种不同的表示,证明是有原因的。

那么我们先来看下这三种方式,来定义同样内容的字符串,再把它打印出来,看看是怎样的。

str1 = '两点水'
str2 = "两点水"
str3 = '''两点水'''
print(str1)
print(str2)
print(str3)

打印出来的结果是一样的。

两点水
两点水
两点水

那如果我们的字符串不是 水哥,是 两'点'水 这样呢?

这样就直接报错了。

str1 = '两''水'
print(str1)
  File "test.py", line 1
    str1 = '两'点'水'
                  ^
SyntaxError: invalid syntax

但是要注意,用单引号 ' ' 不行,用双引号 " " 是可以的。

str2 = "两'点'水"
print(str2)

打印的结果也跟预想的一样:

两'点'水

至于三引号,也是一样的,如果字符串内容里面含有双引号,也是会报同样的错误的。那么这时候你就可以用三引号了。

str3 = '''两点水说:"你好!"'''
print(str3)
两点水说:"你好!"

那么用单引号,双引号定义的字符串就不能表示这样的内容吗?

并不是的,你可以使用转义字符。

比如单引号,你可以使用 \' 来表示,双引号可以使用 \" 来表示。

注意,这里的是反斜杠 \, 不是斜杆 /

了解了之后,直接程序测试一下:

str1 = '两\'\'水'
str2 = "两点水说:\"你好!\""
print(str1)
print(str2)

运行结果如下:

两'点'水
两点水说:"你好!"

最后,也提一下, 三引号 ''' ''' 是直接可以分行的。

str2 = '''两

水'''
print(str2)

运行结果:

2、整数

整数英文为 integer 。代码中的整数跟我们平常认识的整数一样,包括正整数、负整数和零,是没有小数点的数字。

Python 可以处理任意大小的整数,例如:1100-80800,等等。

int1 = 1
int2 = 100
int3 = -8080
int4 = 0

print(int1)
print(int2)
print(int3)
print(int4)

运行结果:

1
100
-8080
0

当然,要注意了,如果数字你用引号括起来了,那就属于字符串,而不属于整数。比如 '100' , 这 100 是字符串,不是整数。

在现实世界中,整数我们通常会做计算,因此代码世界也是一样,整数可以直接加减乘除。

比如:

int1 = 1 + 2
int2 = 1 - 2
int3 = 1 * 2
int4 = 1 / 2

print(int1)
print(int2)
print(int3)
print(int4)

程序运行结果:

3
-1
2
0.5

这里提示下大家,看看上面的例子,有没有发现什么?

看下 int4 打印出来的结果,是 0.5 , 是一个小数。

而我们上面对整数的定义是什么?

是没有小数点的数字。

因此 int4 肯定不是整数。

这里我们可以使用 type() 函数来查看下类型。

int1 = 1 + 2
int2 = 1 - 2
int3 = 1 * 2
int4 = 1 / 2

print(int1)
print(int2)
print(int3)
print(int4)

print(type(int1))
print(type(int2))
print(type(int3))
print(type(int4))

结果如下:

3
-1
2
0.5
<class 'int'>
<class 'int'>
<class 'int'>
<class 'float'>

可以看到 int4 是 float 类型,而 int1 ,int2,int3 都是 int 整数类型。

那么 float 是什么类型呢?

float 是浮点数类型,是我们下面会说到的。

在说浮点数之前,各位可以看下 Python 的算术运算符有哪些,有个印象。

Python 算术运算符

运算符 表示 例子
+ 2 + 1 输出结果 3
- 1 - 2 输出结果 -1
* 1 * 2 输出结果 2
/ 1 / 2 输出结果 0.5
% 取模——返回除法的余数 5 % 2 输出结果 1
** 幂——返回 x 的 y 次幂 2 ** 3 为 2 的 3 次方
// 取整除——返回商的整数部分 11 // 2 输出结果 511.0 // 2.0 输出结果 5.0

3、浮点数

浮点数的英文名是 float ,是指带小数的数字。

浮点数跟整数有很多类似的地方,但是浮点数是最折磨人的,也是最难让人捉摸透的。

就好比世界级的大佬 Herb Sutter 说的:「世上的人可以分为3类:一种是知道自己不懂浮点运算的;一种是以为自己懂浮点运算的;最后一种是极少的专家级人物,他们想知道自己是否有可能,最终完全理解浮点运算。」

为什么这么说呢?

看下面的例子 ,像整数一样,只是基本的浮点数加法运算。

print(0.55+0.41)
print(0.55+0.4)
print(0.55+0.411)

可是运算结果,对于初学者来说,可能会接受不了。

0.96
0.9500000000000001
0.9610000000000001

对于第一个还好,0.55+0.41 等于 0.96 ,运算结果完全一致。可是后面两个,你会发现怎么出现了那么多个零。

这是因为计算机对浮点数的表达本身是不精确的。保存在计算机中的是二进制数,二进制对有些数字不能准确表达,只能非常接近这个数。

所以我们在对浮点数做运算和比较大小的时候要小心。

4、布尔值

布尔值和布尔代数的表示完全一致,一个布尔值只有 TrueFalse两种值,要么是 True,要么是 False,在 Python 中,可以直接用 True、False 表示布尔值(请注意大小写),也可以通过布尔运算计算出来。

布尔值可以用 andornot 运算。

and 运算是与运算,只有所有都为 True,and 运算结果才是 True。

or 运算是或运算,只要其中有一个为 True,or 运算结果就是 True。

not 运算是非运算,它是一个单目运算符,把 True 变成 False,False 变成 True。

5、空值

基本上每种编程语言都有自己的特殊值——空值,在 Python 中,用 None 来表示

6、 Python 3.12+ 的 f-string 进阶

各位童鞋,前面咱们已经在代码里看到过 f'昵称:{name}' 这种写法,叫做 f-string(Python 3.6+ 引入),是目前最推荐的字符串拼接方式。这里再补几个不少人没注意到的进阶用法。

(1) self-documenting:调试的神器 f"{x=}"

写代码的时候,是不是经常想 print 出某个变量的「名字 + 值」来调试?

旧写法是这样:

name = '两点水'
age = 18

print(f'name={name}, age={age}')

输出的结果:

name=两点水, age=18

变量名要自己写两遍,一改名就容易漏。从 Python 3.8 开始,f-string 提供了一个 = 语法(self-documenting expressions),可以一步到位:

name = '两点水'
age = 18

print(f'{name=}, {age=}')

输出的结果:

name='两点水', age=18

是不是发现,「变量名」和「等号」都是它自动加的,而且字符串还自动加了引号,调试的时候简直不要太爽。这个语法虽然 Python 3.8 就有了,但是相当多童鞋到现在都不知道,错过了血亏。

它甚至能直接放表达式:

a = 3
b = 4

print(f'{a + b = }')

输出的结果:

a + b = 7

注意 = 两边的空格会被原样保留,所以你想要美观的输出,自己控制空格就行。

(2)格式说明:对齐、保留小数、千分位

f-string 的大括号里,冒号 : 后面可以跟「格式说明」,控制输出的样子。

保留 2 位小数:

pi = 3.1415926

print(f'{pi:.2f}')

输出的结果:

3.14

右对齐、占 10 个字符宽:

name = '两点水'

print(f'[{name:>10}]')

输出的结果(中间是空格):

[       两点水]

> 是右对齐, < 是左对齐, ^ 是居中。

数字加千分位逗号:

amount = 1234567890

print(f'订单金额:{amount:,} 元')

输出的结果:

订单金额:1,234,567,890 元

百分号格式:

rate = 0.875

print(f'转化率:{rate:.1%}')

输出的结果:

转化率:87.5%

是不是发现,原本要 round 、要 format 、要字符串拼接的活,一个 f-string 全搞定。

(3) Python 3.12+ :嵌套引号不再受限

最后再说一个 Python 3.12 的新特性(PEP 701)。在 3.12 之前,f-string 里有一个比较烦人的限制:大括号里如果要写字符串,引号不能跟外层的引号一样。

比如下面这种写法,在 3.11 及之前是 错的

data = {'name': '两点水', 'age': 18}

# Python 3.12+ 才允许:内外都用单引号
print(f'昵称是 {data['name']}')

输出的结果:

昵称是 两点水

在老版本里写这种代码会直接报 SyntaxError,逼得你要么把外层换成双引号、要么用一个临时变量过渡。从 3.12 开始彻底放开了,外层引号和大括号里的引号可以随意搭配,这一点对写复杂模板特别友好。

3.12 还顺手放开了「f-string 里可以写多行表达式、可以写注释、反斜杠也能用」等限制。各位以后用 3.12+ 的时候,f-string 里基本想怎么写就怎么写,不再有那么多奇怪的禁忌。