python学习小笔记1

       前序

        现在毕业之后工作已有一年,当年在学校中的意气风发现在已经渐渐被磨平,平常的工作更多的也只是做着一些重复性的工作,能好好学习和反刍的时间也比较少,现在也只能抓住一些日常闲暇的时间去学一下前沿领域的技术,同时也做做小笔记,以防健忘和以备日后查询使用。

        我如今在某中国头部城商行做数据分析方面的工作,其实日常工作接触较多的是sql和sas这类语言,python虽然作为公司推广使用的未来之星,但其实也很少有人去系统性地学了。我在大学期间学过大约两年的python,主要是python的基础语法,数据处理和机器学习方面的。现在除了一些基本语法,其他那些比如使用pandas处理数据,或者手撕一个机器学习算法其实已经忘的差不多了。但面对这个日新月异的社会,不断的学习进步对于我们做技术的人来说其实非常重要,在学习的过程中,如果能留下一些记录,对于自我的理解会更有帮助,甚至能供他人参考那就更加好了。所以想通过这些笔记去重拾python这门技术。

        今天先写一个使用python实现链表这样的数据结构,对于写编程的人来说,链表应该是不陌生的,基本是必学必会的基础。何为数据结构,可以理解为计算机存储数据以及建立数据间的联系的一种方式。程序在电脑上跑的时候,数据是在内存单元中去存储和计算的,此时,如果你新建一个变量a=1,那就是在内存单元中开辟了一块内存空间,针对python这类面向对象语言来说,这块内存空间就会存储一个整数对象,该对象的值是1,而a是一个标签,它会指向这个内存空间,通过a可以访问到这个内存空间中的值,以此类推,如果你再定义一个b=1,那其实就是新增了一个标签,名字是b,它也会指向1这个内存空间,a和b都能访问到相同的对象。

        当有多个数据在内存空间中的时候,并且数据之间存在关联性,需要能相互访问,这个时候就需要用到如数组和链表这些数据结构。数组这种数据结构存储的数据在内存中是连续的,也就是说它们在内存中的id值是连续的。而链表在内存中是“飘忽不定”的,但是它依然能做到关联性访问,原因就在于它的next指针。

        以下是数组的数据模型:

 

 以下是链表的数据模型:

         如上图所示,箭头其实就是链表中的next指针,它会对当前节点的下一个节点做一个指向,指明其下一个节点所在的位置。

        在这里,我们运用python面向对象的特性,将链表拆解成两块对象去理解,一个是链表的整体作为一个对象,一个是链表中每个节点又是一个独立的对象。对象来源于类的实例化。

        类,其实就是事物的抽象,世间万物都可以分门别类。比如人,有黄种人、白种人、黑种人的分别,但是其都归属于人类这个类别,这类别下的实例都是有相同的属性的,只不过属性间的值有所不同而已。就好比人类中的黄种人和白种人,都是有皮肤的,但是皮肤的颜色不同,这就是属性一样,但是属性的特性不一样。

        图中链表这里的每个节点都是Node类的一个实例化,它具有自身的值val和next的属性,val的取值有1,2,3的区别,同时next指针指向也有不同。链表这个对象也有相应的属性,这里的1节点是链表的头节点(head),3是链表的尾节点(tail)。同时类还可以拥有类方法,方法是类中的一个操作性的功能,相当于是所有人类都会吃饭、睡觉这类基本操作,我们也可以定义某个类它拥有这样的能力。这里我们会定义链表类拥有添加自身节点和遍历节点的能力。

        关于类的详细知识在这里不赘述了,往后可能也会更新这类知识进来,接下来就直接上链表的python实现代码:

#定义节点类
class Node():
    def __init__(self,val):
        self.val=val
        self.next=None
#定义链表类,add_node是添加节点的方法,travle_node是遍历链表中所有节点的方法
class List_tb():
    def __init__(self):
        self.head=None
        self.tail=None
    def add_node(self,val):
        n=Node(val)
        if self.head is None:
            self.head=n
            self.tail=n
        else:
            tmp_tail=self.tail
            self.tail=n
            tmp_tail.next=self.tail
    def travle_node(self):
        tmp_head=self.head
        while tmp_head is not None:
            print(tmp_head.val)
            tmp_head=tmp_head.next
#实例化一个链表对象
lt=List_tb()
#调用方法添加节点
lt.add_node(1)
lt.add_node(2)
lt.add_node(3)

#调用方法遍历节点,下面是输出结果
lt.travle_node()

1
2
3

        这只是链表里面最简单的一种形式,链表的变形很多,有双向指针链表,有头尾连在一起的环形链表,也有尾部连在中间的变幻式,总之,编程的世界很宽广,还是需要保持好学和谦虚的态度不断拾珍的。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值