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]
    
  • 相关阅读:
    log4j.properties 配置示例
    spark去重计数操作(代码示例)
    mysql数据库
    Mysql之sql语句操作
    mysql修改root密码的多种方法
    mysql的主从复制过程
    mysql命令用法复习笔记
    Linux下如何查看系统启动时间和运行时间安装时间
    一键系统优化15项脚本
    MongoDB
  • 原文地址:https://www.cnblogs.com/tjua/p/10486491.html
Copyright © 2011-2022 走看看