Python中格式化输出应该使用%
还是format
Python 新版本推荐使用format
,Python 2.6才开始支持了format
语 法。
c = (100,200)
# print('坐标%s'%c) #会报错,因为%s只能传入一个值,但是c是一个元组,其中不止一个值。可以改写为print('坐标%s'%(c,))
print('坐标{}'.format(c))
.format()
不用考虑传值时参数格式的问题。
Python 3.6加入了一个f-strings新语法。
c = (100,200)
print('坐标{}'.format(c))
print(f'坐标{c}')
同时,format还支持通过位置、关键字、对象属性来进行传参。
排序算法
-
冒泡排序(稳定,时间复杂度:O(n^2))
依次比较相邻两个元素的大小,若前一个元素大于后一元素,则交换,直到最后一个元素即为最大元素。然后重新从首元素开始同样地操作,知道倒数第二个元素即为次大的元素。以此类推,将得到最大或者最小的排序序列。 -
选择排序(不稳定,时间复杂度:O(n^2))
首先初始化最小元素索引值为首元素,依次遍历待排序数列,若遇到小于该最小索引位置元素的,则刷新最小索引为该较小元素的位置,直到到尾元素,结束一次遍历,并将最小索引处的元素与首元素交换;然后初始化最小元素索引为第二个待排序的元素位置,同样操作,可得到倒数第二小的元素,以此类推。 -
快速排序(不稳定,时间复杂度:O(nlogn)
选一基准元素,依次将剩余元素中小于该基准元素的值放置其左侧,大于等于该基准元素的值放置其右侧;然后去基准元素的前半部分和后半部分分别进行同样的处理;以此类推,直至各个子序列剩余一个元素时,即排序完成。 -
插入排序(稳定,时间复杂度:O(n^2))
有一个已经有序的数据序列(可能只有一个元素),依次将后面的无序元素插入到前面的有序数列中,初始状态有序数列仅有一个元素,即首元素。在将无序数列元素插入有序数列的过程中,采用了逆序遍历有序数列,相较于顺序遍历会稍显繁琐,担当数列本身已近排序状态效率会更高。已知待排序的一组记录是:
60,71,49,11,24,3,66
假设在排序过程中,前3个记录已按关键码值递增的次序重新排列,构成一个有序序列:
49,60,71
将待排序记录中的第4个记录(即11)插入上述有序序列,以得到一个新的含4个记录的有序序列。首先,应找到11的插入位置,再进行插入。可以将11放入数组的第一个单元r[0]中,这个单元称为监视哨,然后从71起从右到左查找,11小于71,将71右移一个位置,11小于60,又将60右移一个位置,11小于49,又再将49右移一个位置,这时再将11与r[0]的值比较,11≥r[0],它的插入位置就是r[1]。假设11大于第一个值r[1]。它的插入位置应该在r[1]和r[2]之间,由于60已经右移了,留出来的位置正好留给11.后面的记录依照同样的方法逐个插入到该有序序列中。若记录数n,续进行n-1趟排序,才能完成。 -
希尔排序(不稳定,时间复杂度:O(n^(3/2)))
是插入排序的改进版,为了减少数据的移动次数,在初始序列较大时,去较大的步长,通常序列长度的一半,此时只有两个元素比较,交换一次;之后步长依次减半直至步长为1,即为插入排序,由于此时序列已接近有序,故插入元素是数据移动的次数会相对较少,效率得到了提高。 -
归并排序(稳定,时间复杂度:O(nlogn))
采用分治的思想,分治排序整个数列如同排序两个有序数列,一次执行这个过程直至排序末端的两个元素,再依次向上层输送排序好的两个子列进行排序直至整个数列有序。设有数列{6,202,100,301,38,8,1}
初始状态:6,202,100,301,38,8,1
第一次归并后:{6,202},{100,301},{8,38},{1}
第二次归并后:{6,100,202,301},{1,8,38}
第三次归并后:{1,6,8,38,100,202,301}
方法重载与方法重写有什么区别(Python中没有重载)
方法重载:让类以统一的方式处理不同类型数据的一种手段。
方法重写:父类与子类之间的多态性,对父类的函数进行重新定义。
Python中,方法也是attribute,方法名就是Key,所以每个方法名只能有一个方法体,当一个无参数函数体被定义了多次,每一次新的定义都会覆盖之前的定义,所以,可以在dir()中看到,这个方法最终指向最后一次定义的函数体,所以在调用之前没有参数的函数时,所以会报错。
面向对象的三大特性
- 继承
类可以继承一个或多个父类,或者又可以称为基类或者超类,新建的类称为派生类或子类。 - 封装
广义上面向对象的封装:代码的保护,面向对象的思想本身就是一种封装,只让用实例化的对象来操作类中属性或者方法。
狭义上面向对象的封装:将属性和方法都藏起来,不让你看见。 - 多态
多态是指一类事物有多种形态
实现多态的方法:- 定义新的子类
- 重写对应的父类方法
- 使用子类的方法直接处理,不调用父类的方法
HTTP和HTTPs
HTTP是超文本传输协议,HTML是超文本标记语言
HTTP:http协议在数据传输的过程中都是明文,所以可能存在数据泄露和篡改。
HTTPS:是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL/TLS层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。
参考链接:http://www.cnblogs.com/wupeiqi/
MVC框架和MTV框架
MVC框架:全名是Model View Controller,是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller),具有耦合性低、重用性高、生命周期成本低等优点。
Django框架的设计模式借鉴了MVC框架的思想,也是分成三部分,来降低各个部分之间的耦合性。Django框架的不同之处在于它拆分的三部分为:Model(模型)、Template(模板)和View(视图),也就是MTV框架。
MTV框架:
- Model(模型):负责业务对象与数据库的对象(ORM)
- Template(模版):负责如何把页面展示给用户
- View(视图):负责业务逻辑,并在适当的时候调用Model和Template
单例模式和工厂模式
单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点。当想控制实例数目,节省系统资源的时候使用单例模式。主要解决一个全局使用的类频繁地创建与销毁。
工厂模式:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。主要解决接口选择的问题。
二叉树
二叉查找树
二叉查找树,也称有序二叉树,是指一棵空树或者具有以下性质的二叉树:
- 左子节点的值比父节点小
- 右子节点的值比父节点大
- 任意节点的左右子树也分别为二叉查找树
- 没有键值相等的点
基于BST存在的问题,平衡二叉树产生了,典型的有AVL树和红黑树,因为AVL是严格的平衡二叉树,但是插入和删除的性能较差,所以在实际生产环境中不如红黑树应用广泛。
红黑树
红黑树从本质上来说就是一颗二叉查找树(自平衡二叉树),但是在二叉树的基础上增加了着色相关的性质,使得红黑树可以保证相对平衡,从而保证红黑树的增删改查的时间复杂度最坏也能达到O(log N)。
下面是红黑树最重要的5条性质,后面需要正常回来查看:
- 每个节点要么是黑的,要么是红的
- 根节点以及叶子节点是黑的
- 如果一个节点是红的,他的子节点一定都是黑的
- 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。
当在含n个关键字的红黑树上进行insert和delete操作时,修改后的树可能不满足上面给出的4个红黑树的基本特性,所以需要改变树中的某些节点的颜色以及指针结构。
这些指针结构的修改是通过旋转完成的,旋转分为左旋和右旋:
参考链接:https://www.jianshu.com/p/0eaea4cc5619