zoukankan      html  css  js  c++  java
  • Python Linked List

    上周日教导一个科班非技术的朋友学习 Python 编程。他的 Python 水平大概就是看了几篇短的 Python 介绍博客、会流程控制和全局函数编写。
    具体教导思路是从自己实现一个链表出发,研究学习 Python 数据结构、接口、算法的实现和运用、然后:
    0. 学会画图表达对象之间的关联、数据结构的操作、并实现它。

    1. 慢慢用 Python 的特性去优化链表、学习 Python 特性与最佳实践;
    2. 刷 Leetcode 链表题目、锻炼思维;
    3. 熟悉之后、在进行二叉排序树的 0、1、2。

    昨天算是实现了一个带遍历、插入、删除的 LinkedList。但是写的很长、大概用到的“新”特性只有 Python 的类。

    今天打算让他快速前进,尝试拔苗助长ing:

    1. 理解成员函数的self、了解函数的默认参数;
    2. 理解抛出异常的代码写法和运行现象;
    3. 还有再学习一下类的特殊方法 __len____str__
    4. 理解鸭子类型:
      • Python 有个逻辑:不管你是什么动物,会嘎嘎叫的就是鸭子;
      • 你想想看 ListLink.head 和 Node.next 是不是一个东西?
      • 可不可以起成同一个名字 把它当成嘎嘎叫方法 (next),从而简化我们的代码;
      • 如果把 ListLink 当作鸭子类,那么Node也是一个鸭子类;
      • 关键:Node 和 ListLink 一样,也有 next 属性;两者的 next 属性的性质一样,要么是 None,要么是一个有 data 有 next 的对象;
      • 另一种理解:链表第一个结点之后的部分还是一个完整的链表。
    5. 理解函数是一等公民 -- 下面代码还没实现、因为已经有 __iter__ 了没有必要了。

    个人感觉4讲早了,但是看他写的又长又臭,忍不住不教。

    代码:

    class Stack:
        class Node:
            def __init__(self, data, next = None):
                self.data = data
                self.next = next
        def __init__(self):
            self.next = None
        def push(self, data = None, index = 0):
            if index < 0 or index > len(self):
                raise IndexError("Given index is invalid.")
            cur = self
            for i in range(index):
                cur = cur.next
            cur.next = Node(data, cur.next)
        def pop(self, index = 0):
            if index < 0 or index >= len(self):
                raise IndexError("Given index is invalid.")
            cur = self
            for i in range(index):
                cur = cur.next
            retval = cur.next.data
            cur.next = cur.next.next
            return retval
        def __iter__(self):
            cur = self
            while cur.next is not None:
                yield cur.next.data
                cur = cur.next
        def __len__(self):
            len = 0
            cur = self
            while cur.next is not None:
                len = len + 1
                cur = cur.next
            return len
        def __str__(self):
            cur = self
            if cur.next is None:
                return "[]"
            st = "["            
            while cur.next.next is not None:
                st = st + str(cur.next.data) + ", "
                cur = cur.next
            st = st + str(cur.next.data) + "]"
            return st
    

    测试:

    s = Stack()
    print(s)
    s.push(1)
    print(s)
    s.push(0.5)
    print(s)
    s.push(1.5, 1)
    print(s)
    s.push(2, 3)
    print(s)
    print(s.pop())
    print(s)
    print(s.pop(2))
    print(s)
    

    输出:

    []
    [1]
    [0.5, 1]
    [0.5, 1.5, 1]
    [0.5, 1.5, 1, 2]
    0.5
    [1.5, 1, 2]
    2
    [1.5, 1]
    
  • 相关阅读:
    086 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 03 面向对象基础总结 01 面向对象基础(类和对象)总结
    085 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 02 构造方法介绍 04 构造方法调用
    jQuery UI组件库Kendo UI使用技巧小分享
    Kendo UI ListView模板功能,让Web开发更轻松
    UI组件套包DevExpress ASP.NET Core v20.2新版亮点:全新的查询生成器
    Devexpress WinForms最新版开发.NET环境配置Visual Studo和SQL Server对应版本
    全新的桌面应用数据可视化呈现方式,Sankey Diagram控件你了解多少?
    java中的递归方法
    连接数据库查询 将查询结果写入exce文件中
    java连接mysql数据查询数据
  • 原文地址:https://www.cnblogs.com/tjua/p/10486491.html
Copyright © 2011-2022 走看看