当前位置: 首页 > 后端技术 > Python

Python应用(五):变量类型与数据结构

时间:2023-03-26 14:08:09 Python

前面说过,写程序就像给算法写壳,而算法就是过程,所以过程是程序的主角(不过这个过程不一定要求你设计它)。在程序中,为了配合流程(算法)的实现,除了使用序列、分支和循环语句外,还使用了“变量”的作用。变量是一个重要的角色,男二号。一个变量表示一个可变的值,但这个值有一个范围。并不是所有的值都可以放在同一个变量中。值的范围由变量的类型决定。变量的类型决定了两件事,一是用多少空间来存储变量值,二是变量值的范围。嗯,这个不重要,忽略细节,先使用变量,掌握一些基础知识。有哪些类型的变量?(1)numbers、bool和string这三种类型是常见的内置类型。注意,值决定了变量的类型,你给变量赋什么值,就是什么类型。例如:a=10#int整型a=9.9#float浮点数类型。变量名还是a,但是值变了,成为新的变量a=987654321L#longlonginteger类型,值以'L'结尾a=3+4j#complexcomplextype以上变量类型,分别是int、float、long和complex类型,这些类型都可以归类为数字类型。python中的值除了数字类型,还有bool类型和str字符串类型,例如:a=False#bool类型,取值要么是False,要么是Truea="hellotype"#str字符串类型想知道的当前变量是什么类型,可以使用内置函数(python提供的一组函数)type()来确认,比如注意type()的输出:所以,基本上,python变量类型,包括数值类型(int/float/long/complex)、bool和str。其中str,也就是字符串,经常会遇到对它的操作,比如:a="hellotype"a[1:]#从第一个字符到最后(注意索引从0开始)a[2:]a="123456"a[1:5]#第一个字符到第五个字符的内容,不包括第五个字符,即左闭右开a[-1的区间]#-1表示最后一个字符,-2表示倒数第二个字符,以此类推。执行效果:(2)常用数据结构除了上面常见的内置变量类型,pyton还提供了一些常用的数据结构,也是变量类型。数据结构是为算法服务的,但是有些数据结构太常用了,很多算法都有,所以把这些常用的数据结构抽出来作为一个独立的认识点也是个不错的主意。很有道理,但显然不是本文要讨论的问题。数据结构就是数据的组织结构,每一种数据结构都必须有自己的组织特点。python中有几种常见的内置数据结构。因为经常被使用,甚至被认为是变量类型,和数值类型bool、str一样存在。这些常见的数据结构是:列表、元组、集合和字典。同样,值决定了类型(或数据结构)。list是一个list,也是用value定义的(用[]定义),例如:a=[1,2,3,4]#listtype(a)list的操作类似于string,例如:tuple是元素Group是一个只读列表(由()定义),即元组的内容不允许被修改,例如:a=('hellotuple',123,True)a[0]a[1]=100#尝试修改元组的内容会报错a*2#操作与列表一致,内容重复两次,生成新的元组b=(1,2)a+b#可以添加元组,因为生成新的元组并没有修改原来的元组,执行效果如下:列表和元组的特点是可以存储任意类型的元素,并且内容有序且可重复。另一种常见的数据结构是集合,其特点是可以存储任意类型的元素,而且内容是无序的,不能重复。这是集合的特征。集合部分使用如下(由{}定义):a={2,True,'helloset'}a[2]#集合集合是无序的,所以根本没有索引,尝试使用索引会导致错误b=set('helloset')#使用构造函数创建集合,注意集合中的元素会被去重(这里的元素是字符)b={'a','a',1}#对元素进行去重效果如下:最后一个数据结构是dict,是一个字典。dict也是一个集合,它是键值对(key-value)的集合,也是用{}定义的,但是包括key和value,例如:d={'k1':1,'k2':2}dict和set同理,内容乱序,key不能重复。该集合只保留键(无序且不重复),并删除值。字典的各部分使用如下:d={}d['k1']="hellodict"d[2]="thisisint"d[True]="booltrue"a={'a':'firstone','d':'hellodict',3:'three','e':34.45}执行效果如下:实际场景中可能会应用以上四种内置类型之间的转换,操作非常简单。需要使用类型名来处理需要转换的值,例如:a=list(set1)#type_name(xxx)以上是对list、tuple、set、dict的简单介绍,可以使用他们根据实际场景。另外,我没有介绍这四种数据结构的操作函数。其实封装出来的数据结构有一系列的操作函数,也就是对象的行为(对象不是指女朋友),比如上面的数据结构,有一系列的append()、pop()、remove()等操作,在实践中会理解和使用。(3)变量类型的使用示例无论是简单的变量类型(数字类型等)还是普通的数据结构(列表等),都可以归为变量类型。这些变量类型经常被使用,因为变量是程序的重要支持者。我这里举几个例子,都是用链表作为栈来解决问题的。希望能让大家对变量类型有个概念,然后在实际场景中灵活运用。(a)判断左右符号是否与左符号配对:([{rightsymbol:)]}如果配对,如:'([]){()}',如果不配对,例如:'[{]}]'。用栈来理解就是:遍历所有的字符。如果遇到左边的符号,则将其压入堆栈;如果遇到正确的符号,则弹出(如果为空,则直接返回False)。如果出栈返回的字符与正确的符号不匹配,则返回False。遍历完所有字符后,如果栈不为空则返回False,否则返回True。defsybol_match(str):L=['(','{','['];R=[')','}',']'];s=[]forcinstr:ifcinL:s.append(c)else:ifnots:returnFalsea=s.pop()lp=L.index(a)rp=R.index(c)iflp!=rp:returnFalsereturnnots(b)计算后缀表达式计算表达式时,表达式可以作为中缀或后缀输入,后缀表达式因为不需要使用括号简化了处理,所以是一个共同的选择。例如:中缀:12(2/2)后缀:1222/中缀:10-(23)后缀:1023-中缀:(3-2)(9/3)+5后缀:32-93/5+可以画个树图然后看懂(比如后缀遍历得到后缀表达式)。用栈来理解就是:遍历所有的拆分项(以空格分隔)。当遇到数字时,将其压入堆栈;遇到运算符就出栈两次(这里简化为二元运算,第一次出栈为参数2,第二次出栈为参数1),运算,结果入栈。遍历所有拆分项后,返回栈中的内容(只有一个值)。operators={'+':lambdap1,p2:p1+p2,'-':lambdap1,p2:p1-p2,'*':lambdap1,p2:p1*p2,'/':lambdap1,p2:p1/p2,}defcalc_postfix(str):expr=str.split()s=[]foreinexpr:ife.isdigit():s.append(int(e))else:f=operators[e]p2=s.pop()p1=s.pop()s.append(f(p1,p2))returns.pop()(c)背包问题有几个物品,每个物品都有一个重量。背包有最大容量限制,求所有刚好填满背包最大容量的解。例如:itemnameweightitem01kgitem18kgitem24kgitem33kgitem45kgitem52kgbackpackcanholdupto10kg,possiblesolutionsare:[0,2,3,5],[1,5]等待。用栈来理解就是:想装多少就装多少(按照物品的先后顺序,装得下就行),如果剩余容量刚好为0或者后面的物品全部装不下,则弹出入栈,即取出最后一项k,然后继续从k+1项开始加载。当堆栈为空且填充项的索引超出范围时,循环结束。由于栈会一直出栈直到没有item为止,然后从下一个item开始填充,所以肯定存在栈为空没有item加载的情况。defknapsack(w,ws):"""w--背包容量ws--物品重量列表[1,3,..]"""ret=[]s=[]i=0cnt=len(ws)rest=wwhilesori0:#仍需填充且有容量ifrest>=ws[i]:#能装就装s.append(i)rest-=ws[i]i+=1#不管当前能不能装,试试下一个ifrest==0:ret.append(s[:])#一个解决方案i=s.pop()rest+=ws[i]i+=1returnretif__name__=='__main__':#print(sybol_match('[{()}]{}[()]()'))#print(sybol_match('[({}])'))#print(calc_postfix('1222/*'))#print(calc_postfix('32-93/*5+'))ret=knapsack(10,[1,8,4,3,5,2])print(ret)上面是几个例子,你不需要关心算法的设计,因为这个又是另外一个话题,重点讲一下代码中变量类型的使用,比如list、dict等的使用。好了,本文介绍python的变量类型和通用数据结构。您还可以使用内置数据结构作为变量类型。变量类型包括int、float、long、complex、bool、list、tuple、set、dict。在文章的最后,我也给出了几个使用list的例子,希望能帮助大家理解变量类型的使用。偶然再见,再见。