一、前言
学习一门编程语言,第一件事就是要熟练掌握这门编程语言的基本数据类型,因为以后你会随时看到它们。
前文中我们用到了python中的一个最基本的打印函数print
,它的作用就是将一个字符串或者其它对象,打印到屏幕上。
用法很简单,本章在介绍数据类型的时候会大量用到它,可以先简单熟悉一下它的用法。
虽然用起来很简单,但它也有很多的细节,我会在后面章节对它进行详细的介绍。
二、什么是数据类型
所谓数据类型,也就是数据的类型,简单来说,就是python
可以表示哪些类型的数据。
比如,数字类型可以用来操作数字、布尔类型用来表示真假、列表类型用来存放一组关联的元素等等。
当然,上面这介绍的只是表象,不同的数据类型,真正的本质在于所占用的内存大小不同。
你可以在windows电脑的任务管理器中看到本机电脑的内存:
你电脑上所有的程序,包括我们马上要学习的python
语言,最终都是存放在你的电脑内存中执行的。
而各种数据类型的所占用的内存大小并不一样,一般我们会尽量选择占用内存较小的数据类型来满足我们的实际需求。
不过由于
python
这门语言的特性,实际上并不用太顾及这个,因为它本身就是为大众开发的一门语言,这里提到内存,主要还是为了让你对你写的每行代码,有更直接的感触。
内存大小可以通过函数sys.getsizeof
来获取,要使用这个函数,需要你导入一个模块:
import sys
比如下面这样:
import sys
a=10 #一个数字类型的变量
size=sys.getsizeof(a) #获取这个变量的大小
print(size) #打印出大小
这段简短的代码主要涉及到了变量、函数、模块、注释的使用,会在后面分别对其进行介绍。
1.变量
“模块”与“函数”的内容会在后面再介绍,而“变量”,也就是上面这段代码中的a
,简而言之,就是存放各种数据类型的一个地方,并且之后你还可以随意修改它里面的值。
当然变量名你可以随意写,不一定非要是a,但要注意以下几点:
- 变量名只能包含字母、数字和下划线,同时不能以数字开头。
- 变量名区分大小写。
本质上来说,变量名就代表了一块内存,当你操作上面代码中的a
时,实际上就是在操作一块内存。
比如你可以用函数id
来获取它的地址:
a=10 #一个数字类型的变量
addr=id(a) #获取a变量的地址
print(addr) #打印地址
2.注释
至于注释就简单了,就像上面这段代码这样,#
符号后面跟着的就是注释。
写注释与不写注释有什么区别吗?
对于python的解释器而言并没有什么区别,因为它根本不会管你的。
注释的作用,是给我们程序员看的,就比如上面那段代码,如果我不写后面的注释,你能知道我在干嘛吗?
这就是注释的作用,养成写注释是一个很好的习惯。
即使是自己写的代码,只要过个几个月,你自己可能都不知道当初自己写的是什么
正如你说见,单行注释,只需要在前面写上一个#
号即可。
但有时候我们会有写多行注释的需求。
比如后面章节我们将要提到的模块与函数,注释的内容一般一行写不下。
当然,你仍然可以继续用#
号,就像下面这样:
#第一行注释
#第二行注释
#第三行注释
#第四行注释
但这样明显很不方便,如果我现在需要复制注释里面的内容,就很麻烦,需要一行一行的复制,如果多行一起复制,会有前面的#
号。
所以这时候我们就可以使用多行注释的语法,就像下面这样:
'''
第一行注释
第二行注释
第三行注释
第四行注释
'''
任何在三个单引号之间的,都为注释内容,解释器不会管你的,这样就很方便我们写多行注释了。
三、数字
如果你读过高中(或者初中?)应该知道数字大抵可以分为三种类型:“整数”、“小数”以及“复数”。
python中默认就存在这三种数据类型,你可以很方便的表示它们:
a=10 #整数
b=3.14259 #小数
c=10+20j #复数
在vscode中,只要你将你的鼠标悬浮在变量名称上面,就会自动弹出一个框,给你解释这个变量名是什么类型的:
比如这里我悬浮在c
上,就会弹出上面的框,前面的(variable)
代表这是一个变量,后面的c
是变量名,最后的complex
就是该变量的类型,也就是“复数”。
如果你看a和b,就会发现整数、小数的类型分别为:int
、float
其中int
是整数integer
单词的缩写,而float
意思是浮动,因为在计算机中我们一般称小数为浮点数。
有数字肯定就会有运算,加减乘除这些最基本的运算都是有的:
a=10 #整数
a1=a+a
a2=a-10
b=3.14259 #小数
b1=b*b
b2=b/10
c=10+20j #复数
c1=c+c
加为+
,减为-
,乘为*
,除为/
。
当然,python中的运算符并不仅仅只有这一点,这块内容我们在后面专门聊一聊。
你可以直接用print
函数打印它们来获取运算的结果:
a=10 #整数
a1=a+a
print(a1)
b=3.14259 #小数
b1=b*b
print(b1)
c=10+20j #复数
c1=c+c
print(c1)
四、字符串
任何一门编程语言中,最常见的一个类型便是字符串了,因为它可以表示任意字符,并且操作它。
比如你写的任何报告、作文、小说,本质上都是字符串,只要将其全部读取到python
中,就可以对它们进行非常方便的操作。
创建一个字符串变量很简单,只需要写一个变量名,让它等于一个字符串即可:
s='str1'
s1="str2"
字符串可以用上面两种方式表示:’‘
与""
也就是说,单引号、双引号均可,不过一般习惯上我们可能更喜欢用单引号。
当你鼠标悬浮在变量上,就可以看到它的类型了:
虽然vscode这里显示的是Literal
,也就是“字面量”的意思,但实际上你完全可以把它看做字符串类型,也就是str
,即单词string
的缩写。
因为你可以在该变量身上调用任何属于
str
类型的函数,这个后面会提。
在python
中,有大量可以操作字符串的函数,但这里为了节约篇幅,以及考虑到我们还没有讲解到函数,所以会留在后面的章节对其进行详解
五、布尔
布尔类型,也就是我们常说的真与假,真用True
,假用False
。
使用起来非常简单:
b1=True
b2=False
悬浮在其上,可以看到它的类型为Literal
:
虽然“字面量”和“变量”代指两种不同的类型,但在python中你完全可以忽略两者的区别。
“字面量”代指
=
右边直接写出来的‘字符串’‘布尔值’等等值,而变量指的是=
左边的变量名,这两者有一定的区别,但在python中我们无需理会。
实际上它的类型为bool
,即boolean
的简写。
它的主要作用在于判断,这个我们会在后面的流程控制语句中进行介绍,这里只需要了解一下布尔类型的运算即可。
一般来说,布尔类型有三种运算:或、与、非
分别对应着:or
、and
、not
使用方法如下:
b1=True
b2=False
b3=b1 and b2 #b1与b2做与运算,一假为假,所以结果为False
b4=b1 or b2 #b1与b2做或运算,一真为真,所以结果为True
b5=not b1 #非运算,b1为True,那么结果就为False
print(b3,b4,b5) #打印结果
这个读过初高中的应该都知道,我这里就不再赘述了,只是要熟悉一下它的用法而已。
需要注意的点是print
这个打印函数,如果你想要打印多个对象,就按顺序写在小括号中即可,各个对象要用,
进行分隔
六、列表
列表,看字面意思应该也能猜出来,它能存放一系列的值:
arr=[1,True,3.24,1+10j,'string']
print(arr)
表示方法就是让一个变量等于一个[]
,而这个中括号中就存放你想要存放的值即可(任意数量,各个值之间用,
分隔)。
如果你此刻将鼠标悬浮在其上,就会看到它的类型:
这里的list
,就代表着它是一个列表。
你可以直接像上面那样,用print
函数一次性将它们全部打印出去,也可以像下面这样,分别进行打印:
arr=[1,True,3.24,1+10j,'string']
print(arr[0])
print(arr[1])
print(arr[2])
print(arr[3])
print(arr[4])
我们可以通过下标:[数字]
的形式,来访问对应的数据。
需要注意的是,下标是从0
开始数的,列表中有5个对象,所以下标的范围就是0-4
。
列表同样有很多常用的函数,鉴于同样的原因,我将在后文对其进行详解。
它的使用场景在于存放一组相关联的数据,比如一个学生的姓名、年龄、性别、电话等等,就可以存放在同一个列表中,方便以后存取修改。
七、元组
元组其实与上面提到的列表差不多,它同样也可以存放一组数据,使用方法如下:
tup=(1,True,3.24,1+10j,'string')
print(tup)
从表面上看,它与列表的唯一区别可能就是列表中的中括号,而它用的小括号,将鼠标悬浮在变量名上:
可以看到,元组的类型为tuple
,其后还跟着它内部各个值的类型。
不用理会
Literal
类型,只要出现True、False,那它就是bool
类型,只要出现字符串,那就是str
类型,只要出现整数,那就是int
类型。
同样也可以用print
直接打印它,得到结果:
(1, True, 3.24, (1+10j), 'string')
同样也可以用下标访问对应位置的数据:
tup=(1,True,3.24,1+10j,'string')
print(tup[0])
print(tup[1])
print(tup[2])
print(tup[3])
print(tup[4])
但既然有列表与元组两种类型,那自然会有一定的区别。
而这区别就是,元组是不可变的,而列表是可变的
比如下面这段代码:
arr=[1,True,3.24,1+10j,'string']
tup=(1,True,3.24,1+10j,'string')
arr[1]=False #正确,列表可变
tup[1]=False #错误元组不可变
这里的意思就是,将下标为1
的地方(也就是第二个元素:True
)重新赋值为False
。
如果你运行这段代码,就会看到python
解释器报错了:
意思就是说,元组对象不支持对内部的项进行赋值操作。
虽然它们的区别并不仅仅只是体现在这一个操作上,但其本质都是一个意思:元组不可变,而列表可变。
所以如果你觉得一组数据不应该被别人修改,那就用元组,而其余的情况,都直接用列表就好了,无需考虑太多。
八、集合
紧接着是集合,看名字也能大致明白她是什么意思,就是数据的集合
它的使用方法与上面的列表与元组很像:
s={1,True,3.24,1+10j,'string'}
print(s) #直接打印
其类型就是set
:
不同之处在于,它用的{}
,并且不能直接用下标进行访问:
s={1,True,3.24,1+10j,'string'}
print(s[0]) #错误,集合不能用下标进行访问
我们只能通过后面将要介绍的循环来遍历它,它的主要特性就是:不允许添加相同的元素
也就是说,我们一般可以用它来完成去重的操作。
比如曾经我下载过几百M的字典,里面有大量重复的密码(几十万个)。
想要去重,那就可以直接将它们全部读入一个集合中,集合就会自动完成去重,最后我们再循环遍历它,将里面的结果取出来就可以了
这里只是简单介绍一下它的概念,因为没有实际操作的话,其实学过也会很快就忘记的。
实际上它的应用并不仅限于此,其对应于数学上的“集合”概念,所以它是可以很方便的完成“集合”相关操作的,比如获取两个集合的交集等等。
九、字典
最后一个是字典了,它的应用场景更多,使用方法如下:
o={
'name':'yushi',
'age':100,
'sex':'man'
}
print(o)
注意,它和上面的集合一样,同样是使用的{}
包裹元素,同时可以看到,字典的类型为dict
:
至于后面的中括号中,仍然指代的是参数的类型,前面的str
代表“键”为字符串类型,后面的any
类型则用来泛指“任意”类型,也就是“值”的类型任意。
由于字典的元素为“键值对”,也就是像上面写的那样,用,
分隔每一个键值对元素,而每个键值对的键与值,则用:
分隔,前面的是键,后面的是值,我们可以通过键来获取对应的值。
就像下面这样:
o={
'name':'yushi',
'age':100,
'sex':'man'
}
print(o['name']) #通过键 name 获取对应的值 yushi
print(o['age']) # 通过键 age 获取对应的值 100
它有多好用呢?比如前面提到的列表、元组可以绑定一系列关联的数据,但访问里面的时候只能通过下标来访问。
也就是说,我需要记住名字的下标是0,年龄的下标是1等等。
记忆这些没有意义的数字很多时候都是一种负担,而通过字典的方式,我们可以将名字与对应的值进行绑定。
以后想要访问乃至修改,都可以直接用[键]
的方式来实现,清晰明了!
十、简单总结
需要注意的点是变量的命名规范。
同时要注意不要使用“关键字”作为自己的变量名,比如上面看到的这些数据类型(int,bool,str,dict,list,tuple,set),因为这些单词已经被python解释器自己用了,一般我们就最好不要再用这些词来声明变量,以防发生混淆。
但其实如果你非要用,也是可以用的,只是作为一种编程习惯来说,最好别用(以免引入一下奇奇怪怪的bug)
还有函数名最好也不要当作变量名,比如这里最常用的print
函数。
注释可以使用#
作为单行注释,'''
作为多行注释,注释的作用是给人看的,python解释器不会管这个。
数字类型主要有三种:整数、小数以及复数。
布尔类型有两个值:True
与False
,并且可以使用与或非运算(and
、or
、not
)。
字符串是用“单引号”或“双引号”包裹起来的字符序列,一般我们更加习惯用单引号。
列表、元组比较类似,都是用来存放相关联的一组数据,并且都可以通过下标来访问对应的元素,区别在于,元组不可变,列表可变,元组使用()
,而列表使用[]
。
集合同样是存放各种数据的,它的主要特点就是内部的元素不可重复,一般被用来去重,用{}
,并且不可为空,因为字典也是用的{}
,如果为空,会默认它为字典类型。
字典也是用来存放各种数据集合的,内部存储的不仅仅只是值,它是以“键值对”为单位存储的,相比于列表它有着更多的优势,比如可以直接通过有意义的键名,来取得或者修改对应的值。
本章只是比较浅显的介绍了python
中各种基本数据类型,但显然,这还远远不够,在后面的文章中,我将继续对其做出更加深入的介绍。