博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《Python从小白到大牛》第6章 数据类型
阅读量:6341 次
发布时间:2019-06-22

本文共 9216 字,大约阅读时间需要 30 分钟。

在声明变量时会用到数据类型,在前面已经用到一些数据类型,例如整数和字符串等。在Python中所有的数据类型都是类,每一个变量都是类的“实例”。没有基本数据类型的概念,所以整数、浮点和字符串也都是类。

Python有6种标准数据类型:数字、字符串、列表、元组、集合和字典,列表、元组、集合和字典可以保存多项数据,他们每一个都是一种数据结构,本书中把他们统称为“数据结构”类型。

本章先介绍数字和字符串,列表、元组、集合和字典数据类型后面章节会详细介绍。

数字类型

Python数字类型有4种:整数类型、浮点类型、复数类型和布尔类型。需要注意的是布尔类型也是数字类型,它事实上是整数类型的一种。

整数类型

Python整数类型为int,整数类型的范围可以很大,可以表示很大的整数,这只受所在计算机硬件的限制。

给Python 2的提示 Python

3不再区分整数和长整数,只要你需要所有的整数都可以是长整数。

默认情况下一个整数值,例如16表示的十进制整数。那么其他进制,如二进制数、八进制数和十六进制整数表示方式如下:

  • 二进制数:以 0b 或0B为前缀,注意0是阿拉伯数字,不要误认为是英文字母o。

  • 八进制数,以0o或0O为前缀,第一个字符是阿拉伯数字0,第二个字符是英文字母o或O。

  • 十六进制数:以 0x或0X为前缀,注意0是阿拉伯数字。

例如整数值28、0b11100、0B11100、0o34、0O34、0x1C和0X1C都同一个数字。在Python

Shell输出结果如下:

>>> 2828>>> 0b1110028>>> 0O3428>>> 0o3428>>> 0x1C28>>> 0X1C28

浮点类型

浮点类型主要用来储存小数数值,Python浮点类型为float,Python只支持双精度浮点类型,而且是与本机相关。

浮点类型可以使用小数表示,也可以使用科学计数法表示,科学计数法中会使用大写或小写的e表示10的指数,如e2表示102。

在Python Shell中运行示例如下:

>>> 1.01.0>>> 0.00.0>>> 3.36e2336.0>>> 1.56e-20.0156

其中3.36e2表示的是3.36×102,1.56e-2表示的是1.56×10-2。

复数类型

复数在数学中是非常重要的概念,无论是理论物理学,还是电气工程实践中都经常使用。但是很多计算机语言都不支持复数,而Python是支持复数的,这使得Python能够很好地用来进行科学计算。

Python中复数类型为complex,例如1+2j表示的是实部1,虚部2的复数。在Python

Shell中运行示例如下:

>>> 1+2j(1+2j)>>> (1+2j) + (1+2j)(2+4j)

上述代码实现了两个复数(1+2j)的相加。

布尔类型

Python中布尔类型为bool,bool是int的子类,它只有两个值:True和False。

注意

任何类型数据都可以通过bool()函数转换为布尔值,那些被认为“没有的”、“空的”值会转换为False,反之转换为True。如None(空对象)、False、0、0.0、0j(复数)、''(空字符串)、[](空列表)、()(空元组)和{}(空字典)这些数值会转换为False,否则是True。

示例如下:

>>> bool(0)False>>> bool(2)     True>>> bool(1)True>>> bool('')False>>> bool('  ')True>>> bool([])False>>> bool({})False

上述代码中bool(2)和bool(1)表达式输出的True,这说明2和1都能转换为Ture,在整数中只有0是转换为False的,其他类型亦是如此。

数字类型相互转换

学习了前面的数据类型后,大家会思考一个问题,数据类型之间是否可以转换呢?Python通过了一些函数可以实现不同数据类型之间的转换。如:数字类型之间互相转换以及整数与字符串之间的转换。本节先讨论数字类型的互相转换。

除复数外,其他的三种数字类型整数、浮点和布尔都可以互相进行转换,转换分为隐式类型转换和显式类型转换。

隐式类型转换

多个数字类型数据之间可以进行数学计算,由于参与进行计算的数字类型可能不同,此时会发生隐式类型转换。计算过程中隐式类型转换规则如表6-1所示。

表 6‑1隐式类型转换规则

操作数1类型 操作数2类型 转换后的类型
布尔 整数 整数
布尔、整数 浮点 浮点

布尔数值可以隐式转换为整数类型,布尔值True转换为整数1,布尔值False转换整数0。在Python

Shell中运行示例如下:

>>> a = 1 + True>>> print(a)2>>> a = 1.0 + 1>>> type(a)         ①
>>> print(a)2.0>>> a = 1.0 + True>>> print(a)2.0>>> a = 1.0 + 1 + False>>> print(a)2.0

从上述代码表达式的运算结果类型,可知表6-1所示的类型转换规则,这里不再赘述。另外,上述代码第①行使用了type()函数,

type()函数可以返回传入数据的类型,\<class 'float'\>说明是浮点类型。

显式类型转换

在不能进行隐式转换情况下,则可以使用转换函数进行显式转换了。除复数外,三种数字类型整数、浮点和布尔都有自己的转换函数,分别是int()、float()和bool()函数,bool()函数在6.1.4节已经介绍过了,这里不再赘述。

int()函数可以将布尔、浮点和字符串转换为整数。布尔数值True使用int()函数返回1,False使用int()函数返回0;浮点数值使用int()函数会截掉小数部分。int()函数转换字符串会在下一节再介绍。

float()函数可以将布尔、整数和字符串转换为浮点。布尔数值True使用float()函数返回1.0,False使用float()函数返回0.0;整数值使用float()函数会加上小数部分(.0)。float()函数转换字符串会在下一节再介绍。

在Python Shell中运行示例如下:

>>> int(False)0>>> int(True)1>>> int(19.6)19>>> float(5)5.0>>> float(False)0.0>>> float(True)1.0

字符串类型

由字符组成的一串字符序列,称为“字符串”,字符串是有顺序的,从左到右,索引从0开始依次递增。Python中字符串类型是str。

字符串表示方式

Python中字符串表示方式三种:

  • 普通字符串。采用单引号(')或双引号(")包裹起来的字符串。

  • 原始字符串(raw

    string)。在普通字符串前加r,字符串中的特殊字符不需要转义,按照字符串的本来“面目”呈现。

  • 长字符串。字符串中包含了换行缩进等排版字符,可以使用三重单引号(''')或三重双引号(""")包裹起来,这就是长字符串。
  1. 普通字符串

很多程序员习惯于使用单引号(')表示字符串。下面示例表示的都是Hello World字符串:

'Hello World'"Hello World"'\u0048\u0065\u006c\u006c\u006f\u0020\u0057\u006f\u0072\u006c\u0064'    ①"\u0048\u0065\u006c\u006c\u006f\u0020\u0057\u006f\u0072\u006c\u0064"    ②

Python中的字符采用Unicode编码,所以字符串可以包含中文等亚洲字符。代码第①行和第②行的字符串是用Unicode编码表示的字符串,事实上它表示的也是Hello

World字符串,可通过print函数将Unicode编码表示的字符串输出到控制台,则会看到Hello
World字符串。在Python Shell中运行示例如下:

>>> s = 'Hello World'>>> print(s)Hello World>>> s = "Hello World">>> print(s)Hello World>>> s = '\u0048\u0065\u006c\u006c\u006f\u0020\u0057\u006f\u0072\u006c\u0064'>>> print(s)Hello World>>> s = "\u0048\u0065\u006c\u006c\u006f\u0020\u0057\u006f\u0072\u006c\u0064">>> print(s)Hello World

如果想在字符串中包含一些特殊的字符,例如换行符、制表符等在普通字符串中则需要转义,前面要加上反斜杠(\),这称为字符转义。表6-2所示是常用的几个转义符。

表 6‑2 转义符

字符表示 Unicode编码 说  明
\t \u0009 水平制表符
\n \u000a 换行
\r \u000d 回车
\" \u0022 双引号
\' \u0027 单引号
\\ \u005c 反斜线

在Python Shell中运行示例如下:

>>> s = 'Hello\n World'>>> print(s)Hello World>>> s = 'Hello\t World'>>> print(s)Hello    World>>> s = 'Hello\' World'>>> print(s)Hello' World>>> s = "Hello' World"  ①>>> print(s)Hello' World>>> s = 'Hello" World'      ②>>> print(s)Hello" World>>> s = 'Hello\\ World' ③>>> print(s)Hello\ World>>> s = 'Hello\u005c World' ④>>> print(s)Hello\ World

对于字符串中的单引号(')和双引号(")也可以不要转义符,在包含单引号的字符串中使用双引号包裹字符串,见代码第①行;在包含双引号的字符串中使用单引号包裹字符串,见代码第②行。另外,可以在使用Unicode编码替代需要转义的特殊字符,代码第④行与代码第③是等价的。

  1. 原始字符串(raw string)

在普通字符串前面加字母r,表示字符串是原始字符串,原始字符串是直接按照字符串的字面意思来使用,没有转义字符。在Python

Shell中运行示例代码如下:

>>> s = 'Hello\tWorld'  ①>>> print(s)Hello   World>>> s = r'Hello\tWorld'  ②>>> print(s)Hello\tWorld

代码第①是普通字符串,代码第②是原始字符串,他们的区别只是在字符串前面加字母r。从输出结果可见,原始字符串中的\t没有被当成制表符使用。

  1. 长字符串

字符串中包含了换行缩进等排版字符,则可以使用长字符串。在Python

Shell中运行示例代码如下:

>>> s  ='''Hello World'''>>> print(s)Hello World>>> s = """ Hello \t            ①        World""">>> print(s) Hello          World

在长字符串中如果包含特殊字符,也需要转义的,见代码第①行。

字符串格式化

在实际的编程过程中,经常会遇到将其他类型变量与字符串拼接到一起,并进行格式化输出。例如计算的金额需要保留小数点后四为、数字需要右对齐等,这些都需要格式化。

在字符串格式化时可以使用字符串的format()方法,以及占位符。在Python

Shell中运行示例如下:

>>> name = 'Mary'>>> age = 18>>> s = '她的年龄是{0}岁。'.format(age)        ①>>> print(s)她的年龄是18岁。>>> s = '{0}芳龄是{1}岁。'.format(name, age) ②>>> print(s)Mary芳龄是18岁。>>> s = '{1}芳龄是{0}岁。'.format(age, name) ③>>> print(s)Mary芳龄是18岁。>>> s = '{n}芳龄是{a}岁。'.format(n=name,  a=age)    ④>>> print(s)Mary芳龄是18岁。

字符串中可以有占位符({}表示的内容),配合format()方法使用,会将format()方法中的参数替换占位符内容。占位符可以用参数索引表示,见代码第①行、第②行和第③行,也可以使用参数的名字表示占位符,见代码第④行,n和a都是参数名字。

占位符中还可以有格式化控制符,对字符串的格式进行更加精准控制。不同的数据类型在进行格式化时需要不同的控制符,这些格式化控制符如表6-3所示。

表 6‑3字符串格式化控制符

控制符 说  明
s 字符串格式化
d 十进制整数
f、F 十进制浮点数
g、G 十进制整数或浮点数
e、E 科学计算法表示浮点数
o 八进制整数,符号是小英文字母o
x、X 十六进制整数,x是小写表示,X是大写表示

格式控制符是位于占位符索引或占位符名字的后面,之间用冒号分隔,例如{1:d}表示索引为1的占位符格式参数是十进制整数。在Python

Shell中运行示例如下:

>>> name = 'Mary'>>> age = 18>>> money = 1234.5678>>> "{0}芳龄是{1:d}岁。".format(name, age)   ①       'Mary芳龄是18岁。'>>> "{1}芳龄是{0:5d}岁。".format(age, name)  ②'Mary芳龄是   18岁。'>>> "{0}今天收入是{1:f}元。".format(name, money)       ③'Mary今天收入是1234.567800元。'>>> "{0}今天收入是{1:.2f}元。".format(name, money)     ④'Mary今天收入是1234.57元。'>>> "{0}今天收入是{1:10.2f}元。".format(name, money)   ⑤'Mary今天收入是   1234.57元。'>>> "{0}今天收入是{1:g}元。".format(name, money)       'Mary今天收入是1234.57元。'>>> "{0}今天收入是{1:G}元。".format(name, money)       'Mary今天收入是1234.57元。'>>> "{0}今天收入是{1:e}元。".format(name, money)       'Mary今天收入是1.234568e+03元。'>>> "{0}今天收入是{1:E}元。".format(name, money)       'Mary今天收入是1.234568E+03元。'>>> '十进制数{0:d}的八进制表示为{0:o},十六进制表示为{0:x}'.format(28) '十进制数28的八进制表示为34,十六进制表示为1c'

上述代码第①行中{1:d}是格式化十进制整数,代码第②行中{0:5d}是指定输出长度为5的字符串,不足用空格补齐。代码第③行中{1:d}是格式化十进制浮点数,从输出的结果可见,小数部分太长了,如果想控制小数部分可以使用代码第④行的{1:.2f}占位符,其中表示保留小数两位(四舍五入)。如果想设置长度可以使用代码第⑤行的{1:10.2f}占位符,其中10表示总长度,包括小数点和小数部分,不足用空格补位。

字符串查找

在给定的字符串中查找子字符串是比较常见的操作。字符串类(str)中提供了find和rfind方法用于查找子字符串,返回值是查找子字符串所在的位置,没有找到返回-1。下面只具体说明find和rfind方法。

  • str.find(sub[, start[,

    end]])。在索引start到end之间查找子字符串sub,如果找到返回最左端位置的索引,如果没有找到返回-1。start是开始索引,end是结束索引,这两个参数都可以省略,如果start省略说明查找从字符串头开始;如果end省略说明查找到字符串尾结束;如果全部省略就是查找全部字符串。

  • str.rfind(sub[, start[,
    end]])。与find方法类似,区别是如果找到返回最右端位置的索引。如果在查找的范围内只找到一处子字符串,那么这里find和rfind方法返回值相同的。

提示 在Python文档中[]表示可以省略部分,find和rfind方法参数[, start[,

end]]表示start和end都可以省略。

在Python Shell中运行示例代码如下:

>>> source_str = "There is a string accessing example.">>> len(source_str)             ①36>>> source_str[16]              ②'g'>>> source_str.find('r')            3>>> source_str.rfind('r')13>>> source_str.find('ing')14>>> source_str.rfind('ing')24>>> source_str.find('e', 15)21>>> source_str.rfind('e', 15)34>>> source_str.find('ing', 5)14>>> source_str.rfind('ing', 5)24>>> source_str.find('ing', 18, 28)24>>> source_str.rfind('ingg', 5)-1

上述代码第①行len(source_str)返回字符串长度,注意len是函数,不是字符串的一个方法,它的参数是字符串。代码第②行source_str[16]访问字符串中索引16的字符。

上述字符串查找方法比较类似,这里重点解释一下source_str.find('ing',

5)和source_str.rfind('ing',
5)表达式。从图6-1可见ing字符串出现过两次,索引分别是14和24。source_str.find('ing',
5)返回最左端索引14,返回值为14;source_str.rfind('ing', 5)返回最右端索引24。

图6-1 source_str字符串索引

提示

函数与方法的区别?方法是定义在类中的函数,在类的外部调用时需要通过类或对象调用,例如上述代码source_str.find('r')就是调用字符串对象source_str的find方法,find方法是在str类中定义的。而通常的函数不是类中定义的,也称为顶层函数,他们不属于任何一个类,调用时直接使用函数即可,例如上述代码中的len(source_str),就是调用len函数,只不过它的参数是字符串对象source_str。

字符串与数字相互转换

在实际的编程过程中,经常会用到字符串与数字相互转换。下面从两个不同的方面介绍字符串与数字相互转换。

  1. 字符串转换为数字

字符串转换为数字可以使用int()和float()实现,这两个函数在6.2.2节介绍了实现数字类型之间的转换,事实上这两个函数也可以接收字符串参数,如果字符串能成功转换为数字,则返回数字,否则引发异常。

在Python Shell中运行示例代码如下:

>>> int('9')9>>> int('9.6')Traceback (most recent call last):  File "
", line 1, in
int('9.6')ValueError: invalid literal for int() with base 10: '9.6'>>> float('9.6')9.6>>> int('AB')Traceback (most recent call last): File "
", line 1, in
int('AB')ValueError: invalid literal for int() with base 10: 'AB'>>>

默认情况下int()函数都将字符串参数当成是十进制数字进行转换,所以int('AB')会失败。int()函数也可以指定基数(进制),在Python

Shell中运行示例如下:

>>> int('AB', 16)171
  1. 数字转换为字符串

数字转换字符串有很多种方法,6.3.2节介绍的字符串格式化可以实现将数字转换为字符串。另外,Python中字符串提供了str()函数。

可以使用str()函数可以将任何类型的数字都转换为字符串。在Python

Shell中运行示例代码如下:

>>> str(3.24)'3.24'>>> str(True)'True'>>> str([])'[]'>>> str([1,2,3])'[1, 2, 3]'>>> str(34)'34'

从上述代码可以str()函数很强大,什么类型都可以转换。但缺点是不能格式化,如果格式化字符串需要使用format函数。在Python

Shell中运行示例代码如下:

>>> '{0:.2f}'.format(3.24)'3.24'>>> '{:.1f}'.format(3.24)'3.2'>>> '{:10.1f}'.format(3.24)'       3.2'

提示 在格式化字符串时,如果只有一个参数,占位符索引可以省略。

本章小结

本章主要介绍了Python中的数据类型,读者需要重点掌握数字类型与字符串类型,熟悉数字类型互相转换,以及数字类型与字符串之间的转换。

配套视频

配套源代码

电子书

作者微博:@tony_关东升

转载地址:http://awkla.baihongyu.com/

你可能感兴趣的文章
八月个人考核
查看>>
linux网卡绑定
查看>>
Oracle技术之缺少log_archive_config导致归档路径被禁用
查看>>
Oracle 临时表之临时表的应用问题
查看>>
Linux之进程查看与管理
查看>>
碟中谍:完成任务机房是核心
查看>>
戴尔联合微软开发私有云入门级系统
查看>>
图片轮播滚动
查看>>
关于客户端与服务端时区不同导致客户端上的时间不准问题的解决方案
查看>>
基于Windows AD的单点登录系统(二)
查看>>
第17章 重新登录
查看>>
java 表现层:jsp、freemarker、velocity
查看>>
内置函数, 递归, 二分法
查看>>
java jni和android java ndk
查看>>
Kotlin技术分享:中缀调用、解构声明
查看>>
property函数
查看>>
数论 - 组合数学 + 素数分解 --- hdu 2284 : Solve the puzzle, Save the world!
查看>>
.Net 从零开始构建一个框架之基本实体结构与基本仓储构建
查看>>
C#核编之内建数据类型
查看>>
Oracle运算符收录(易忘记,但是又很重要的运算符)
查看>>