Python 常用基本数据类型
本节导航:
一、数据类型的查询
当面对未知数据类型的数据时,我们脑子里应该有这么一个问题:我们怎样才能查到未知数据的数据类型呢?
这里就让我来简单的回答下你的困惑,在Python中我们可以通过两种内置函数来查询对象数据类型:type() 和 isinstance() ,在此我截取了这两个函数的部分源代码进行参考:
class type(object): """ type(object_or_name, bases, dict) type(object) -> the object's type type(name, bases, dict) -> a new type """ ...
def isinstance(x, A_tuple): # real signature unknown; restored from __doc__ """ Return whether an object is an instance of a class or of a subclass thereof. A tuple, as in ``isinstance(x, (A, B, ...))``, may be given as the target to check against. This is equivalent to ``isinstance(x, A) or isinstance(x, B) or ...`` etc. """ pass ...
由注释我们可以发现 type() 与 isinstance() 的区别在于:isinstance() 中返回对象即是类的实例还是是其子类的实例(即 isinstance() 会认为子类是一种父类类型)。
虽然现在我们看不懂它们的源代码到底在说些什么,不过我们只需要知道它具体的用法即可,如果只是简单的确定数据类型,本人倾向于使用 type() ,纯粹是自我感觉 type() 简单方便点,只需要把声明好的变量名称输入在 type() 内即可,而 instance() 还必须在函数内进行数据类型的猜测判断正误才能得到想要的结果。在现阶段中简单判断数据类型使用 type() 足够了。
a = 123 print(type(a)) #<class 'int'> print(isinstance(a, int)) #True
b = '123' print(type(b)) #<class 'str'>
print(isinstance(b, int)) #False
c = True
print(type(c)) #<class 'bool'>
print(isinstance(c, bool)) #True
解决好问题后,让我们一起来了解下常见的Python数据类型吧。
print(type(123)) #<class 'int'> print(type(1.23)) #<class 'float'> print(type("你好!")) #<class 'str'> print(type(True)) #<class 'bool'> print(type([1, 2, 3])) #<class 'list'> print(type((1, 2, 3))) #<class 'tuple'> print(type({"name": "Jane", "age": "18"})) #<class 'dict'> print(type(set([1, 2, 3]))) #<class 'set'>
二、Number 数字
Python中数字类型又包括:int(整型)、float(浮点型)和 complex(复数)
print(type(123)) #<class 'int'>
print(type(1.12)) #<class 'float'>
print(type(3j + 1)) #<class 'complex'>
在32位机器上,整数的位数为32位,取值范围为 -2**31~2**31-1;
在64位系统上,整数的位数为64位,取值范围为 -2**63~2**63-1;
对于我们来说,这个范围已经挺大了,不用在意范围太多。
在Python 3 版本以后,如果整数发生溢出,Python会自动将整数数据转换为 long 长整数,无论多大都会显示数据类型为 int(整型),所以本人意见是就把长整型给忘了吧,浪费脑细胞记它干嘛。
print(type(4**1000)) #<class 'int'>
浮点数是属于有理数中某特定子集的数的数字表示,在计算机中用以近似表示任意某个实数。通俗易懂点,我们在这里就把它看成小数吧。之所以称为浮点数,是因为按照科学记数法表示时,一个浮点数的小数点位置是可变的。在表示很大或很小的浮点数时必须使用科学计算法表示,把10用e替代。
float 类型存放双精度的浮点数,计算后一般精确到小数点后16位,由于精度受限,进行相等性比较不可靠。(如果需要高精度,可使用 decimal 模块的decimal.Decimal() 函数,这种类型可以准确的表示循环小数,但是处理速度较慢,适合于财政计算。)
print(1.25*100) #125.0
print(0.125*1000) #125.0
print(12.5*10) #125.0
print(type(12.5*10)) #<class 'float'>
print(1.25e9) #1250000000.0
print(12.5e8) #1250000000.0
print(1.25e-9) #1.25e-09
print(0.00000000125) #1.25e-09
print(1/3) #0.3333333333333333
注:只要涉及浮点数的运算,其结果必为浮点型。
complex(复数)
像我们这样的屌丝复数什么的与我们有什么关系,这辈子什么的是不会学复数了,还是忘了吧。
Python中数值有7种简单运算:加(+)、减(-)、乘(*)、除(/)、取模(%)、幂(**)、取整除(//),在这里就列几个例子,具体的在运算符中在进行讲解。
a = 1
b = 3
print(a + b) #4
print(a - b) #-2
print(a * b) #3
print(a / b) #0.3333333333333333
print(a % b) #1
print(a ** b) #1
print(a // b) #0
c = 3
d = 10
print(c % d) #3
print(c ** d) #59049
print(c // d) #0
注:这里需要特别注意的是取模(%)运算,当分子小于分母时,结果为分子;当分子小于分母时,结果为余数(分子除以分母所得的数)。分子和分母、除数和被除数,是不是一脸懵逼,是不是发现自己好像...似乎...把小学的数学忘了,那么恭喜你,在这里给你科普下:5/8 (八分之五),5 是分子,8 是分母。分母是除数,分子是被除数。
三、String 字符串
在 Python 中,字符串是由引号(单引号 ' 或 双引号 " )与引号中的字符一起组合而成的,其中引号只是字符串外在声明的一种表达方式,不是字符串的一部分。
print('hello world!') #hello world! print("hello world!") #hello world!
a = "hello world!"
print(a) #hello world!
这时候我们心里该有疑虑了,既然书写字符串中单引号( ' )和双引号( " )都可以使用而且结果还相同,那么 Python 中为什么还会提供两种呢?这样不会造成我们选择上的困难吗?
存在即合理,请相信这一点,像我们这样的屌丝怎么能和人家大佬相比,他们脑子都不知道怎么长得,头肯定都秃完了(聪明人的象征)。就拿我们中文写作来举例吧,当写一大段文章中我们经常会引用某人某人说什么什么话,这里的一段话可以看做是一段很长的字符串,当我们引用别人所说的话时经常会用双引号引起来表示引用。同理可得,当字符串中需要使用到单引号或双引号时,这时候它两个同时存在的作用就体现出来了:
print('I'm a student.') #SyntaxError: invalid syntax
print("I'm a student.") #I'm a student.
当然这只是简单的情况,如果字符串内部既包含 ' 又包含 " 怎么办?这时候我们就需要引入转义字符的概念了。这里容我卖个关子就不具体陈述了,有关内容在以后的字符串专题中进行详细的解读。
四、Boolean 布尔值
Python中的布尔值用两个常量True和False所表示,一个布尔值要么True,要么False(注:这里的首字母都为大写),常用在条件或循环中作为条件判断。True和False分别对应数字中的1和0,可作为数字计算,但不提倡。
print(1 > 2) #False
print(1 < 2) #True
print(int(True)) #1
print(int(False)) #0
print(True + True) #2
print(True == 1) #True
print(False == 0) #True
布尔类型具体的“或”、“且”、“非”运算在稍后的 Python 运算符中进行详细的阐明。
五、List 列表
列表(list)属于一种有序的集合,可以随时添加和删除其中的元素。列表是 Python 中内置的一种数据类型,也是最常用的 Python 数据类型。列表的命名规则就是一个方括号([]),创建一个列表只要把逗号分隔的不同的数据项使用方括号括起来即可。列表中每个元素都分配有一个数字(从0开始),这个数字即为该元素的位置(或索引)也可以认为是该元素的下标,第一个索引是0,第二个索引是1,反过来最后一个索引是-1,依此类推。
在这里我们就简单声明一个班级名单列表 name 进行演示:
name = ["Madonna", "Cory", "Annie", "Nelly"]
注:列表中的数据项可以为任意数据类型。
现在我们已经弄清楚列表元素的具体位置了,也顺便建立了一个简单的列表,在下一篇文章内容中我们将会详细的了解到列表到底有哪些方法。
》》》》》》》》文章链接:Python 列表和元组
六、Tuple 元组
元组和列表差不多,我们可以把元组看成是简单的只读列表,与“强大”的列表不同的是,元组创建后其中的元素就不能被修改了,它只有两个内置的方法:index() 和 count() ,可以像列表那样进行“查”(即进行切片)和count() 统计,不支持复杂的“增”、“删”、“改”等功能。元组创建很简单,只需要在小括号中添加元素,并使用逗号隔开即可。具体的操作请查看上文列表,这里就不进行详细的说明,简单演示实例如下:
name = ["Madonna", "Cory", ["Annie", "Nelly"], "Cory"] #创建一个班级名单列表 name
name_1 = ("Madonna", "Cory", ["Annie", "Nelly"], "Cory") #创建一个班级名单元组 name_1
print(name_1) #('Madonna', 'Cory', ['Annie', 'Nelly'], 'Cory')
print(name_1[1:3]) #('Cory', ['Annie', 'Nelly'])
print(name_1.index("Madonna")) #0
print(len(name_1)) #4
注:单个括号 () 即可表示元组,又可以表示数学公式中的小括号,打印时会产生歧义,所以当定义单个单独的元素时,元素后必须要加一个逗号(,)隔开。
》》》》》》》》文章链接:Python 列表和元组
七、Dictionary 字典
字典(dict)是在列表后我们学到的第二种可变的容器模型,可以存储任意类型的对象。字典,顾名思义就像是我们经常使用的新华字典或英语词典一样,具有极快的查找速度,可以帮助我们快速的查找到所需要的东西。在Python中,字典是以键值对(‘key’-'value')的形式表现的,每个键值对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号({})中。
在这里需要注意的是:dict是无序的;跟多变的 value 不同的是 key 具有唯一性;key 的数据类型必须是固定的不可变的,如:数字、字符串、元组等,而 value 就没有那么多的要求可以为任意的Python数据类型。演示实例如下:
math_score = {'Madonna': 89, 'Cory': 99, 'Annie': 65, 'Nelly': 89} #创建一个班级数学成绩字典 math
print(math_score) #{'Madonna': 89, 'Cory': 99, 'Annie': 65, 'Nelly': 89}
demo_1 = {'Madonna': 89, 1: 'iennvv', 1.34: {'Madonna': 89}, ("ifne", "fjie"): [1, 2, 3]}
print(demo_1) #{'Madonna': 89, 1: 'iennvv', 1.34: {'Madonna': 89}, ('ifne', 'fjie'): [1, 2, 3]}
demo_2 = {'Madonna': 89, {'iem': "ofem"}:99} #TypeError: unhashable type: 'dict'
demp_3 = {[1, 2, 3]: 45} #TypeError: unhashable type: 'list'
这时候我们已经知道如何创建一个正确的字典了,虽然这个创建的这个字典的长度有点惨不容睹,但是它已经属于一个正常的字典了,可以实现索引字典该有的功能,在下一篇文章中我们从“增”“删”“查”“改”四个方面进一步的接触它。
》》》》》》》》文章链接:Python 字典与集合
八、Sets 集合
写到这里终于快结束了,容我先歇口气!在前面我们一口气学完了列表、元组、字典,是不是感觉自己快炸了,方括号、括号、大括号什么的两脸懵逼,不怂不怕,让暴风雨来的更猛烈些吧!!!接下来进入集合的学习吧:
首先需要了解下如何去建立一个新的集合:第一种方法是我们可以通过大括号 {} 内加内容用逗号( , ) 隔开的方式直接创建一个集合;第二种可以使用 set() 方法将已有的列表(或元组)构建成一个无序的集合。
list_1 = [1, 3, 4, 5, 6, 66, 3, 6] #创建一个列表 list_1
print(type(list_1)) #<class 'list'>
set_1 = set(list_1) #把列表 list_1 转换为集合 set_1
print(type(set_1)) #<class 'set'>
print(set_1) #{1, 2, 3, 4, 5, 6, 66, 22}
print(set((1, 2, 3, 4, 4))) #{1, 2, 3, 4} 由元组创建集合
set_2 = {1, 3, 3, 4, 4, 77} #直接创建一个集合 set_2
print(type(set_2)) #<class 'set'>
print(set_2) #{1, 3, 4, 5, 77}
啊!特么我的值怎么被吃了?怎么变短了那么多??系统还我的值啊!!!别激动,别激动,冷静下。
冷静下来后仔细观察我们就会发现,被“吃”的值是列表(或元组)中重复的东西,这时候我们似乎发现了集合中一个不可告人的大秘密,它好像具有“去重”的功能,是不是很熟悉?对,你猜对了。这点集合跟字典类似,具有“天生去重”(自动把集合内部重复的部分删除)的功能,我们可以理解集合是一个无序的、不重复的数据组合,但是集合与字典也存在明显的不同,我们可以形象的把集合看成只有 key ,不具备存储 value 的功能。
def __init__(self, seq=()): # known special case of set.__init__ """ set() -> new empty set object set(iterable) -> new set object Build an unordered collection of unique elements. # (copied from class doc) """ pass
注:集合和字典一样是无序的(无法通过数字进行索引),而且内部的数据类型必须是固定的不可变的。
》》》》》》》》文章链接:Python 字典与集合
注:这几篇文章本是一篇,由于字数太多严重影响阅读体验,所以就把内容进行了拆分,拆开的文章开始内容与本文相同,请见谅!!!