当前位置:   article > 正文

2021SC@SDUSC移动互联网项目分析——网站搭建(一)_移动互联网技术实例开发

移动互联网技术实例开发

2021SC@SDUSC

之前分析了三个教学案例APP,现在开始分析网站的搭建,本篇文章主要分析如何用python将文本格式转为html的目录。

目录

简介

所需基本知识

Python Class

_init_()函数

Python Lambda

语法

实例

文本结构转为Tree

TreeNode类

Tree类

_init_()

add()

getall_depth()

findnextall()

hasnext()

getmaxdepth()

将文本构造成树


简介

由于此项目是一个类似于菜鸟教程的静态教学网站,因此需要先搭建静态网站,再将web网站部署到Docker中,便于他人访问。

项目由多个静态页面组成,为了开发方便,开发者将文本格式的网站结构用python改为html中<ul><li></li></ul>的形式,便于网页的展示。

文本格式的网站结构

所需基本知识

Python Class

Python是面向对象语言,类是一组具有相同属性和行为的对象的抽象,实例是根据类创建的对象。

在Python中,和大多数面向对象语言一样通过class关键字定义类,Python3中类基本都会继承于Object类。类中包括属性和行为(函数)。

在类的内部,使用 def 关键字来定义方法,与一般函数定义不同,类方法必须第一个参数为 self, self 代表的是类的实例(即你还未创建类的实例),其他参数和普通函数是完全一样。

_init_()函数

_init_()方法的第一个参数必须是self(self代表类的实例),后续参数可以自由指定。

_init_()函数的用法类似于java中的构造方法,但它不是构造方法,Python中创建实例的方法是_new_() ,这个方法在python中大多数使用默认方法,不需要重新定义。

Python Lambda

匿名函数lambda是一类无需定义标识符(函数名)的函数或者子程序,它可以接受仍以多个参数(包括可选参数)并返回单个表达式的值。

语法

lambda [arg1[,arg2,.....argn]] : expression

实例

一个lambda函数,把参数a与参数b相乘并打印结果:

x = lambda a,b:a*b

print(x(5,6))

文本结构转为Tree

将文本结构转为html中的目录,开发者使用树结构,定义了TreeNode和Tree两个类。

TreeNode类

由数据结构课程中学到的知识我们可知,树结构中的节点保存了指向前一个节点和后一个节点的指针。此项目中,开发者仅保留了指向父节点的指针。

Python中_init_()函数的用法类似于java中的构造方法,但它不是构造方法。_init_()方法的第一个参数必须是self,self表示类的实例。

由代码可知,TreeNode有fatherNode(父节点)、thisNode(本节点)、depth(节点深度)三个属性。

 _init_()方法传入参数fatherNode、thisNode、depth,将参数中的fatherNode、thisNode、depth赋值给TreeNode实例的fatherNode、thisNode、depth,完成treeNode实例的初始化。

printinto()函数主要完成打印TreeNode信息的操作。

Tree类

Tree类的属性有存放TreeNode的数组tree,还包含add()、getall_depth()、findnextall()、hasnext、getmaxdepth()、gettree()、print()函数。

_init_()

 第一个_init_()函数中只有pass语句,pass是空语句,是为了保持结构的完整性,不做任何事情,一般用作占位语句。

第二个函数_init(),传入参数mylist,赋值给Tree类中的tree属性,完成树的初始化操作。

add()

add()函数主要完成将树节点加入树中的操作,传入参数treenode

 通过self.tree获取到此实例的tree,再调用数组的append()方法,将新的treenode加入到树中。

getall_depth()

getall_depth()获取到传入参数depth深度的所有节点

 创建数组sub_free来存放此深度的节点

用for循环遍历tree中的所有节点,判断节点的depth是否等于传入的参数depth,相等的话则调用sub_free.append()函数将此节点加入sub_free数组中。

findnextall()

findnextall()找到所有的子节点

 创建新数组sub_tree存放子节点,用for循环遍历此实例中的所有节点,判断节点的父节点是否为传入的参数treenode,是的话则调用sub_tree.append()将此节点加入数组中,这样获得treenode所有子节点。

hasnext()

hasnext()判断参数treenode是否有子节点

创建布尔类型的has并赋值为False,用for循环遍历实例tree中所有节点,判断节点的fatherNode是否为参数treenode,如果是则将布尔值has的值改为True,同时break终止循环。

getmaxdepth()

 getmaxdepth()要找到tree的最大深度

为了不破环示例中的树结构,创建temp_tree并将实例的tree赋值给它

调用数组的sort()方法,按照节点的深度由小到大排序。这里用到lambda函数,完成将节点的depth复制给sort()中的key的操作。

最后通过返回排序后数组索引值为-1的数获得最大深度。

将文本构造成树

文本的目录结构不同层次用tab分离,我们要将每一行的标题提取出来并构造成树结构,可以用到递归方法。

 创建Tree实例,来存放文本结构目录的树结构。

定义rescue_me()函数,需要传入参数node、parent、depth。

 调用sys模块中的open()函数打开指定文件,root赋值为文件读取的第一行(readline()读取文件的一行,rstrip()删除 string 字符串末尾的指定字符,默认为空白符,包括空格、换行符、回车符、制表符。)

node赋值为文件的第二行值。

第一次调用rescue_me()函数depth定为1(父节点depth为0,第一次传入的node depth为1)

rescue_me()主要用递归的方法实现目录树结构的构造

用while循环判断是否为空节点

如果不为空节点,首先要判断一下此节点是否为参数depth这一层的节点。计算"\t"的数目,如果"\t"数目与depth相符,则证明这个节点是参数depth这一层的节点(根节点前无"\t",层数为0,第一层节点前有一个"\t",depth为1)。

这一层的节点将传入的参数node与parent中的"\t"替换为”“,获得标题,调用TreeNode()的构造方法,将去除了"\t"的temp_node、temp_parent和depth传入TreeNode()的构造方法中,创建一个TreeNode实例,并调用Tree类中的add()函数将这个新节点加入到上文构造的Tree实例mytree()中。

if语句完成后将parent节点赋值为当前节点node,node赋值为下一个获取到的标题,向下执行。如图:

如果"\t“数目等于depth+1,则证明此节点为下一层节点,那么调用rescue_me(),传入参数node、parent,不同的是要记得传入的depth为这一层depth+1,实现递归。

当递归执行完开始回到之前的断点时,先判断一下此节点是否为空,是空节点则break结束while循环,如果不是检查是否还有下一级,如果"\t"数量与depth相符,同样将节点加入到树中。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/675824
推荐阅读
相关标签
  

闽ICP备14008679号