基本数据类型
实际上数据结构和程序控制都是比较重要的,但是经过衡量之后还是把数据结构放在前边。
上一节我们提到Python变量的包容性和自由性,你只需要命名,变量的类型可以由赋值语句确定。
编程中的数据类型也是设计的结果,为了更好的描述和计算问题、我们创造了不同的数据结构,而且数据结构本身是一类最基础的算法,掌握基础的数据结构,是解决一般性问题的基础,而当遇到复杂问题时则需要在基础数据类型之上用类的方法设计新的数据类型。
好的理解是原理的触类旁通,好的解释是往往从一个普遍的故事开始。
在理解数据类型之前,请你想象一杯水,水,是数据,此时杯子是水的形式,请你想象一个装有满螺丝,扳手,电钻,钻头的工具箱,此时螺丝扳手等材料和工具就是数据,而这个工具箱就是数据的类型,数据的特性和计算的需要决定了应该使用哪种数据类型来存储它。
初学者不具备创造和发明数据结构的能力,但随着学习的推进,当我们掌握了基础的数据类型并掌握了类和函数的知识之后,可以尝试针对需要设计相应的数据结构(类)。
1.数学类
int(有符号整型)
long(长整形)
float(浮点型)
complex(复数)
math库中的三角,对数,派等等
初学者学会运用int足够了,其他的可以忽略,代码中看到这些定义符号能认识就行。
数学类不需要用任何符号标注,可以说是python中最有B格的数据类型,我就是我,纯粹,孤傲的存在,任何的修饰都是多余。(不过你要用转换函数它也是可以的)你甚至可以在工作台(工作台:运行pyton代码的地方,和cmd差不多,一个黑窗)直接敲个3,然后回车,工作台会给你返回一个3,意思是:我认识,你输入的是个3,你甚至可以拿工作台当计算器来用。但是其他类型的数据却不行,他们必须加上引号,括号,以及分割符号逗号等python才会认识。
2.字符串类(str)
常见的也就英文字母加标点符号,以及ascll中的其他诸如数字英文字母汉字,日语平假名星座符号,以及各种蚯蚓。
字符串需要用引号括起来,表示这是一个字符串(单引号‘hello’,双引号“hello”,三引号’’’hello’’’都是可以的三引号多用于多行字符串)
str()函数可以将别的数据类型转换成字符串
字符串变量可以用+号连起来
字符串可以用len()函数统计长度
字符串中的字符是有排列关系的,正因存在排列关系,字符串可以进行切片操作。比如:
stra =‘ love'
print(stra[0],stra[2],stra[1],stra[3])
输出:lvoe
字符传中的每一个字符都对应着唯一的ascii码编号,可以用ord()函数和chr()函数相互转换。
\,转义符号,意思是斜杠后边的符号就是个字符,不要和其他符号配对。
字符串类型的数据本质上讲也是一种类,什么是类呢?英文class,类是一种简化的翻译,由于这个翻译过于简单,给初学者造成了理解上的困难,我是这样来理解类的:class (类)----设计用于处理问题的组合工具箱。字符串既然是类,就意味着它或许有构造函数,实例方法。字符串类型常用的有len()长度,split( )分割,find()寻找字串位置,count( )统计字串出现的次数等三十来个方法,掌握常用的几个就可以了。
注意,字符可比较大小,实际上是比较字符在ascii编码表unicode编码中的位置。大写的字母在小写前面哟。
a ='你好'
b ='张先生'
print(ord(a[0]))
print(ord(b[0]))
c ,d = 'a','A'
print(ord(c)>ord(d))
print('asdf'>'asdg')
print('asdf'>'asdf')
print('asd'>'asdg')
print('张'>'王')
print('张东'>'王波') #虽然不知道两个汉字字串比较的背后原理,了解就好。
输出
20320
24352
True
False
False
False
False
False
3.逻辑型数据/布尔型数据bool:True False( 注意T,F都是大写,小写会报错,True:是,False:不是)
(注意:!=都是运算符号而不是数据类型)
4列表:一种有序的自由的组合型数据,列表是python最重要最普遍的数据结构。
如果你有使用过任何形式的表格,比如execel,课表,工资表,价目表,都有助于理解列表这种数据结构,单一的数据是孤立的1,5,a,h,列表将孤立的数据整合起来。
[1,5,a,h]
自由是列表最显著的特性:列表数据可以以任何你想要的形式组合;
如: list = [7,8,9,4,5,6,1,2,3,’ds’[52,45,54]]
组成列表的数据也是自由的,几乎所有数据都可以放到列表里,包括列表自身。
[1,2,3,’a’,’b’,True,False,[7,’8’],(45,56,89),{‘姓名’:‘张山’},{‘春天’,‘夏天’}]
数字 字符串 布尔 列表,元组, 字典 集合
注意:列表使用方括号,元组使用圆括号,字典和集合都使用花括号,字典键名和键值 用冒号连接。
( 列表中虽然可以放入几乎所有的数据类型,包括列表,但要注意,如果列表中有元组时,你可以整体改变元组,却不能单独改变元组中的元素。)
我们把多个数据用逗号分割并用方括号括起来就完成了列表的正确书写,列表作为数据可以用变量保存起来,也可以把列表传递给函数,类。
列表的维度:列表的维度是一个极为抽象的概念,这里有一点反直观,不要用传统的空间维度思维来理解列表的维度,由于受传统表达习惯书写习惯视觉习惯思考习惯的影响,我们很容易错误的把列表的维度和空间维度混为一体,数据的维度和空间不是对等关系,数据的维度在这里仅仅是构造和组合的工具,是基于计算和存储的一种关系。我们接下来要做的是在python中创建多维列表
形如a = [4,5,6] 的是一维列表 操作单个元素时这样写:
print(a [0] ) 4
print(a [1] ) 5
print(a [2] ) 6
注意,列表,元组等多元素数据类型的第一个元素的编号以0排起然后第二个是1,第三个是2,后边一次类推。这是一个普遍的规则,各个维度都是这样,在后面构建程序循环的知识中也是这样。
形如 b = [[1,1,2,],[5,4,6]] 是一个二维列表,b还可以写成这样
[[1,1,2,],
[5,4,6]]
操作单个元素时这样写:print(b [0,0] ) 1
print(b [1,2] ) 6
我们发现两个角标就可以找到b所有的元素,因此b是一个二维的列表
观察下面的情况:c = [[1,2,2,3,4],
[1,3,2,3,5],
[1,2,2,3,4],
[ 7,7,5,4,1]]
列表c 虽然有4行5列,但它仍是一个二维列表,为了书写方便,我们在元素分割符逗号后边换了行,但c和b一样都是二维列表,判断列表维度有两个标准,角标和方括号的层数,有几个角标,括号有几层,就是多少维。
我们在观察两个多维列表的例子:
e = [1,[2,[2,3]],5] e是三维列表
f = [1,4,[[[[1]]]]] f是5维列表
注意:python 有一个专门用于优化列表计算的库,numpy库,在这个库中对列表有一些约束:数据类型统一化。我们用数组array来存储和计算统一类型的列表,而矩阵matrices又是array的一个分支,有更独特高效的处理方法.但list列表更通用一些。
我并不想讲太多哲学上的事情,但理解数据类型数据结构与现实问题之间的关系对学习编程十分重要。
现实世界的数据是错综复杂的,他们有各自的特点,彼此之间又有关系,要使用编程的方法处理这些数据,就必须把数据加以分类,然后程序才能存储和计算这些数据,某些数据适合列表来处理,我们就发明了列表这种数据类型来存储和计算他们,之后要学习的元组,字典,集合等数据类型,也都是应不同的现实问题而被发明。
会议室即将要接待一个100人的会议,其中5人需要就坐主席台并发言,会议室发言台有8个席位,听众席有8x15个席位,可能临时发生出席人员变动的情况,现在要求你用list列表的方法规划并打印入座名单以方便参会人员及时找到自己的席位。
zuoci = [[‘张某’,‘王某‘,’李某’,’‘赵某‘’,’陈某‘],
[’听众11’,’听众12’,’听众13’,’听众14’,’听众15’,’听众16’,’听众17’,’听众18’],
[’听众21’,’听众22’,’听众23’,’听众24’,’听众25’,’听众26’,’听众27’,’听众28’],
…
…
[’听众121’,’听众122’,’听众123’,’听众124’,’听众125’,’听众126’,’听众127’,’听众128’]
像这类问题列表的知识完全可以应对了。
掌握了以上列表的知识之后,在学习元组字典等其他数据类型之前,我们可以尝试用列表这种数据结构来描述问题了:
请试着用二维列表存储以下数据:
课表;日历;工资表;考勤表;价格表;利率表;对数表;三角函数表;围棋的棋谱;五子棋棋谱;
请使用一个三维列表描述一个27魔方
mofang = [[[a1,a2,a3],[b1,b2,b3],[c1,c2,c3]],[[a21,a22,a23],[b21,b22,b23],[c21,c22,c23]],[[a31,a32,a33],[b31,b32,b33],[c31,c32,c33]]]
请使用列表存储你的2位电话联系人
列表的索引(切片,定位,定位,遍历都是一个意思):
列表与变量:一个变量被赋值为列表,这个变量就具有了列表的所有性质,这个变量就被视为列表来操作。
列表的索引:是指对于一个列表变量,方括号中有很多个列表元素,他们被逗号分割,我们要在这个列表中找到一个或几个元素的方法,就叫列表的索引。
如已知列表 list _a =[ [1,2,8],7]
list_a[0]=[1,2,8]
list_a[0][0]=1
list_a[0][1]=2
list_a[0][2]=8
list_a[1]=7
注意子列表元素切片时有两层角标,第一层切片后的结果作为整体再加角标切片
* list_a[0]*[0]=1
切片和索引知识比较繁琐,等我们学完其它几种数据类型后补充学习,毕竟理各种解数据类型之间的区别,对数据类型有一个整体认知相对初学者来说更为重要。
5、元组tuple
python 中元组用圆括号标识,元组是不可变的列表,其他性质和列表一样。元组和集合的区别是集合元素不能重复,而元组可以重复。
元组的发明有两个用处:用来存储不可变的数据,比如四季
seasons = (‘春’,’夏‘,’秋’,‘冬‘),
星期
week = (’星期1’,’星期2’,’星期3’,’星期4’,’星期5’,’星期6’,’星期7’)等不需要改变的数据。
有周期性固定性的数据:值班表 zhiban = (1组,2组,3组,1组,2组,3组)
元组还用在函数的返回值以及参数传递的时候,保证函数的稳定运行,关于这一点可以在函数知识板块加以理解。
6.集合(set)
python 中集合用花括号标识,在python 中集合的性质和数学中集合的性质一样:集合中的元素没有顺序,不能重复。运用这一性质可以实现很多去重,统计,差异比较数据整合等功能。
比如学校举行运动会,有3个体育项目,全校500学生,有的参加一项,有的参加多项,有的一项也没有报名参加,这时要统计全校有多少懒蛋一项活动也没有参加,就需要用到set(集合)的特性
xmcp = [长跑名单......] #长跑名单存入列表变量(xmcp)中
xmdp = [短跑名单......] #短跑名单存入项目短跑(xmcp)中
xmtg = [跳高名单......] #长跑名单存入项目长跑(xmcp)中
cp = set(xmcp) # xmcp 这个列表由set函数转化为一个集合cp
dp =set(xmdp) #xmdp 这个列表由set函数转化为一个集合dp
tg = set (xmtg) #xmtg 这个列表由set函数转化为一个集合tg
tt = cp.union(dp,tg) #用union()方法将cp,dp,tg 三个集合合并成tt一个集合
nandan =500- len(tt) #len()函数统计集合tt的长度(元素个数)是常用函数
程序中#后面的类容是注释,只为辅助代码阅读,程序运行时会忽略而不执行。
再次提醒,初学者输入括号,引号,逗号,冒号等一切标点符号请切换到英文文输入法。
set 在转化集合的时候会自动去除掉重复的元素,多个重复只保留一个,set ()函数还可以转化
上例中运用set()函数将一个列表转换为集合。
我们也可以直接创建一个集合
qwe = {‘文强’,‘成成‘,’a‘,’b‘,’成成‘}
重复的’成成‘会自动去重
创建空集合时要使用yu = set()而不能是这样 yu = {}。原因是集合和字典都使用花括号, {}会被作为空字典对待。
到目前为止我们了解了数字,字符,布尔,列表,集合,字典等6种数据类型,我们发现每种数据类型都有它自身的特性,再编程时要根据实际问题恰当选择数据类型,有时还要将它们的特性配合使用
7,字典
字典可以说是现实世界中随处可见的数据结构,在python编程中也经常用到。
姓名:马斯克, 年龄:22,得分:89,评价:优秀,价格:554,规格:HU547,型号:yt_89,在这些表述中我们发现一个规律,前边部分说明数据的指向,后面部分给出数据的取值,前后结合表达了数据完整的意义。
python 中用{}和来标识字典数据类型,前半部分叫键名,后半部分叫键值,中间用:隔开。
一个字典类型的变量可以包含多对字典元素,字典元素之间用,分割。我们用规范的python语句来书写上面的数据
data_l = {‘姓名’:’马斯克’,’ 年龄’:22,’得分’:89,’评价’:’优秀’,’价格’:554,
’规格’:’HU547’,’型号’:’yt_89’}
注意,在python 中字典的键值可以是任何类型的数据,因为你需要随意改变键值,所以键值从类型到取值都是自由的,而键名需要稳定的代表数据的意义,所以他的可选数据类型就不那么自由,数字,布尔,字符,元组等四种数据类型才能作为字典的键名。解释器在判断字典键名是否合规时是使用哈希方法,初学者不必纠结于这些知识。
常用且基础的数据类型也就以上7种,我们需要先从符号标识上能够区别和认识这几种类型的数据,结合现实世界以及问题,理解他们的特性和应用场景,多举例,多练习,多思考,能够灵活用用这7种数据结构存储和转换数据,能够认识数据,存储数据,理解数据的构造和现实问题的对应关系,也就具备了编程思维的整体框架,其他的切片索引,循环,函数,类等知识都是技巧性质经验性质的知识,都是细枝末叶。python 作为一种和自然语言最为接近的编程语言,数据结构就相当于词法加语法,是最基本的表达基础,认知基础,思维基础,完成了基本数据类型的学习,我建议初学者会过头来,结合之前的打印,变量赋值等知识,完成一系列练习巩固练习之后再学习其他类容,python编程的根本就这点知识,掌握这些内容,把基础打牢,比好高婺远要实惠许多。为什么这说,当你完成后面那些数据索引索引,循环控制,函数和类的学习,你就会懂得编程无非是数据翻来复去,挑三拣四,变来变去,无非是数据的游戏,脱离数据的认识,脱离数据的构造,所有的编程都是肤浅和空洞的,就好似学会开车确不了解运输的意义,程序就像一辆车,它总得运点什么,程序就像一台机器,它不会像变魔术一样凭空变出东西,他需要材料,需要工件。而数据才是我们要运输,要加工得东西。所以牢牢得打下基础,深入理解基本数据类型与现实问题的关系,并且在后继的学习中始终专注数据,少走弯路,把握学习方向。
接下来请运用所学得知识,完成练习
1、在网上搜集10部电影及其评分,以如下表格的形式用print函数打印出来,要求最多使用5行代码
2,总结列表和元组的区别,分别设计一个列表和元组
3,单位张王李赵孙5位经理轮流值班,请打印一份本月经理值班表。
4. 两人下五子棋,9*9的棋盘,一共下了8手,请在纸上画出棋局,要求运用bool数据类型和其他数据类型知识,保存并打印棋局。
5.找出3个可以用5维列表表示的情景,并打印出来
6、张老师52岁,还有3年退休
李老师40岁,还有15年退休
林老师60岁,已近退休5年了,分别使用%,和fomat方法,用一条打印语句打印3位老师的退休状况
7.用一条赋值语句,给shang,yushu 两个变量赋值100除以3的商和余数。
8、hh = [54,4,5,8,7,9,6,5,4,1,2,5,8,7,44,5,4],运用集合的特性,去除hh中重复的元素,并用列表h存储。
9、fenshu = [45,50,88,94,55,40,70]保存着学员陈利以往的考试成绩,用编程的方法去掉最差的一次成绩,并把本次考试成绩38分追加到列表。
10、超市商品的价格用字典格式保存,如jiage = {’黄瓜‘:2,’牙膏‘:10,’豆腐‘:3……},编写一条语句,将方便面和面粉的价格调整为5和4.