基本数据类型

基本数据类型

2.1 数字类型
2.1.1 整数类型
Python 中的整数类型与数学中的整数概念相对应。整数类型没有大小的限制。

在 Python 中整数可以使用四种进制表示。不做任何标识即为十进制数据,如:1010,-345。如果以 0B 或 0b 开头表示二进制数据:如 0B101110,-0b11100。八进制数据以 0O 或 0o 开头,如 0O345,-0o233。十六进制数据以 0X 或 0x 开头,如 0X56E,0Xbc2。不同进制的整数之间可以直接运算。

2.1.2 浮点数类型
浮点数类型与数学中的实数概念一致,它是指带有小数点的数字,小数部分可以是 0。与整数类型不同,浮点数类型在 Python 中有大小及精度限制。但对于高精度科学计算以外的*大部分运算来说,浮点数类型的数值范围和小数精度都足够 “可靠”。

浮点数有 2 种表示方法:十进制形式的一般表示和科学计数法表示。除十进制外,浮点数没有其他进制表示形式。科学计数法使用字母 e 或者 E 作为幂的符号,以 10 为基数。含义如下:<a>e<b> = a×10b。如 1.01e3 值为 1010.0,1.01E-3 值为 0.00101。

浮点数在计算机内部编码是存在误差的,对很多浮点数来说计算机只能使用二进制编码无限趋近于该数据。因此在进行浮点数计算时可能会存在 “不确定尾数” 问题。

>>> 0.1 + 0.2
0.30000000000000004
>>> 0.1 + 0.2 == 0.3
False

如果想解决这个问题,可以使用 round(x, d) 函数,它可以实现对小数进行四舍五入。参数 x 是被执行四舍五入的小数,参数 d 用来确定保留的小数位数。

>>> round(0.1 + 0.2, 1) == 0.3
True

不确定尾数问题通常发生在 10-16 的位置,也就是在一个十进制数的小数点后 16 位通常才会出现此问题。在进行浮点数的运算和比较时,round() 函数有时将十分有用。

2.1.3 复数类型
复数类型对应于数学中的复数。在众多编程语言中,Python 对其提供了很好的支持。

Python 语言中,复数可以看作是二元有序实数对 (a, b),表示为:a+bj,其中,a 是实部,b 是虚部。虚数部分通过后缀 j 或者 J 来表示。需要注意,当 b 为 1 时,1 不能省略,因为 1j 表示复数,而 j 则表示 Python 程序中的一个变量。

下面是在 Python 中表示复数的一些例子:

>>> 34+2.5j
(34+2.5j)
>>> 2e-5+3.2j
(2e-05+3.2j)

如果想获取一个复数 z 的实部和虚部,可以使用 z.real 和 z.imag,Python 将以浮点数的形式返回复数的实部或虚部。

>>> (1.23e4+5.67e4j).real
12300.0
>>> (1.23e4+5.67e4j).imag
56700.0
>>> 1.23e4 + 5.67e4j.imag
69000.0

2.1.4 在数中使用下划线
书写很大的数时,可以使用下划线将其中的数字分组,使其更清晰易读:

>>> unverse_age = 140_0000_0000
14000000000

当打印使用下划线定义的数时,Python 不会打印其中的下划线。此外,将数字分组时,不管是将几位分成一组,都不会影响*终的值。在 Python 看来,1000 和 1_000、10_00 没什么不同。这种表示方法适用于整数和浮点数,但只有 Python 3.6 和更高的版本支持。

2.2 数字类型的运算
2.2.1 数值运算操作符
Python 中的运算操作符有:+、-、*、/、//、%、**。

+、-、*、/ 分别用来进行加、减、乘、除运算,其中 +、- 也可以用来表示正负号。除法运算的结果总是以浮点数形式给出,即便这两个数都是整数且能整除。例如 10 / 2 的结果是 5.0,而不是 5。

// 用来进行整数除运算,该运算将给出除法运算结果的整数部分,但不会进行四舍五入,而是直接给出整数部分。

% 用于取余运算,如 10 % 3 的结果是 1,2 % 5 的结果是 2。

** 用于幂运算,如 3 ** 2 的结果是 9,3 ** 0.5 则相当于是在计算根号 3。

以上的二元操作符还有与之对应的增强型赋值操作符,包括:+=、-=、*=、/=、//=、%=、**=。

在 Python 中允许不同类型的数据同时运算,运算过程会自动进行类型扩展。具体的扩展原则是:整数和浮点数混合运算,运算结果是浮点数;整数之间运算,产生结果类型与操作符相关,/ 运算的结果一定是浮点数;整数或浮点数与复数运算,运算结果是复数。

>>> 1010 / 10
101.0
>>> 1010.0 // 3
336.0
>>> 1010.0 % 3
2.0
>>> 10 – 1 + 1j
(9+2j)

2.2.2 数值运算函数
除了使用操作符,还可以使用数值运算函数来完成指定计算。

abs(x):返回 x 的*对值,如果 x 是复数,则返回复数的模。
divmod(x, y):同时获得商和余数,并以元组的形式返回运算结果。
pow(x, y[, z]):先计算 x 的 y 次幂然后模以 z,并返回*终的运算结果。如果没有参数 z 的话便只进行幂运算,和 ** 运算符的效果一样。
round(x[, d]):按四舍五入规则保留指定的小数位数。如果不加入参数 d 的话便只保留整数位。
max(x1, x2, … xn):返回数字序列中的*大值。
min(x1, x2, … xn):返回数字序列中的*小值。

2.3 字符串的格式化
2.3.1 format() 方法的基本使用
format() 方法用于解决字符串和变量同时输出时的格式安排问题,其基本使用格式是:

<模板字符串>.format(<逗号分隔的参数>)

其中,模板字符串是一个由字符串和槽组成的字符串,用来控制字符串和变量的显示效果。槽用大括号 {} 表示,对应 format() 方法中逗号分隔的参数。

>>> “{} 曰:学而时习之,不亦说乎。”.format(“孔子”)
‘孔子曰:学而时习之,不亦说乎。’

如果模板字符串有多个槽,且槽内没有指定序号,则按照槽出现的顺序分别对应 format() 方法中的不同参数。

>>> “{} 曰:学而时习之,不亦 {}。”.format(“孔子”, “说乎”)
‘孔子曰:学而时习之,不亦说乎。’

也可以通过 format() 参数的顺序在模板字符串槽中指定序号,序号从 0 开始编号。

>>> “{1} 曰:学而时习之,不亦 {0}。”.format(“说乎”, “孔子”)
‘孔子曰:学而时习之,不亦说乎。’

如果需要打印花括号 {} 本身,则应该使用双重花括号 {{}}进行转义,这样解释器才不会将其和作为槽位使用的花括号混淆。

>>> “{1} 曰:{{学而时习之,不亦 {0}}}。”.format(“说乎”, “孔子”)
‘孔子曰:{学而时习之,不亦说乎}。’

2.3.2 format() 方法的格式控制
format() 方法中模板字符串的槽除了包括参数序号,还可以包括格式控制信息:{<参数序号>:<格式控制标记>}。

其中,冒号为引导符号,<格式控制标记> 用来控制参数显示时的格式。<格式控制标记> 包括:<填充><对齐><宽度>,<.精度><类型> 6 个字段,这些字段都是可选的,可以组合使用。

<填充>、<对齐>和 <宽度> 主要用于对显示格式的规范。<填充> 指明了用于填充的单个字符,默认以空格字符填充。对齐字段分别使用 <、> 和 ^ 三个符号表示左对齐、右对齐和居中对齐。如果不指定对齐方式的话,数字将采用右对齐,字符串则采用左对齐。宽度指当前槽设定的输出字符宽度,如果该槽参数的实际值比宽度设定值大,则使用参数实际长度。如果该值的实际位数小于指定宽度,则按照指定的对奇方式在宽度内对齐。

>>> s = “天道酬勤”
>>> “{:25}”.format(s)
‘天道酬勤 ‘
>>> “{:^25}”.format(s)
‘ 天道酬勤 ‘
>>> “{:>25}”.format(s)
‘ 天道酬勤’
>>> “{:*^25}”.format(s)
‘**********天道酬勤***********’
>>> “{:+^25}”.format(s)
‘++++++++++天道酬勤+++++++++++’
>>> “{:^1}”.format(s)
‘天道酬勤’

剩下的三个字段 ,<.精度><类型> 用于对数值本身的规范。逗号 , 为数字的千位分隔符,适用于整数和浮点数。<.精度> 由小数点 . 开头。对于浮点数,精度表示小数部分输出的有效位数。对于字符串,精度表示输出的*大长度。小数点可以理解为对数值的有效截断。

>>> “{:,}”.format(1234567)
1,234,567
>>> “{:.2f}”.format(12345.67890)
‘12345.68’
>>> “{:>25.3f}”.format(12345.67890)
‘ 12345.679’
>>> “{:.5}”.format(“逝者如斯夫,而未尝往矣。”)
‘逝者如斯夫’

<类型> 表示输出整数和浮点数类型的格式规则。对于整数类型,输出格式包括 6 种:b 表示输出整数的二进制方式;c 表示输出整数对应的 Unicode 字符;d 表示输出整数的十进制方式;o 表示输出整数的八进制方式;x 表示输出整数的小写十六进制方式;X 表示输出整数的大写十六进制方式。

>>> “{0:b},{0:c},{0:d},{0:o},{0:x},{0:X}”.format(425)
‘110101001,Ʃ,425,651,1a9,1A9’

对于浮点数类型,输出格式包括 4 种:e 表示输出浮点数对应的小写字母 e 的指数形式;E 表示输出浮点数对应的大写字母 E 的指数形式;f 表示输出浮点数的标准浮点形式;% 表示输出浮点数的百分形式。

>>> “{0:e},{0:E},{0:f},{0:%}”.format(3.14)
‘3.140000e+00,3.140000E+00,3.140000,314.000000%’
>>> “{0:.2e},{0:.2E},{0:.2f},{0:.2%}”.format(3.14)
‘3.14e+00,3.14E+00,3.14,314.00%’

2.3.3 f 字符串
Python 3.6 引入了 f 字符串,可以使用 f 或 F 替换 format() 函数。与 format() 方法相比,f 字符串的语法更加简洁明了。示例如下:

first_name = ‘ada’
last_name = ‘lovelace’
full_name = f'{first_name} {last_name}’
print(f’Hello, {full_name.title()}!’)
————————————————————————
Hello, Ada Lovelace!

2.3.4 字符串操作符
针对字符串,Python 提供了三个字符串操作符,分别是:+、*、in。

x + y 用于连接 x、y 两个字符串;x * n 或 n * x 将会复制 n 次字符串 x;x in s 将会判断 x 是否是 s 的字串,并返回对应的布尔值。

2.3.5 字符串处理函数
除了使用操作符来处理字符串,Python 也提供了一些字符串处理函数。

len(x):返回字符串 x 的长度,也可返回其他组合数据类型的元素个数。
str(x):返回任意类型 x 所对应的字符串形式。
chr(x):返回 Unicode 编码 x 对应的单字符。
ord(x):返回单字符 x 对应的 Unicode 编码。
bin(x):返回整数 x 对应的以“0b”为前缀的二进制字符串。
oct(x):返回整数 x 对应的以“0o”为前缀的八进制字符串。
hex(x):返回整数 x 对应的以“0x”为前缀的十六进制字符串。

2.3.6 字符串处理方法
方法也是一个函数,但调用方式不同。函数采用 func(x) 方式调用,而方法则采用 <a>.func(x) 形式调用。方法仅作用于前导对象 <a>。Python 提供了以下字符串处理方法。

str.lower():返回字符串 str 的副本,全部字符小写。
str.upper():返回字符串 str 的副本,全部字符大写。
str.title():返回字符串 str 的副本,每个单词的首字母大写。

str.split(sep):返回一个由字符串内单词组成的列表,使用 sep 作为分隔字符串,省略 sep 时以空格分隔。
>>> “Python is an excellent language.”.split()
[‘Python’, ‘is’, ‘an’, ‘excellent’, ‘language.’]
>>> “Python is an excellent language.”.split(‘a’)
[‘Python is’, ‘n excellent l’, ‘ngu’, ‘ge.’]
>>> “Python is an excellent language.”.split(‘an’)
[‘Python is ‘, ‘ excellent l’, ‘guage.’]

str.count(sub):返回 sub 子串出现的次数。
>>> “Python is an excellent language.”.count(‘a’)

str.replace(old, new):返回字符串 str 的副本,所有 old 子串被替换为 new,old 和 new 的长度可以不同。
>>> “Python is an excellent language.”.replace(‘a’, ‘#’)
‘Python is #n excellent l#ngu#ge.’
>>> “Python is an excellent language.”.replace(‘Python’, ‘C’)
‘C is an excellent language.’

str.center(width, fillchar):字符串居中函数,返回长度为 width 的字符串,str 处于新字符串中心位置,两侧新增字符采用单个字符 fillchar 填充。当 width 小于字符串长度时,返回 str。省略 fillchar 时以空格填充。
>>> “Python”.center(20, “=”)
‘=======Python=======’
>>> “Python”.center(2, “=”)
‘Python’

str.strip(chars):从字符串 str 中去掉在其左侧和右侧 chars 中列出的字符。chars 是一个字符串,其中列出的每个字符都会被去掉。如果省略 chars,将删除字符串开头和结尾的空白。空白泛指任何非打印字符,如空格、制表符和换行符。注意:该方法只能删除开头或是结尾的字符,不能删除中间部分的字符。
>>> “==Python==”.strip()
‘==Python==’
>>> “==Python==”.strip(‘=’)
‘Python’
>>> “==Python==”.strip(‘=n’)
‘Pytho’

与 strip() 方法类似,Python 还提供了 lstrip() 和 rstrip()。它们将分别从从字符串 str 中去掉在其左侧和右侧 chars 中列出的字符。

str.join(iter):将 str 字符串插入 iter 变量的元素之间,形成新的字符串副本。其中,iter 是一个具备迭代性质的变量。
>>> “”.join(‘PYTHON’)
‘P Y T H O N’
>>> “,”.join(‘12345’)
‘1,2,3,4,5’
>>> “,”.join([‘1’, ‘2’, ‘3’, ‘4’, ‘5’]) # 列表中的元素必须都是字符串类型
‘1,2,3,4,5’

上述的字符串方法执行后并不会改变原本的字符串,如果要使用处理后的字符串,可以将操作后的结果关联到新的变量。

2.4 类型判断与转换
2.4.1 类型判断
Python 语言提供 type(x) 函数对变量 x 进行类型判断,适用于任何数据类型。

>>> type(123)
<class ‘int’>
>>> type(1+2j)
<class ‘complex’>

2.4.2 类型转换
数值运算操作符可以隐式地转换输出结果的数字类型。例如,两个整数采用运算符 / 进行除法运算时输出的数字类型是浮点数。

此外,通过内置的数字类型转换函数可以显式地在数字类型之间进行转换。

int(x):将 x 转换为整数,x 可以是浮点数或整数字符串。在将浮点数转换成整数时,不会进行四舍五入,而是直接去除小数部分。
>>> int(34.7)
34
>>> int(‘123’)
123
>>> int(‘23.0’) # 错误的写法,字符串内的数字必须是整数
>>> int(float(‘23.0′)) # 正确的写法
23

float(x):将 x 转换为浮点数,x 可以是整数或字符串。
>>> float(89)
89.0
>>> float(’89’)
89.0

str(x):将 x 转换为等值的字符串类型。
>>> str(90)
’90’
>>> str(91.0)
‘91.0’
>>> str([1, 2, 3])
‘[1, 2, 3]’