Python(三) 基础数据类型

时间:2022-04-30 03:40:08

学习某种编程语言,就肯定避免不了学习它的数据类型,Python也不例外。今天,我们来说说Python的几种常用的数据类型及用法。

Python3具有六种数据类型,分别是:数字,字符串(String),列表(List),元组(Tuple),集合(Set)和字典(Dictionary)


首先来说说数字,Python3中能处理的数字包括整型(int),浮点(float),布尔(bool)和复数(complex)。

值得一提的是,Python3中是没有Long(长整型)这个概念的,一切都是int,试试简单的给某个变量赋值:

a = 1                   //int型
b, c = 3, 4             //可以这样赋值
d = 3.141592653         //float型
e = True                //bool型

我们可以使用内置函数type()来查看一个对象的类型,比如

print(type(a), type(b))

这样,我们就得到了含有数字类型的变量。Python对于科学统计领域来说可谓是占尽优势,对于数字的处理要更为的便捷。如果用Perl语言做对比的话,Perl可能更加擅长处理字符串,而Python在数字处理上更加优秀。所以一般面对不同的问题的时候,适当选用合适的语言也是一门学问。



Python的字符串,赋值起来也十分简单:

a = "This a sentence."
a = 'This a sentence'

Python中允许单引号,双引号来定义字符串,这里我们只做一个大概了解。



列表,Python中使用的一种比较频繁的数据结构,使用一对方括号来表示的数据格式,用来存储其他对象,列表可索引,可拼装,可添加删除修改等。

l = list([1, 2, 3])
l = [1, 2, 3]
l = [[1, 2, 3]]

这三种方式都同时定义了一个列表,其中第一句话和第二句话完全一样,我们可以用print()函数,直接打印观察列表。

print(l)

列表索引:这其中,对于某个元素,我们可以进行索引,比如,l = [1, 2, 3]中,我需要拿到数字2,那我就可以这样写:

a = l[1]

这里需要知道的是,计算机的计数是从0开始的,也就是l中对应的数字1,2,3的索引(index)位置分别是0,1,2

根据上面这步,我们就拿到了数字2的一个对象引用,它直接指向数字2,我们这里的a = l[1],实际上并不是把l[1]的值给a,而是将a的值指向l[1]所在的地址,这点以后可以慢慢讲,目前知道索引的位数就足够了。

列表修改:修改列表的方法有很多,有单元素修改的,有整体列表修改的,这里可以这样理解一下:

l = [1, 2, 3]
l = [2, 3, 4]   #这种是直接替换l指向的对象
l[1] = 2        #这种是改变第一个元素
print(l)        #打印查看
l = [2, 2, 4]   #会发现第一个元素变成2了 

列表拼接:如果我想将两个列表拼接起来,我可以:

l = [1, 2, 3]
r = [2, 3, 4]
l = l + r   #输出就会成为[1, 2, 3, 2, 3, 4]
l = l.extend(r)  #与上一句等价, extend相当于延伸,扩展。这样,我们就可以将两个列表拼接到一起了

列表也支持删除操作,比如我需要删除上述情况l列表中的第二个元素,数字2,那我可以有如下操作:

del l[1]   #这里第一位就会被删除,原列表变成:[1, 3, 2, 3, 4]
del l[3]   #这里删除第三位,列表变成[1, 3, 2, 4]

列表的添加:列表的数据结构近似于一个队列,我们知道队列的特性是FIFO(First In First Out),我们这里添加的新元素,就是从右向左添入(append)列表的,如下:

l = [1, 2, 3]
l.append(4)
l.append(5)
print(l)
#得到 l = [1, 2, 3, 4, 5]

列表的反转:列表同时支持反转元素内的所有元素,比如:

l = [2, 3, 4, 5, 6]
l.reverse()   #这里调用自带反转函数
print(l)
#得到[6, 5, 4, 3, 2]

这里出道题考一下诸位,观察下列代码说出结果:

Q1.
l = [[1, 2, 3]]
l.reverse()
print(l)          

Python自带列表的整理排序,比如一个乱序的列表,就可以通过排序函数自动排序,有必要说一点的是,默认按生序排列,我们可以通过添加参数reverse改变为降序:

l = [8, 2, 5, 2, 3]
l.sort()   #[2, 2, 3, 5, 8]
l.sort(reverse = True)   #[8, 5, 3, 2, 2]
#---------分割线---------
l = sorted(l)
print(l)

这里不难看出,改变reverse可以改变排序方式,True为降序,False为默认升序。sort()函数默认不返回任何值,所以我们可以直接l.sort()这样用,那如果我想将这个引用给其他变量的时候,我可以使用sorted()方法,该方法返回一个排序好的列表,如上所写。

Answer:

Q1. l = [[1, 2, 3]],这里因为是列表套列表,[1, 2, 3]作为l的第0位的元素,也就是l[0],本身不发生改变,但实际上因为l只有一个元素,这个元素就是[1, 2, 3],所以他不会发生变化,但是假如这样:

l = [[2, 3, 4], [1, 2, 3], [1, 3, 5], [2, 4, 5], [1, 4, 2, 6]]
l.sort()
print(l)

他就会按照内部中的元素一个一个比对排序,得到:

l = [[1, 2, 3], [1, 3, 5], [1, 4, 2, 6], [2, 3, 4], [2, 4, 5]]



元组,元组使用一对圆括号来表示数据格式,它的特点就是不可改变(immutable),换言之,当元组内的元素存在后,就不可修改了。元组是一种和列表具有相似特点的数据结构,唯一就是不可修改,如下定义:

t = (5, 4, 3)       #常规定义元组
t = ([5, 4, 3])     #转变一个list变成元组,结果为(5, 4, 3)
t = (3,)            #注意,一个元素的时候,需要添加一个逗号,不然会变成int型

这里需要说的部分就是,当元组成员中只有一个元素的时候,需要添加逗号表达一个元素的元组。

元组支持索引,但是不可修改,支持拼接操作,同列表。

t = (1, 2, 3)         #两个元组
o = (4, 5, 6)
t = t + o             #拼接为(1, 2, 3, 4, 5, 6)
print(t[2])           #打印出3


集合,Python中的集合概念,与数学中的集合概念相同。元素唯一性

s = set([1, 2, 3, 4, 4, 2, 1])  #其中的4,2,1重复多次,集合会自动删去这些元素,只出现一次
print(s)                        #得到{1, 2, 3, 4}

集合会保留最大不重复元素,在某些情况中,某些问题中,这种结构很有帮助


字典,这可是一个大项,Python中的字典也是Hash实现的,我个人是个字典狂魔,使用字典的频率远超以上所有结构,为什么?因为好用。字典的数据结构是使用一种映射关系对应,俗话说叫一个萝卜一个坑,加入我有一个列表l,其中的元素包括['1', '2', '3'],我又有一个列表p,其中的元素包括['A', 'B', 'C']三个元素。字典就是用映射的思想,将l中的元素,看作key,将p中的元素,看作value,形成一个个key: value的映射(map)关系。每当我们去查找l[0]这个位置的key的时候,它会返回它的value,假设我们这里映射的是'A',那我们查找起来就比较方便了。这种数据结构给一些条件提供了极大的便利,比如累加元素统计个数,字典的缺点是占用更多的空间。此外,讲到这里,稍为说一下,一个字典空间是有限的,当字典快满之后,需要重新申请更大的空间来存储新的值,有兴趣的同学可以去查查这块。

字典如下定义:

d = {}        #定义一个空字典
d = dict()    #第二种方式定义空字典
d['0'] = 'A'  #赋值了一组key:value '0':'A'
d['1'] = 'B'  #添加了新的一组
d['1'] = 'C'  #注意,字典只允许存在一个键(key),所以'1':'B'不存在了,替换成'1':'c'
d = {'0':'A', '1':'B', '2':'C'}#第三种定义字典方式

这里的元素的数据类型是string,还可以有任何一种类型,比如d['1'] = [1, 2, 3],或者更复杂的d['2'] = {'A': 'Hello', 'B': [3, 4, 5]}等。这些都是需要遇到实际问题来决定的,下面讲一些字典的常用方法。

我们在使用字典的时候,要知道字典是无序的,上面那段代码中的键(key):'0','1'在字典中没有任何顺序而言,如果要访问字典的大小,我们可以使用length函数,他的写法是:

len(d)      #这里会打印字典d的长度,这种方法同样适用于string, list, set, tuple, dict。其中字典里的len()会返回字典中元素的个数,也就是有多少个key: value组合,我们这里有两个,所以是2。

如果我们想要访问字典的键,我们可以使用key函数:

d.keys()

如果我们需要访问值,我们可以使用value函数:

d.values()

它会返回一个dict_values对象,里面包含所有values(同样是无序的,但是字典知道哪个key和这个value对应)。

那肯定有人会问了,有没有直接返回键值对的方法?有:

d.items()

这个方法会返回dict_items对象。

修改字典:

修改字典的方法有很多,假如知道了key,我们想对应修改值(value):

d.update({'1':'5'})  #修改key l的值为'5'
d['l'] = '5'         #另一种方法修改key l

删除字典键:

del d['l']    #删除键为l的键值对,key不存在时,value自然不存在

删除清空字典:

d.clear()      #清空字典,该句等同于  d = {}  这种重新建空的方法
del d          #直接删除字典,执行之后不存在字典变量d

额外讲一个我喜欢的小方法设置默认一组键值对:

d = {}
d.setdefault(key, value)    #这样就创建了一个 {key: value}的字典

这样写的好处其实有些情况会用到,比如刚才说到的统计,我们假设统计出现的字符:

d = {}
for i in ['a', 'b', 'c', 'c', 'c', 'd']:
    d[i] = d.setdefault(i, 0) + 1            #这里setdefault使得对应的key初始值都是0,然后每次遇到一个值都会给当前key的 value + 1
print(d)
#结果为: {'a':1, 'b':1, 'c':3, 'd':1},字典无序,这是其中一种输出

今天先说到这里,这几种数据结构和类型都是比较基础的,下面给大家出一点题,试着写出结果:

Q3
l = [2, 3, 7, 4, 9, 1, 2]
b = sorted(l)       
print(l)        
Q4
l = [2, 3, 7, 4, 9, 1, 2]
l.sort(reverse = True)
print(l)
Q5
a, b, c = 3, 7, 3.5556
l = [2, a, b, 4, 9, c, 2, 2, 1]
l = set(l)
print(l)
Q6
l = [2, a, b, 4, 9, c, 2, 2, 1]
l.reverse()  
print(l)     
Q7
print(l[4])
Q8
# s = (3)     #判断是否合法
Q9
d = {'a': 1, 'b': 73, 'z': 'c', 't': 3.1415926}
d['b'] = d['t'] + 1
print(d) 






正确答案:

Q3: [2, 3, 7, 4, 9, 1, 2]                 打印的是l
Q4: [9, 7, 4, 3, 2, 2, 1]                 降序
Q5: {1, 2, 3.5556, 3, 4, 7, 9}            是一个集合,去重
Q6: [1, 2, 2, 3.5556, 9, 4, 7, 3, 2]      反转
Q7: 9
Q8: 不合法,单元素的set需要添加逗号: set(3,)
Q9: {'a': 1, 'b': 4.1415926, 't': 3.1415926, 'z': 'c'}