复习
Python,是j解释性语言,执行时先编译后解释
推荐博客:https://www.cnblogs.com/aiyr/p/6867732.html
.py .pyc .pyw .pyw .pyo .pyd的区别 ,推荐博客:https://blog.csdn.net/feeltouch/article/details/45952003
.py 源代码文件
.pyc 编译后的文件(商业用途防止泄露源码) .pyw 运行有图形界面 .pyo优化编译后的文件
.pyd .pyd文件并不是使用python语言编写的,而是使用其他语言编写的Python扩展模块,
.pyd文件是用D语言按照一定的格式编写,并处理成二进制文件。那么什么是D语言呢??它是c/c++的综合进化版,不仅具有二者的全部优点,而且整体性能更佳,但是其抽象程度高
def quicksortshort(arr):
return [] if arr==[] else quicksortshort([y for y in arr[1:] if y<arr[0]]) + [arr[0]]+ quicksortshort([y for y in arr[1:] if y>=arr[0]])
一行代码写快排
几只球队比赛,结果如下 id 球队 结果(胜是1,败是0) 1 hebei 1 2 shanxi 1 3 henan 0 4 shandong 0 5 hebei 1 6 shanxi 0 7 guangzhou 1 8 guangzhou 1 9 hebei 0 要求查询结果如下 id name 胜 败 1 hebei 2 shanxi 3 henan 4 shandong 5 guangzhou set @rownum=0; select @rownum:=@rownum+1 AS id,C.name,C.acount as 胜,D.bcount as 负 from (SELECT A.name,acount from (select name from `match` GROUP BY name ) as A LEFT JOIN (SELECT name,count(result) as acount from `match` WHERE result=1 GROUP BY name) as B on A.name = B.name) as C LEFT JOIN (SELECT name,count(result) as bcount from `match` WHERE result=0 GROUP BY name) as D on C.name = D.name
装饰器:在不改变装饰器的情况下,给装饰器的执行加上log信息
给装饰器加一层装饰器
from functools import wraps from logger.log import get_logger import traceback def decoratore(func): @wraps(func) def log(*args,**kwargs): try: print("当前运行方法",func.__name__) return func(*args,**kwargs) except Exception as e: get_logger().error(f"{func.__name__} is error,here are details:{traceback.format_exc()}") return log
字典相关: dict.setdefault(k ,v) # 字典的setdefault属性,当字典中没有键k时才设置键值对 k ,有则不设置 from collections import defaultdict # 设置字典默认的值,当字典只有key没有值时,默认的值 dic = defaultdict(lambda :{'a':[]}) # 这里的参数必须是可调用的函数 dic['k1']['a'].append('111') dic['k2'] print(dict(dic)) # {'k1': {'a': ['111']}, 'k2': {'a': []}} 再转化回字典 python 引用变量时,看变量是否是可变变量(列表,字符串)还是不可变变量(字符串),可变变量引用的是空间,然后如果是不可变变量,看不可变变量相对于引用处是局部变量还是非局部变量,如果是局部变量,那引用的是值,否则引用的还是空间 深度优先对应的是栈,栈对应的是递归 广度优先对应的是队列 基于爬虫的推荐系统 爬取各大门户网站的网页新闻,做上标记,使用百度AI分析关键字,文章分类,保存在数据库中,然后在网页中显示,当用户点击时,记录用户点击文章的标签类型,然后做一个权重,更多的推荐这个标签下的文章 分布式爬虫一般用于处理量特别大的数据,超过500万条, 面向对象,双下划线函数 结构分析 静态变量(静态字段) 私有静态变量(私有静态字段) 变量名前有__ 普通方法(构造方法) 对象属性(普通字段) 私有对象属性(私有普通字段 属性名前有__ ) 私有方法 方法名前有__ 类方法 方法名上有@classmethod 定义类方法,至少有一个cls参数 静态方法 方法名上有@staticmethod 将方法变为属性的方法 方法名上有@property # 反射 自省函数 hasattr(obj,'name') getattr(obj,'name') setattr(obj,'name') delattr(obj,'name') __len__ __hash__ __str__ 打印对象默认输出该方法的返回值 __repr__ 定义了__repr__后,repr(对象)时,默认返回该方法的返回值 __call__ 对象后面加括号触发执行 __eq__ 当语句出现双等号时执行此方法 __del__ 无须定义,Python个解释器自动执行 __new__ 类执行__init__方法前执行__new__方法,详细解释见保存的网上的博客 __init__ init 在对象创建后,对对象进行初始化。new 是在对象创建之前创建一个对象,并将该对象返回给 init __iter__ 可迭代对象内部含有这个方法 __next__ 迭代器内部含有这个方法 __getitem__ 定义迭代器类,可以进行索引 __slot__ 限制实例属性(仅对当前类有效,对子类无效) __getattr__ 当调用不存在的属性时调用此方法来尝试获得属性 @property 将方法变为属性(即不用加括号就可以调用方法) @xxx.setter 把一个setter方法变为属性并赋值,当对象调用xxx方法进行赋值时触发此方法,如 class Student(object): @property def birth(self): return self._birth @birth.setter def birth(self, value): self._birth = value @property def age(self): #只定义getter方法,不定义setter方法就是一个只读属性 return 2015 - self._birth s1 = Student() s1.birth = 1995 # 这里进行了赋值操作,调用birth()方法 print(s1.age)
处理高并发:
负载均衡,读写分离,缓存(分布式)
cdn dns
老村长复习
路飞 自我介绍 刘志超, 后端开发 百分之80代码我写的 项目背景 2012年 卖视频 + 加群 1000 2016年 51CTO, 视频给51CTO, 老师直播(一周1到2次) + 答疑 5000 - 7000 2016年底 微服务课程 一对一VIP导师服务 (学员可以对导师提出问题, ) 导师不负责任 导师不够用 对学生没有监督 2017年7月 路飞正式成立了 愿景 在线上教育平台学习, 提高学员完课率 创始团队 CEO 1 把控全局 提出想法 产品 1 分析需求 写出详细的需求方案 UI 1 根据产品的原型图, 设计页面 前端 1 负责前端项目页面搭建 后端 1.5 接口开发 1 管理后台 根据给出需求文档 实现接口 测试 1 测试写的项目 bug 禅道软件 运营 1 负责网站运营 运维 1 负责项目的上线和部署 项目架构 主站 全球用户 第一版(2017年7月 -- 2017年11月) 维护2个月 (修复bug, 推广活动) 课程模块|(2-3天) 课程列表获取 课程详情展示 课程评论 课程的课时 课程的常见问题 登录注册 登录: 滑动验证码 防止盗刷接口 极验验证码 注册: 发短信 阿里云的服务 短信价格 4分5 购物车模块 redis 1, 购物车操作比较频繁, 避免多次查询数据库, 减少查询数据库压力 2, redis 存取速度快 哈希 SHOPPING_CAR { user_id [], user_id [], user_id [], user_id [], } user_id_course_id 有效期 , 价格 使用这种数据结构 存取方便, 使用灵活 列表 支付模块 数据存储 redis 商品 -> 课程优惠券 -> 通用优惠券 -> 贝里 -> 实际付款金额 剖析这块儿业务需求 时序图 再去写代码 调用第三方支付业务 用户付款 付款成功: 1, 修改订单状态 2, 订单下所购买的课程, 创建报名的课程 3, 运营(班主任) 学员分配导师 4, 报名记录 -> 导师 分配成功 给导师分配一笔冻结的辅导费用 微信通知: 通知到 导师,学员 是谁 学员提交作业: 微信通知: 导师批改作业: 微信通知: 模块下作业完成: 模块考核 远程 考核通过, 开通下一个模块 5, 奖惩机制 导师: 7天没有跟进学员, 扣贝里 500 24小时没有批改作业, 扣贝里 500 学员: 作业: B+ 奖励 周期 奖励 微信服务号模块 报名模块 提现模块 实名认证 涉及到支付宝的转账API 资讯模块 第二版(2018年3月 -- 2018年6月) 学 练 改 管 测 题库 为什么要做题库? 推荐不一样的题的话 网站进行埋点, 用户行为统计 看视频的次数, 看视频的时长, 分配题目 第三版(2018年6月 -- 至今) 问答系统 { } 评价系统() 批改之后 学员针对于这个作业记录 -> 提出问题 导师解答 针对于这条问题是不是可以评价 -> 添加跟进记录 针对跟进记录进行评价 -> 低分评价 -> 形式 通知到 管理员 视频 第三方: 免费的视频 阿里云的服务 0.24元 收费的视频 保利威视频 0.5元 管理后台 运营用户 作用: 导师后台 导师后台 作用: 技术栈: nginx web 服务器 提高并发(动静分离, 负载均衡, 反向代理) uwsgi 桥梁 连接nginx和django服务 django + drf 提供接口服务 vue 前端数据展示 mysql 数据持久化存储 redis 缓存, 可能经常不变更的数据且经常被查询, 可以放缓存 缓存的数据结构都有哪些应用场景? celery 1, 定时任务(场景: 定时跑惩罚的脚本) 2, 异步任务(场景: 发送邮件) sentry logging 记录错误日志 错误日志收集起来, 页面可视化 jenkins 持续集成的项目管理工具 CI git 代码版本控制 协同开发 虚拟环境 项目环境隔离 第三方服务插件 阿里云短信服务 视频服务 支付宝支付接口 转账 实名认证 微信服务号开发(发送消息, ) 微信支付 项目中遇到的问题? 不会写? 画图 涉及到表操作有哪些 映射到代码 跨域, 是怎么解决的? 前后端 设置响应头 支付成功, 服务器宕机了? 24小时, 2分钟 4分钟 8分钟 ... 防止支付在短时间内创建很多次 前端 把按钮禁掉, 做一些友好提示 后端 1, 接口频率限制 2, 首次下单, 清空缓存订单信息, 再次点击, 如果没有就提示异常 redis 宕机了, 缓存在购物车的数据怎么办? redis 持久化 AOF RDB redis 哨兵监控, 处于一个高可用的状态 redis 应用场景 1, 哈希 计数器 2, 哈希 缓存购物车数据 抛出内存错误 uwsgi 内存 逻辑严谨清晰 course["seciton"] course.get("seciton", 0) 增强的代码容错性 新功能: 产品 -> 原型图(UI), 产品需求文档(开发) UI -> 按照原型图 -> 设计图 开发 -> 产品需求文档 -> 概要设计文档 测试 -> 测试用例 开发 -> 按照设计图 -> 前端: 做页面, 后端: 接口开发 前后端基本接口联调完成, 就给出一个版本 测试 -> 根据测试用例去测功能 第一轮: 第二轮: 第三轮: UI + 产品验收 公测版本 发布到预发布 一轮测试 发布到正式环境 1, 涉及表结构更新 sql 执行 2, 通过jenkins上线 3, 测试 项目部署: 2台前端 2台后端 1台redis 1台mysql 1台预发布 1台测试机 每天 100行左右代码 一共 3.7万行代码 5W(包含 注释行 + 空行) 项目中有什么亮点? 1, 根据现有的业务抽离出他们公有的部分, 写成一个组件 2, 项目架构很好, 支持服务器横向扩展(增加服务器组, 提高并发) 3, 引用一些新的技术, 提高生产效率
同步和异步关注的是消息通信机制 同步:发出一个调用,没有得到结果,该调用不返回 异步:调用发出后,这个调用直接返回,被调用者执行完后通过状态、通知来通知调用者 阻塞和非阻塞关注的是程序在等待调用结果(消息、返回值)时的状态
推荐博客:http://www.cnblogs.com/it-xiaozhi/p/9906026.html
https://www.cnblogs.com/it-xiaozhi/p/9906142.html