计算机是处理数值运算和逻辑运算的高级电子设备,因此,计算机程序理所当然会处理各种各样的数据,不同的数据需要定义不同的数据类型。而在Python中,能够直接处理的数据类型有以下几种:
①整型(int)
Python可以处理任意大小的整数,当然也包括负整数。在程序中的表示方法和数学上的写法基本一致,例如:1,200,-8080等等。整数在程序中的使用非常广泛,Python为了优化速度,使用了小整数池,避免为整数频繁申请和销毁内存空间。Python对小整数的定义是 [-5,257) 这些整数对象是提前建立好的,不会被垃圾回收,也就是说,在一个Python程序中,所有位于这个范围的整数使用的都是同一个对象,例如:
由上图可见,5000不在整数池范围内,所以使用的两个对象,而数值5则都是同一个对象。(注:id()方法用于返回变量的内存地址)
②浮点型(float)
浮点数也就是小数,之所以成为浮点数,是因为按照科学记数法表示时,一个浮点数的小数点位置是可变的,比如,1.23 * 109 就是1.23e9,或者12.3e8,浮点数也可以用数学的写法,比如:1.23 ,3.14 , -9.07等等。但是对于很大或者很小的浮点数,就必须使用科学计数法表示。注意:整数和浮点数在计算机内部的储存方式是不同的,整数运算永远是精确的(包括除法),而浮点数的运算则有可能会有四舍五入的误差。
③字符类型(str)
字符串是以单引号或双引号括起来的任意文本,比如'abc' , "xyz"等,请注意,''或""本身只是一种表示方式,不是字符串的一部分,因此,字符串'abc'只有a,b,c这3个字符。如果'本身也是一个字符,那就可以用""括起来,比如"I'm OK"包含的字符是I,',m,空格,O,K这6个字符。与JS一样,在Python中可以使用表示转义字符,但是在Python中,如果字符串中包含有歧义的转义字符,但是又不需要转义的时候可以使用r''来表达:
print('hello world') # 输出: hello world print(r'hello world') # 输出: hello world
所以,如果字符串里面含有转义字符但是又不期望转义的,只需要在字符串前加上 r 即可实现。
另外,字符串有很多操作的方法,详见《Python学习之路 -- 字符串的方法》
④布尔类型(bool)
与其他编程语言一样,Python也只有两种:True和False,注意首字母大写(在某些编程语言为小写,比如JavaScript),而且在Python中也同样提供了布尔值的或与非运算:
与运算:使用 and 关键字
True and True >>>True True and False >>>False False and False >>>False 5 > 3 and 3 > 1 >>>True 1 and 2 >>>2
或运算:使用 or 关键字
True or True >>>True True or False >>>True False or False >>>False 5 > 3 or 1 > 3 >>>True 1 or 2 >>>1
非运算:使用 not 关键字
not True >>>False not False >>>True not 1 > 2 >>>True
与JavaScript相似的是,在或与运算中,如果运算的两者不是布尔类型,则结果也不会返回一个布尔值,而是返回对应的值(上面标红部分)
⑤空值(None)
空值是Python里一个特殊的值,用None表示(相当于JavaScript中的null)。
⑥列表(list) (相当于JavaScript中的数组)
列表是Python中内置的一种数据类型list,是一种有序的集合,就像JavaScript中的数组一样,都使用方括号 [ ] 来表示,里面存放的被称为元素,一个列表可以存储多个元素(定义一个列表不需要像Java一样定义它的长度,Python中的列表也没有长度限制),也可以随时添加或删除元素;也可以通过下标索引的方式来读取或修改元素。
# 定义一个列表储存人的名字 names = ['Jack','Jonas','Tom','Bob'] # 通过下标索引(从0开始的自然数)读取列表中的元素 print(names[0]) # 输出 Jack # 通过下标索引修改第三个元素Tom为Jerry names[2] = 'Jerry' # 打印整个列表 print(names) # 输出 ['Jack', 'Jonas', 'Jerry', 'Bob']
除了通过索引的方式操作元素以外,列表还提供了很多操作元素的方法,详见《Python学习之路 -- 列表的方法》。
⑦元组(tuple)
元组也是Python内置的一种数据类型,访问元组内的元素与列表也一致,但是与列表不同的是,元组一旦初始化就不能修改,列表使用方括号 [ ] 来表示,而元组使用小括号 ( ) 来表示,使用元组需要注意以下事项:
1、元组一旦初始化,则不能修改,但是如果元组内的元素是可变类型(比如说列表),则可以对元组内的可变类型的数据进行修改:
# 创建一个元组,里面包含了一个列表和两个数字 num_tuple = ([1,2,3],5,6) # 修改列表(append()方法是列表的内置方法,用于向列表的末尾添加元素) num_tuple[0].append(4) # 打印元组观察 print(num_tuple) # 输出:([1,2,3,4],5,6)
2、当元组只储存一个元素时,该元素后必须加上逗号,用于告知解释器该变量储存的数据类型是元组而不是一个小括号
# 如果只有一个元素时,不加逗号 num_tuple = (1) # 打印结果,type()方法用于检查变量的类型 print(num_tuple,type(num_tuple)) # 输出 1 类型为int # 加上逗号才是一个元组,这就是逗号的魅力 num_tuple = (1,) print(num_tuple,type(num_tuple)) # 输出 (1,) 类型为tuple
3、元组内的元素一旦声明则不能修改,但是可以通过del关键字将保存该元组的引用变量删除
4、元组的两个内置方法:count 和index
tuple.count(value)
该方法用于统计value值在元组中出现的次数,结果返回这个次数。
tuple.index(value,start=None,stop=None)
该方法用于检索元组中是否含有value值,若存在,则返回首次出现的下标索引;不存在则会报错。
num_tuple = (1,2,3,4) # 统计2在元组内出现的次数 num = num_tuple.count(2) # 检索3在元组内的索引 num_index = num_tuple.index(3) print(num,num_index) # 输出: 1 2
⑧字典(dict)
同样的,字典也是一种内置数据类型,使用键-值(key-value)的方式存储数据,字典以大括号{ }的形式来表示,一个字典可以存储多个键值对,键与值之间使用冒号:来分隔,而键值对与键值对之间使用逗号来分隔。字典具有极快的查找速度,通过dict['key]的方式来访问对应的value值,但是通过这种方式找不到对应的value则会报错,如果使用字典的内置方法dict.get('key')方法来访问,如果找不到则不会报错,而是返回None
# 创建一个字典表示一个人的信息 person = {'name':'jonas','age':18,'gender':'male','address':'China'} # 访问字典的某个value print(person['name']) # 输出 jonas print(person['salary']) #该属性不存在,程序报错
除了这种操作以外,字典还有很多方法,详见《Python学习之路 -- 字典的方法》
⑨集合(set)
集合也是Python的一种数据类型,集合使用大括号{ }来表示,可以将集合理解为削弱版的字典,因为集合只保存key,没有value,而且保存的key必须是不可变类型,也不能出现重复,如果出现重复的数据,解释器则会直接将重复的过滤掉。
# 创建一个集合 num_set = {1,2,3,3} # 若出现重复的数据,则会直接过滤重复的部分 print(num_set) # 输出{1,2,3} # 向集合中添加元素 num_set.add(4) print(num_set) # 输出{1, 2, 3, 4} # 删除集合中的元素,如果删除集合中没有的元素,则会报错 num_set.remove(2) print(num_set) # 输出{1, 3, 4} # 删除指定元素,如果删除的元素不存也不会报错 num_set.discard(5) print(num_set) # 输出 {1, 3, 4} # 随机删除集合中的元素 num_set.pop() print(num_set) # 输出不确定(因为随机删除)
除了以上的几个方法,集合还有四种逻辑运算:
1、交集(等价于高中数学里面讲的交集,取两个集合的公共部分)
name_set = {'jonas','tom','jerry','ben'} name_set2 = {'jonas','ben'} # 以下两种方法都可以求两个集合的交集,输出{'ben', 'jonas'} print(name_set & name_set2) print(name_set.intersection(name_set2))
2、并集(将两个集合的所有元素合并在一起,但去掉重复的部分)
name_set = {'jonas','tom','jerry','ben'} name_set2 = {'jonas','ben'} # 以下两种方法等价,输出{'tom', 'jerry', 'jonas', 'ben'} print(name_set | name_set2) print(name_set.union(name_set2))
3、差集(举例:A集合与B集合的差集就是A集合有而B集合没有的元素)
name_set = {'jonas','tom','jerry','ben'} name_set2 = {'jonas','ben'} # 以下两种方式等价,输出{'jerry', 'tom'} print(name_set - name_set2) print(name_set.difference(name_set2))
4、交叉补集(举例:先取A,B两个集合的并集,然后减去他们两个的交集,剩下的就是交叉补集)
name_set = {'jonas','tom','jerry','ben'} name_set2 = {'jonas','ben','jack'} # 以下两种方式等价,输出{'jack', 'tom', 'jerry'} print(name_set ^ name_set2) print(name_set.symmetric_difference(name_set2))