发布于2019-08-22 16:42 阅读(451) 评论(0) 点赞(18) 收藏(4)
基本数据类型就是:整型、浮点型、字符串型
列表元组等是高级的数据类型;
内存是用来 存储数据,并直接跟CPU连接,即CPU读取内存里面的内容;内存的基本单位是以字节来存储单元的,一共字节是八位;计算机的存储空间是作为一个整体的空间,这个空间以字节来作为最小的存储单元,每个字节是由八位构成,当计算机需要寻找存储空间的某元素的时候,会根据字节的编号寻 找,即每次 能读取八个位也就是一共字节,对于三十二位的计算机,一共基本整型需要占四个字节,例如对于一个整型 int a =1,在计算机内部以二进制存储,占四个字节每个字节八位,其中前三个字节的八个位都存的0,最后一共字节前七个位存的0,最后一个位存的1,这样就完成了整型1在计算机里面的存储;
字符(char),一个字符占一个字节
一个列表是以顺序表的形式存储,即第一个元素存储之后,紧接着第二个元素开始存储,这样找出了第一个元素的位置,后面元素的位置也就相应的找出来了;操作系统会一次性给出列表所需的内存,以整体给出;
因此编号从0 开始,其实就是位置在第一个初始位置的偏移量,第一个位置偏移0,第二个位置偏移1,
当列表中 存储的是不同类型的数据形式的时候,则不能按照上面的顺序表来计算了;
因此需要用地址来存取,即存储元素的位置的编号,每个地址的大小不一样,根据元素大小来确定其大小,但是每一个地址的大小一样,都是四个字节 地址指向需要存的数据 ,这种方法叫做元素外置的方法;
综上所述,顺序表有两种基本的形式,内置和外置,其中内置是直接存取元素,外置是先存数据的位置,在通过位置找到其对应 的元素;
python已经对顺序表进行封装,不需要自行设置;
通常顺序表还会有一个表头信息,表头信息包含容量和元素个数
链表:
链表是每出现一个数据就申请相应的空间存储起来,各元素之间的存储是无序的,然后让每一个存储数据的位置多出一部分,这一部分存储指向下一个数据的位置内容,从而形成链表;这种方式不会先计算整个数据结构所需的存储空间的,而是出现一个存储一个;即需要两个位置,第一个叫数据区,第二个叫链接区;链表和顺序表统称为线性表;最后一个位置的链接区指向空;
python中等号只是说明一个指向,等号左边的内容指向右边的内容
- #视频课程内容
- #定义一个节点的代码
- class Node(object):#顶一个一个节点
- def __init__(self,element):
- self.element=element
- self.next=None#此时节点还没有串起来,因此指向None,
- '''
- node=node1
- node=node2#实现链表中各个节点的的传递
- '''
- class Singlelinklist(object):#此时的单链表就是一个新的数据类型,这个数据类型含有一些数据,同时支持以下几种访问的方法
- def __init__(self,node=None):#不传入node的时候是空的链表
- self._head=node#新定义的单链表中包含的元素是节点,里面包括元素内容和next
- #且是一个私有属性,即只能内部访问,即单链表中的元素是内部私有属性
- def is_empty(self):
- return self._head==None
- def length(self):
- cur=self._head#用来移动遍历节点
- count=0#用来记录数量
- while cur != None:
- count+=1
- cur=cur.next
- return count
- def travel(self):
- cur=self._head
- while cur!=None:
- print(cur.element,end=' ')
- cur=cur.next
- def append(self,item):#尾部添加元素
- node=Node(item)
- cur=self._head
- if self.is_empty():
- self._head=node
- else:
- while cur.next!=None:
- cur=cur.next
- cur.next=node
- def add(self,item):#在头部增加元素
- node=Node(item)
- if self.is_empty():
- self._head=node
- else:
- node.next=self._head
- self._head=node
- def insert(self,pos,item):#在指定位置添加元素,在pos之前加入
- node=Node(item)
- #通过定义前一个节点pre来达到插入的效果
- if pos <=0:
- self.add(item)
- elif pos >self.length()-1 :
- self.append(item)
- else:
- pre=self._head
- count=0
- while count<pos-1:
- count+=1
- pre=pre.next
- node.next=pre.next
- pre.next=node
-
- def remove(self,item):
- if not self.is_empty():
- pre=self._head
- if pre.element==item:
- self._head=pre.next
- else:
- while pre.next.element!=item:
- pre=pre.next
- cur=pre.next
- pre.next=cur.next
- return self.travel()
- else:
- raise ValueError("item don't exist")
- def search(self,item):
- cur=self._head
- while cur!=None:
- if cur.element==item:
- return True
- else:
- cur=cur.next
- return False
- if __name__=='__main__':
- ll=Singlelinklist() #构建了一个空的单链表,里面有_head属性
- print(ll.is_empty())
- print(ll.length())
- ll.append(1)
- ll.append(2)
- ll.append(3)
- ll.length()
- ll.add(8)
- ll.insert(-1,5)
- ll.travel()
- print('\n')
- ll.remove(2)
#双向链表
- class Doublelinklist(Singlelinklist):#继承单链表的长度、是否位空、遍历以及查找这几种方法
- def __init__(self,node=None):
- self._head=node
- self.__next=None
- self.__prev=None
- #这些标注了的方法可以重新定义,也可以继承
- # def is_empty(self):
- # return self._head==None
- # def length(self):
- # cur=self._head#用来移动遍历节点
- # count=0#用来记录数量
- # while cur != None:
- # count+=1
- # cur=cur.next
- # return count
- # def travel(self):
- # cur=self._head
- # while cur!=None:
- # print(cur.element,end=' ')
- # cur=cur.next
- def add(self,item):#头部插入元素
- node=Node(item)
- node.next=self._head#建立向后索引的指针
- self._head=node#定义新的头节点
- node.next.prev=node#向前添加指针
- def append(self,item):#在链表的尾部添加元素
- node=Node(item)
- if self.is_empty():
- self._head=node
- else:
- cur=self._head
- while cur.next !=None:
- cur=cur.next
- cur.next=node
- node.prev=cur
- def insert(self,pos,item):#在指定位置插入
- node=Node(item)
- if self.is_empty():
- self._head=node
- elif pos==self.length()-1:
- self.append(item)
- else:
- cur=self._head
- count=0
- while count<pos:#这种算法还是需要从头节点开始遍历到指定位置
- cur=cur.next
- count+=1
- cur.prev.next=node
- node.prev=cur.prev
- node.next=cur
- cur.prev=node
-
-
- def remove(self,item):
- cur=self._head
- # pre=None
- # while cur!=None:
- # if cur.element==item:
- # if cur==self._head:
- # self._head=cur.next
- # else:
- # pre.next=cur.next
- # break
- # else:
- # pre=cur
- # cur=cur.next
- if cur.next==None:#序列为空的时候
- return None
- else:
- while cur !=None:
- if cur.element==item:
- if cur==self._head:
- self._head=cur.next
- elif cur.next==None:
- cur.prev.next=None
- else:
- cur.prev.next=cur.next
- cur.next.prev=cur.prev
- break
- else:
- cur=cur.next
- return self.travel()
- # def search(self,item):
- # cur=self._head
- # while cur!= None:
- # if cur.element==item:#由于定义node的时候已经调用了Node类,故已经有了ele属性
- # return True
- # else:
- # cur=cur.next
- # return False
-
- if __name__=='__main__':
- ll=Doublelinklist() #构建了一个空的单链表,里面有_head属性
- print(ll.length())
- #print(ll.is_empty)
- ll.append(1)
- ll.append(2)
- ll.append(3)
- ll.add(8)
- ll.insert(1,5)
- ll.travel()
- print('\n')
- ll.remove(2)
单向循环链表
- #单向循环链表
- class Singlelinklist(object):#此时的单链表就是一个新的数据类型,这个数据类型含有一些数据,同时支持以下几种访问的方法
- def __init__(self,node=None):#不传入node的时候是空的链表
- self._head=node
- if node:#如果传入了一个节点,需要回到它本身
- node.next=node
- def is_empty(self):
- return self._head==None
- def length(self):
- cur=self._head#用来移动遍历节点
- if self.is_empty():
- return 0
- count=1#用来记录数量
- while cur.next != self._head:#尾节点判别需要修改
- count+=1
- cur=cur.next
- return count
- def travel(self):
- cur=self._head
- while cur.next!=self._head:
- print(cur.element,end=' ')
- cur=cur.next
- print(cur.element)#最后一个节点需要单独打印
-
- def append(self,item):#尾部添加元素
- node=Node(item)
- cur=self._head
- if self.is_empty():
- self._head=node
- node.next=node
- else:
- while cur.next!=self._head:
- cur=cur.next
- cur.next=node
- node.next=self._head
-
- def add(self,item):#在头部增加元素
- node=Node(item)
- if self.is_empty():
- self._head=node
- node.next=node
- else:
- cur=self._head
- while cur.next != self._head:
- cur=cur.next
- cur.next=node
- node.next=self._head
- self._head=node
-
- def insert(self,pos,item):#在指定位置添加元素,在pos之前加入
- node=Node(item)
- #通过定义前一个节点pre来达到插入的效果
- if pos <=0:
- self.add(item)
- elif pos >self.length()-1 :
- self.append(item)
- else:
- pre=self._head
- count=0
- while count<pos-1:
- count+=1
- pre=pre.next
- node.next=pre.next
- pre.next=node
-
- def remove(self,item):
- if not self.is_empty():
- pre=self._head
- cur=self._head
- prex=None
- if self._head.element==item:
- self._head=None
- return None
- while cur.next != self._head:
- prex=cur
- cur=cur.next
- if pre.element==item: #头节点
- cur.next=pre.next
- self._head=pre.next
- return self.travel()
- elif cur.element==item:#尾节点
- prex.next=self._head
- else:
- while pre.next.element!=item:
- pre=pre.next
- cur=pre.next
- pre.next=cur.next
- return self.travel()
- else:
- raise ValueError("item doesn't exist")
-
- def search(self,item):
- if self.is_empty():
- return False
- cur=self._head
- while cur.next != self._head :
- if cur.element==item:
- return True
- else:
- cur=cur.next
- if cur.element==item:
- return True
- else:
- return False
-
- #方法必须带上括号,属性不需要带上括号
- if __name__=='__main__':
- ll=Singlelinklist() #构建了一个空的单链表,里面有_head属性
- print(ll.length())
- print(ll.is_empty())
-
- print(ll.search(5))
- ll.append(1)
- ll.remove(1)
- ll.append(2)
- ll.append(3)
- ll.add(8)
- ll.insert(1,5)
- ll.travel()
- print('\n')
- ll.remove(3)
- print(ll.search(5))
在面向对象的编程中,如果希望某个类中的属性只能通过类里面定义的方法来访问,而不能直接由类的实例访问属性,则将类定义成私有变量,即名称前加入两个下划线,如果要通过外部访问,那么这个私有变量的名称在内部已经变成了 下划线+类名+双下划线+属性名
作者:3434erer
链接:https://www.pythonheidong.com/blog/article/52990/be81bc5750c06c6734e2/
来源:python黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 python黑洞网 All Rights Reserved 版权所有,并保留所有权利。 京ICP备18063182号-1
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!