目录
4.什么是Js,Js的数据类型有哪些,Js序列化反序列化用的是什么方法
1.现有三个普通函数a,b,c都需要用户登陆之后才能访问。现需要你写一个装饰器校验用户是否登陆,并且用户只要登陆一次其他函数在调用时也无需再校验
2.什么是进程,线程,协程,程序中如何依次创建/实现它们(可讲大致思路)
1.简述数据库表设计中一对一、一对多、多对多的应用场景,char与varchar的区别
2.有一个列表[3,4,1,2,5,6,6,5,4,3,3]请写出一个函数,找出该列表中没有重复的数的总和
3.什么是函数的递归调用?书写递归函数需要注意什么?你能否利用递归函数打印出下面列表中每一个元素(只能打印数字),l = [1,[2,[3,[4,[5,[6,[7,[8,[9]]]]]]]]]
4.谈谈你对web框架的认识,简述web框架请求流程并列举出python常见web框架
1.使用bootstrap需要注意什么,常用的bootstrap样式有哪些?
2.安装django需要注意的事项有哪些(最少三条及以上,越多越好)
3.如何验证django是否安装成功,命令行如何创建django项目,如何启动django项目。与pycharm创建django项目的区别?
4.什么是app,django中如何创建app,需要注意什么
python的垃圾回收机制简称GC(高级语言都有自己的垃圾回收机制), python主要通过三种方式来解决垃圾回收的方式: 引用计数, 标记清除,分代回收.
引用计数: 如果有新的引用指向对象, 对象引用计数加加一,引用被销毁时对象引用计数减一, 当用户的引用计数为0时,该内存释放.
标记清除: 首先标记对象(垃圾检测),然后清除垃圾(垃圾回收).
首先初始所有对象标记为白色, 并确定根节点对象(这些对象不会被删除),标记他们为黑色,(表示对象有效). 将有效对象引用的对象标记为灰色, (表示对象可达, 但是他们所引用的对象骄傲没有检查).检查完灰色对象引用的对象后, 将灰色标记为黑色, 重复直到不存在灰色的节点为止. 最后白色节点都是要清除的对象.
分代回收: 垃圾回收器会更频繁的处理新对象, 一个新的对象即是你的程序刚创建的 , 而一个老的对象则是经过了几个时间周期之后仍然存在的对象, python会在当一个对象从零代移动到一代, 或者是从一代移动到二代的过程中提升这个对象.
单例:即单个实例,指的是同一个类实例化多次的结果指向同一个对象,用于节省内存空间
如果我们从配置文件中读取配置来进行实例化,在配置相同的情况下,就没必要重复产生对象浪费内存了
方式一: 定义一个装饰器来实现单例
- settings.py
- HOST='1.1.1.1'
- PORT=3306
-
-
- # 方式一: 定义一个装饰器实现单例模式
- import settings
-
- def singleton(cls): # cls=Mysql
- __instance=cls(settings.HOST,settings.PORT)
-
- def wrapper(*args,**kwargs):
- if args or kwargs:
- obj=cls(*args,**kwargs)
- return obj
- return __instance
- return wrapper
-
- @singleton # Mysql = singleton(Mysql)
- class Mysql:
- def __init__(self,host,port):
- self.host = host
- self.port = port
-
- obj1=Mysql()
- obj2=Mysql()
- obj3=Mysql()
- print(obj1 is obj2 is obj3) # true
-
- obj4=Mysql('1.1.1.3',3307)
- obj5=Mysql('1.1.1.4',3308)
- print(obj3 is obj4) # false
方式二: 基于类来实现单例
- # 方式二: 定义一个类方法实现单例模式
-
- import settings
-
- class Mysql:
- __instance=None
- def __int__(self,host,port):
- self.host = host
- self.port = port
-
- @classmethod
- def singleton(cls):
- if not cls.__instance:
- cls.__instance=cls(settings.HOST,settings.PORT)
- return cls.__instance
-
- #
- obj1=Mysql('1.1.1.2',3306)
- obj2=Mysql('1.1.1.3',3307)
- print(obj1 is obj2) # >>>> false
-
-
- obj3= Mysql.singleton()
- obj4= Mysql.singleton()
- print(obj3 is obj4) # true
-
-
方式三: 基于元类来实现单例
- import settings
-
- class Mymeta(type):
- def __init__(self,name,bases,dic):
- # 定义类mysql时就触发
- # 实现冲配置文件中取配置来造一个mysql实例
- self.__instance = object.__new__(self) # 产生对象
- self.__init__(self.__instance,settings.HOST,settings.PORT) # 初始化对象
- # 上述两部可以合并为一步
- # self.__instance=super().__call__(*args,**kwargs)
- super().__init__(name,bases,dic)
-
- def __call__(self, *args, **kwargs): # mysql(...)时触发
- if args or kwargs: # 有值
- obj=object.__new__(self)
- self.__init__(obj,*args,*kwargs)
- return obj
- return self.__instance
-
-
- class Mysql(metaclass=Mymeta):
- def __init__(self,host,port):
- self.host= host
- self.port =port
-
- obj1=Mysql()
- # 没有传值则默认从配置文件中都配置来实例化, 所有的实力应该指向一个内存地址
- obj2=Mysql()
- obj3=Mysql()
- print(obj1 is obj2 is obj3) # True
- obj4=Mysql('1.1.1.4',3307)
-
| os.path.join(path1[,path2[,...]) | 将多个路径组合后返回, 第一个绝对路径之前的参数将被忽略[拼接路径]. |
| os.path.split() | 返回文件的路径和文件名 |
| os.path.splitext() | 将文件名和扩展名分开 |
| os,mkdir('dirname') | 生成单极目录,相当于shell中的mkdir dirname |
| os.remove() | 删除一个文件 |
| os.listdir() | 列举指定路径下的文件名称 |
| os.rename() | 重命名文件夹 |
| os.getcwd() | 获取当前工作路径 |
| os.path.exists() | 判断当前路径是否存在 |
| os.payj.isdir() | 判断当前路径是否是文件夹/目录 |
| os.path,isfile() | 判断当前文件是否是一个文件 |
| os.path.getsize() | 获取文件大小, 单位是bytes |
| os.chdir | 切换路径 |
| sys.path | 结果是一个列表 |
| sys.version | 查看解释器信息 |
| sys.platform | 查看当前平套信息 |
序列化模块. 是不同编程语言之间数据交互必备的模块,属于字符串,可以调用encode方法将字符串转换成二进制数据, 明显的特征是双引号.json只能序列化最基本的数据类型, picklemok 可以序列化所有的数据类型,包括时间, 函数,类等.
pickle模块没有数据类型的限制, 可以将任意数据类型都转化成序列化格式, 但是仅限于python内部使用.
| json.dump(s)() | 将其他数据类型转换成json格式字符串 |
| json.load(s)() | 将json格式字符串转换成对应的数据类型 |
| pickle.dump(s)() | |
| pickle.load(s)() |
都是操作时间的相关模块
time
| time.time() | 时间戳 |
| time.sleep() | 程序沉睡时间 |
| time.strftime() | 格式化时间 |
| time.localtime() | 当地时间 |
datetime
| datetime.now() | 当前时间 |
| datetime.utctime | 格林尼治时间 |
| \w | 匹配数字字母下划线 |
| \W | 匹配非数字字母下划线 |
| \d | 匹配数字 |
| \D | 匹配非数字 |
| ^ | 匹配字符串的开头 |
| $ | 匹配字符串的结尾 |
| a|b | 匹配字符a或者b |
| () | 给正则表达式分组 |
| [] | 匹配字符组中的字符 |
| [^] | 匹配除了字符组中字符的所有字符 |
| * | 尽可能多的匹配,0+次 |
| + | 重复匹配1+次 |
| ? | 默认匹配一次 |
| [n] | 重复n次 |
| {n,} | 重复n+次 |
| n,m} | 重复n~m次 |
| random.random() | 0-1之间的小数 |
| random.randint(1,9) | 1-9之间的整数 |
| random.choice() | 随机抽取一个 |
| random.sample() | 随机抽样,自定义抽取个数 |
| random.shuffle() | 随机打乱次序[洗牌] |
| hashlib.md5() | md5加密 |
| md5.update(b'xx') | 加盐, 必须是二进制数据类型 |
| md5.hedigest() | 获取加后的结果 |
openpyxl模块>>> 操作excel表格, 底层用的pandas
subprocess模块>> 模拟计算机cmd命令窗口
记录日志
logging.debug(调试debug0
logging.info(消息info)
logging.warning(警告warn)
logging.error(错误error)
logging.critical(严重critical)
from multiprocess import process 创建进程时引用的模块 , 在windows中类似于导入模块
if __name__ == '__main__':启动脚本
from mulitiprocessing import Queue 队列
from multiprocess import current_process/from threading import current_thread 查看当前进/线程号
from threading import thread 创建线程, 类似于进程
from multiprocess import lock 进/线程锁
from threading import event event 事件
from concurrent.future import ProcessPoolExecutor,ThreadPoolExecutor 进/线程池
猴子补丁
from gevent import monkey ;monkey.path_all() 用于检测所有的io操作
实现客户端与服务端交互
| socket.socket() | 基于网络的TCP套接字 |
| server.bind(('127.0.0.1',8080)) | 本地回环地址链接 |
| server.listen() | 半连接池 |
| sock.send(b'xx') | 超客户端发送数据 |
| sock.recv(1024) | 接受客户端发送的数据 |
| sock.close() | 断链接 |
| server.close() | 关机 |
| client.connect(('127.0.0.1',8080)) | 链接服务端 |
struct 模块
| struct.pack | 打包数据到固定长度 |
| struct.unpack() | 将打包后的固定长度数据拆包 |
在css中,任何元素都可以浮动, 浮动会生成一个块级框, 而不论它本身时何种元素
浮动有两个特点:
1.浮动的边框可以向左或者向右移动, 直到他的外边缘碰到包含边框或者另一个浮动框的边框为止.
2. 由于浮动框不在文档的普通流中, 所有文档的普通六中的块框表现得就像浮动框不存在一样.
它有三中取值; left, right,none
clear 属性规定元素的那一边不允许出现其他浮动元素. clear属性只会对自身起作用, 不会影响其他元素.
| 值 | 描述 |
|---|---|
| left | 在左侧不允许浮动元素。 |
| right | 在右侧不允许浮动元素。 |
| both | 在左右两侧均不允许浮动元素。 |
| none | 默认值。允许浮动元素出现在两侧。 |
| inherit | 规定应该从父元素继承 clear 属性的值。 |
浮动的副作用是父标签的塌陷问题
清除浮动主要有三种方式
1.固定高度
2.伪元素清除
3.overflow:hidden
伪元素清除法(使用较多):
- .clearfix:after {
- content: "";
- display: block;
- clear: both;
- }
overflow溢出属性
| 值 | 描述 |
|---|---|
| visible | 默认值。内容不会被修剪,会呈现在元素框之外。 |
| hidden | 内容会被修剪,并且其余内容是不可见的。 |
| scroll | 内容会被修剪,但是浏览器会显示滚动条以便查看其余的内容。 |
| auto | 如果内容被修剪,则浏览器会显示滚动条以便查看其余的内容。 |
| inherit | 规定应该从父元素继承 overflow 属性的值。 |
圆形头像:
- .header-img {
- width: 150px;
- height: 150px;
- border: 3px solid white;
- border-radius: 50%;
- overflow: hidden;
static默认值,无定位,不能当作绝对定位的参照物, 并且设置left, right值等是不起作用的
相对定位, 相对于该元素在文档流中的原始位置,即以自己为参照物.但是即便是设置了相对定位u=的偏移值, 原来的位置还被元素占着.
注意:position:relative的一个主要用法:方便绝对定位元素找到参照物。而其层叠通过z-index属性定义。
绝对定位: 设置为绝对定位的元素框从文档流完全删除, 并相对于最近的已定位祖先元素定位,元素原来在正常文档流中所占的空间会关闭, 好像该元素原来不存在一样.
另外,对象脱离正常文档流,使用top,right,bottom,left等属性进行绝对定位。而其层叠通过z-index属性定义。
fixed:对象脱离正常文档流,使用top,right,bottom,left等属性以窗口为参考点进行定位,当出现滚动条时,对象不会随着滚动。而其层叠通过z-index属性 定义。
在理论上,被设置为fixed的元素会被定位于浏览器窗口的一个指定坐标,不论窗口是否滚动,它都会固定在这个位置。
绝对定位和固定定位脱离文档流.相对定位不脱离文档流
z-index
可通过z-index设置对象的层叠顺序, z-index值大的压着小的, 只有定位了的元素才能有z-index, 也就是说浮动元素不能使用z-index, 默认的zz-index值为0, 如果没有值或者值相同,那么谁写在HTML后边谁就在上方压着对方. 定位了的元素永远压着没有定位的元素. opacity 用来定义透明度, 取值范围0-1.
---------------------------------------------------------------------------------------------------------------------------------
含有__iter__内置方法的对象就是可以迭代对象. 字符串,元组,列表,集合,字典,文件都是可迭代对象.
迭代器对象是含有__iter__和__next__方法. 迭代器对象能够极大的节省存储空间,调用__next__方法取值, 取完值就会报错. 提供了一种不依赖索引取值的取值方式.
生成器对象就是自定义的可迭代对象, 也含有__iter__和__next__方法,
当函数体代码里含有yield关键字时,第一次调用函数不会执行函数体代码, 而是将函数变成了生成器, 可以通过__next__执行函数体代码,若函数体包含多个yield关键字, 执行一次__next__返回后面的值且让代码停留在yield位置, 再次执行__next__才会基于上一次的位置往后取值到下一个yield关键字位置.
元类是所有类的父类. type.
产生类的两种方式: class关键字/ type(类名,类的父类,类的名称空间).
只有继承了type类的类才能当元类, 如果要切换产生类的元类, 必须使用关键字metaclass声明.
类中的__init__方法是用来初始化对象的,元类中的__init__是用来初始化类的, 所以元类可以限制类的产生.
元类也可以控制对象的产生. 实例化对象时必须传入关键字参数, 对象加括号调用类中的__call__发明回复, 类加括号会调用产生类的类中的__call__方法.
所以要高度定制对象的产生过程,可以操作元类中的__call__. 要高度定制类的产生过程,可以操作元类中的__init__.
MySQL默认搜索引擎在5.7版本之前是myisam, 之后是innodb,
myisam 每张表被存放在三个文件中, 表定义文件, 数据文件和索引文件, 因为数据和索引是分开存储的 索引的叶子节点存储的数据地址需要在寻址一次才能获得数据库, 底层原理时B+树,堆表, 支持全文索引, 是表记锁定. 适用于管理非事务表,如博客系统,新闻网站等, 它提供了高速的存储和检索能力,以及全文搜索能力.
innodb 支持事务(acid四大特性),且支持行锁和外键约束, 设计的目标就是处理大数据容量的数据库系统. 每张表都存在同一个文件中, 索引查询时做到覆盖索引就会非常高效,利用聚簇索引的方式进行索引, 底层利用的是B+树索引,索引组织表,有行级锁,锁的粒度很小, 并发能力很强. 用于更新操作频繁或者需要保证数据的完整性,并发量高,支持事务和外键的场景, 如自动化办公.
blackhole 黑洞, 数据一存进去就丢失
memory MySQL服务器把memory数据表的数据和索引都放在内存中而不是硬盘上, , 所以响应速度很快, 但是当MySQL守护进程崩溃的时候数据会丢失.它支持hash 和B+树索引.默认哈希索引(速度比B+树快), 比myisam快一个数量级. 其数据文件于索引文件是分开储存的. 数据文件存于内存, 有利于数据的快速处理.
js 是javascript 是一款轻量级的脚本编程语言, 主要用于前端,
js数据类型:
基本数据类型: number, string, ,null , undefined, boolean,symbol(es6), 这些类型可以直接操作保存在变量中的实际值.
引用数据类型: object , 在js中处理基本数据类型之外的都是对象, 数据, 函数, 正则表达式等都是对象.
js 序列化,反序列化的方法:
JSON.parse 将json格式字符串转换成对象
JSON.stringfy 将对象转换成json格式
---------------------------------------------------------------------------------------------------------------------------------
-
- def outer(func):
- def inner(*args,**kwargs):
- res=func(*args,**kwargs)
- return res
- return inner
-
- @outer()
- def a():
- pass
-
- @outer()
- def b():
- pass
-
- @outer()
- def c():
- pass
进程: 正在被运行的程序, 多个进行同时运行需要有多个CPU,进程有三个状态: 就绪态, 阻塞态,运行态. 就绪态是所有程序被允许时都要经历的状态,运行态过程中如果出现了io操作就会进入阻塞态, 阻塞态想要进入运行态就必须经过就绪态.
进程还有同步异步,阻塞非阻塞之分, 其中异步非阻塞的运行效率, CPU利用率最高.
创建进程有两种方式. 一个是双击桌面图标,另一个是通过代码创建.
定义一个进程类, 类中有run方法, 在启动脚本中通过start方法创建进程.
创建线程的方式于创建进程的方式一致.
同一进程下的线程之间数据资源共享.
进程还有个join方法, join主进程, 等待子进程运行结束之后在运行, 现成的join方法是主线程等到子线程运行结束之后在运行.
进程之间默认数据,互不干扰. 守护进程是伴随着守护对象的存活而存活,死亡而死亡, 守护线程伴随着被守护的线程的结束而结束.
线程是进程下的'小帮手'. 进程是资源单位, 而线程才是真正干活的人. 一个线程必定有一个进程, 而一个进程可以没有线程.
协程是程序员们开发出来的线程'小帮手', 目的是为了达到单线程下的并发[线程是为了达到一个进程下的高并发] 它是一种用户态的轻量级线程. 再计算机层面并没有这个概念. 单线程内开启协程, 一旦遇到io就会从应用程序级别控制切换, 以此来提高效率.
对比操作系统控制线程的切换 , 用户在单线程内控制协程的切换, 有点是协程的切换开销更小,操作系统完全感知不到, 而且可以再单线程内就实现并发效果, 可以最大限度的利用cpu; 但是协程的本质是再单线程下,无法利用多核, 而且因为协程指的是单线程, 因而一旦写成出现阻塞,将会阻塞整个线程.
各种进/线/协程的主要目的就是为了提高cpu的利用率, 主要用到的计数是多道技术的切换+保存状态.
1. 命名方式: 变量名要见名知意, 不要使用关键字(as, print,list...)作为变量名.
变量名全小写, 字母之间用_分割, 常量默认全大写. 类名使用驼峰体命名,
2. 变量名由数字字母下划线组成, 但数字不能放在开头(yietong_liu)
3. 逗号,冒号,分号之前避免空格 , 括号里边避免空格 ,索引前后(个人建议)避免空格.
运算符前后放置一个空格
4.注释, #+空格, 快捷键: ctrl+?
单行注释:若在行首, 按照此法, 若在行尾,空两格之后在执行此法.
多行注释要用'','',''',""". 多引号的主要目的是为了方便引用别人的内容.
5.使用4个空格缩进[尽量不要使用tab键],见冒号就缩进.
6.函数调用的左括号之前不能有空格, 关键字参数和默认值参数的前后不要加空格
7. 尽管有时可以在if/for/while 的同一行跟一小段代码,但绝不要跟多个子句,并尽量避免换行。
v1 = 1 or 3 1
v2 = 1 and 3 3
v3 = 0 and 2 and 1 0
v4 = 0 and 2 or 1 1
v5 = 0 and 2 or 1 or 4 1
v6 = 0 or Flase and 1 0
---------------------------------------------------------------------------------------------------------------------------------
一对一 作者对详情
一对多, 一个部门对应多名员工
多对多, 书籍对应作者
char 定长类型, 最大长度255,比较简短的信息, 如门牌号等使用.
varchar 不定型 最大6875长度65535 不确定长度的信息, 如名字等.
- l = [3,4,1,2,5,6,6,5,4,3,3]
- print(sum(set(l))) # 21
递归函数: : 函数在运行过程中 直接或间接地调用了自身. pycharm最大递归深度为1000[实际为997/998] 可以通过更改递归深度,
- import sys
- print(sys.setrecursionlimit(2000))
注意: 要有明确的结束条件, 每一次递归都要比之前简单.
-
- l = [1,[2,[3,[4,[5,[6,[7,[8,[9]]]]]]]]]
- def get_num(l1):
- for i in l1:
- if isinstance(i,int):
- print(i)
- else:
- get_num(i)
- get_num(l)
所有的web应用本质上就是一个socket服务端, 而用户的浏览器是一个客户端,
客户端发送HTTP请求到服务器程序.>>>>服务器程序接受http报文,进行解析,转换成wsgi协议交给框架程序,>>>>框架程序进行各种处理,通过wsgi协议返回给服务器程序, >>>>服务器程序构造http响应报文,返回给客户端>>>>客户端接收相应展示页面.

python主流web框架: django, flask, tornado,fastapi,sanic....
django 大而全,自身携带的功能很多,但是开发小项目的话这个框架就显得笨重了
flask 小而精,自身功能很少, 主要依赖第三方模块,容易受第三方模块影响.
tornado 异步非阻塞框架, 可以充当游戏的服务器,但是上手难度很高
------------------------------------------------------------------------------------------------------------------------------
使用Bootstrap前要在head内部引用bootstrap文件: JavaScript, CSS, JQuery. 可以是本地导入[提前下载到本地, 好处是不受网络因素限制, 再无网络的情况下也可以使用]也可以是依靠网络CDN服务.
常用的bootstrap样式有: 背景属性background-color/img, 样式布局div,行row, 列clom, 表格table, 文本textarea ,字体fontsize等
1. 电脑和所有的py文件中不能包含中文.
2. 一个pycharm窗口只运行有一个项目,不要做项目嵌套.
3.django不同版本之间的区别不是很大, 不要纠结版本问题.
4.不同版本的python解释器配合不同版本的django 因为版本不适配原因会出现一些报错 ,仔细找一下修改即可.
验证django安装成功>>>> cmd终端输入 django-admin
1.命令行创建django项目>>> django-admin startproject 项目名
2. 启动django项目>>> 线切换到项目目录下 cd 项目名,,, 在执行启动目录 python38 manage.py runserver ip:port (127.0.0.1:8080)
3. 访问django终端>>> 浏览器直接访问
4. 创建app应用>>> python38 manage.py startapp 应用名
pycharm创建django只需要鼠标操作即可.
1. pycharm 创建的django项目会自动创建templates文件夹, 而终端命令行不会自动创建
2. 命令行不会在配置文件编写关于templates文件夹的配置
'DIRS':[os.path.join(BASE_DIR,'templates')]
3.pycharm自动创建的第一个应用会自动注册到配置文件中
4. 针对db.sqlit3文件不用去在乎他有没有被创建, 只要运行了django它就会自动出来.
django中已经创建了project,还需要创建app, 简单来说, project是配置代码, app是功能代码, 一个projrct可以包含很多个app的配置
创建app 有三种方式, 前两个是终端方式,第三个是app方式
1. 通过命令行, 进入到项目目录下, cmd打开命令行, 在cmd运行 python manage.py startapp Testmodel(Testmodel 是项目名)
2. 通过pycharm , 在pycharm的terminal输入 python manage.py startapp Testmodel
3. pycharm创建django项目时, 在最下方Moresettings里,设置appname
