天天看点

耗时十天整理的最全面的Python重点知识汇总,建议收藏!

作者:苏沐OvO

因篇幅有限,只能做部分展示,已经将所有知识点总结成了PDF和WROD文档,面试或者学习都可以借鉴一下,全部掌握可以让你的技能提高一个档次!

耗时十天整理的最全面的Python重点知识汇总,建议收藏!

Py2 VS Py3

  • print成为了函数,python2是关键字
  • 不再有unicode对象,默认str就是unicode
  • python3除号返回浮点数
  • 没有了long类型
  • xrange不存在,range替代了xrange
  • 可以使用中文定义函数名变量名
  • 高级解包 和*解包
  • 限定关键字参数 *后的变量必须加入名字=值
  • raise from
  • iteritems移除变成items()
  • yield from 链接子生成器
  • asyncio,async/await原生协程支持异步编程
  • 新增 enum, mock, ipaddress, concurrent.futures, asyncio urllib, selector
    • 不同枚举类间不能进行比较
    • 同一枚举类间只能进行相等的比较
    • 枚举类的使用(编号默认从1开始)
    • 为了避免枚举类中相同枚举值的出现,可以使用@unique装饰枚举类
篇幅有限省略部分...           

py2/3 转换工具

  • six模块:兼容pyton2和pyton3的模块
  • 2to3工具:改变代码语法版本
  • __future__:使用下一版本的功能

常用的库

  • 篇幅有限省略部分...

不常用但很重要的库

  • dis(代码字节码分析)
  • inspect(生成器状态)
  • cProfile(性能分析)
  • bisect(维护有序列表)
  • fnmatch
    • fnmatch(string,"*.txt") #win下不区分大小写
    • fnmatch根据系统决定
    • fnmatchcase完全区分大小写
  • timeit(代码执行时间)
def isLen(strString):
        #还是应该使用三元表达式,更快
        return True if len(strString)>6 else False

    def isLen1(strString):
        #这里注意false和true的位置
        return [False,True][len(strString)>6]
    import timeit
    print(timeit.timeit('isLen1("5fsdfsdfsaf")',setup="from __main__ import isLen1"))

    print(timeit.timeit('isLen("5fsdfsdfsaf")',setup="from __main__ import isLen"))           
  • contextlib
    • @contextlib.contextmanager使生成器函数变成一个上下文管理器
  • types(包含了标准解释器定义的所有类型的类型对象,可以将生成器函数修饰为异步模式)
import types
    types.coroutine #相当于实现了__await__           
  • 篇幅有限省略部分...

Python进阶

  • 进程间通信:
    • Manager(内置了好多数据结构,可以实现多进程间内存共享)
篇幅有限省略部分...           
    • Pipe(适用于两个进程)
篇幅有限省略部分...           
      • 篇幅有限省略部分...
  • dict底层结构
    • 为了支持快速查找使用了哈希表作为底层结构
    • 哈希表平均查找时间复杂度为o(1)
    • CPython解释器使用二次探查解决哈希冲突问题
  • Hash扩容和Hash冲突解决方案
    • 链接法
    • 二次探查(开放寻址法):python使用
      • 循环复制到新空间实现扩容
      • 冲突解决:
for gevent import monkey
    monkey.patch_all()  #将代码中所有的阻塞方法都进行修改,可以指定具体要修改的方法           
  • 判断是否为生成器或者协程
co_flags = func.__code__.co_flags

    # 检查是否是协程
    if co_flags & 0x180:
        return func

    # 检查是否是生成器
    if co_flags & 0x20:
        return func           
  • 斐波那契解决的问题及变形
  • 获取电脑设置的环境变量
  • 垃圾回收机制
    • 引用计数
    • 标记清除
    • 分代回收
  • True和False在代码中完全等价于1和0,可以直接和数字进行计算,inf表示无穷大
  • C10M/C10K
    • C10M:8核心cpu,64G内存,在10gbps的网络上保持1000万并发连接
    • C10K:1GHz CPU,2G内存,1gbps网络环境下保持1万个客户端提供FTP服务
  • 篇幅有限省略部分...

网络知识

  • 什么是HTTPS?
    • 安全的HTTP协议,https需要cs证书,数据加密,端口为443,安全,同一网站https seo排名会更高
  • 常见响应状态码
204 No Content //请求成功处理,没有实体的主体返回,一般用来表示删除成功
    206 Partial Content //Get范围请求已成功处理
    303 See Other //临时重定向,期望使用get定向获取
    304 Not Modified //请求缓存资源
    307 Temporary Redirect //临时重定向,Post不会变成Get
    401 Unauthorized //认证失败
    403 Forbidden //资源请求被拒绝
    400 //请求参数错误
    201 //添加或更改成功
    503 //服务器维护或者超负载           
  • http请求方法的幂等性及安全性
  • WSGI
# environ:一个包含所有HTTP请求信息的dict对象
    # start_response:一个发送HTTP响应的函数
    def application(environ, start_response):
        start_response('200 OK', [('Content-Type', 'text/html')])
        return '<h1>Hello, web!</h1>'           
  • RPC
  • CDN
  • SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。
  • SSH(安全外壳协议) 为 Secure Shell 的缩写,篇幅有限省略部分...
  • TCP/IP
    • TCP:面向连接/可靠/基于字节流
    • UDP:无连接/不可靠/面向报文
    • 三次握手四次挥手
      • 三次握手(SYN/SYN+ACK/ACK)
      • 四次挥手(FIN/ACK/FIN/ACK)
    • 为什么连接的时候是三次握手,关闭的时候却是四次握手?
      • 篇幅有限省略部分...
    • 为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?
      • 虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假象网络是不可靠的,有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。
  • XSS/CSRF
    • HttpOnly禁止js脚本访问和操作Cookie,可以有效防止XSS

Mysql

  • 索引改进过程
    • 线性结构->二分查找->hash->二叉查找树->平衡二叉树->多路查找树->多路平衡查找树(B-Tree)
  • 篇幅有限省略部分...
    • 失效场景:
      • 篇幅有限省略部分...
      • 如果MySQL估计使用全表扫描要比使用索引快,则不使用索引
  • 什么是聚集索引
    • B+Tree叶子节点保存的是数据还是指针
    • MyISAM索引和数据分离,使用非聚集
    • InnoDB数据文件就是索引文件,主键索引就是聚集索引

Redis命令总结

  • 为什么这么快?
    • 篇幅有限省略部分...
  • 优势
    • 篇幅有限省略部分...
  • 什么是redis事务?
    • 篇幅有限省略部分...
  • 持久化方式
    • RDB(快照)
      • save(同步,可以保证数据一致性)
      • bgsave(异步,shutdown时,无AOF则默认使用)
    • AOF(追加日志)
  • 怎么实现队列
    • push
    • rpop
  • 常用的数据类型(Bitmaps,Hyperloglogs,范围查询等不常用)
    • 篇幅有限省略部分...
  • 与Memcached区别
    • 篇幅有限省略部分...
  • Redis实现分布式锁
    • 使用setnx实现加锁,可以同时通过expire添加超时时间
    • 锁的value值可以是一个随机的uuid或者特定的命名
    • 释放锁的时候,通过uuid判断是否是该锁,是则执行delete释放锁
  • 常见问题
    • 缓存雪崩
      • 短时间内缓存数据过期,大量请求访问数据库
    • 篇幅有限省略部分...
  • 一致性Hash算法
    • 使用集群的时候保证数据的一致性
  • 基于redis实现一个分布式锁,要求一个超时的参数
    • setnx
  • 虚拟内存
  • 内存抖动

Linux

  • Unix五种i/o模型
    • 阻塞io
    • 非阻塞io
    • 多路复用io(Python下使用selectot实现io多路复用)
      • select
        • 并发不高,连接数很活跃的情况下
      • poll
        • 比select提高的并不多
      • epoll
        • 适用于连接数量较多,但活动链接数少的情况
    • 信号驱动io
    • 异步io(Gevent/Asyncio实现异步)
  • 比man更好使用的命令手册
    • tldr:一个有命令示例的手册
  • 篇幅有限省略部分...

设计模式

单例模式

# 方式一
    def Single(cls,*args,**kwargs):
        instances = {}
        def get_instance (*args, **kwargs):
            if cls not in instances:
                instances[cls] = cls(*args, **kwargs)
            return instances[cls]
        return get_instance
    @Single
    class B:
        pass
    # 方式二
    class Single:
        def __init__(self):
            print("单例模式实现方式二。。。")

    single = Single()
    del Single  # 每次调用single就可以了
    # 方式三(最常用的方式)
    class Single:
        def __new__(cls,*args,**kwargs):
            if not hasattr(cls,'_instance'):
                cls._instance = super().__new__(cls,*args,**kwargs)
            return cls._instance           

工厂模式

构造模式

数据结构和算法内置数据结构和算法

python实现各种数据结构

快速排序

def quick_sort(_list):
            if len(_list) < 2:
                return _list
            pivot_index = 0
            pivot = _list(pivot_index)
            left_list = [i for i in _list[:pivot_index] if i < pivot]
            right_list = [i for i in _list[pivot_index:] if i > pivot]
        return quick_sort(left) + [pivot] + quick_sort(right)           

选择排序

def select_sort(seq):
        n = len(seq)
        for i in range(n-1)
        min_idx = i
            for j in range(i+1,n):
                if seq[j] < seq[min_inx]:
                    min_idx = j
            if min_idx != i:
                seq[i], seq[min_idx] = seq[min_idx],seq[i]           

插入排序

归并排序

堆排序heapq模块

队列

二分查找

面试加强题:

关于数据库优化及设计

  • 如何使用两个栈实现一个队列
  • 反转链表
  • 合并两个有序链表
  • 删除链表节点
  • 篇幅有限省略部分...

缓存算法

  • LRU(least-recently-used):替换最近最少使用的对象
  • LFU(Least frequently used):最不经常使用,如果一个数据在最近一段时间内使用次数很少,那么在将来一段时间内被使用的可能性也很小

服务端性能优化方向

  • 使用数据结构和算法
  • 数据库
    • 索引优化
    • 慢查询消除
      • slow_query_log_file开启并且查询慢查询日志
      • 通过explain排查索引问题
      • 调整数据修改索引
    • 批量操作,从而减少io操作
    • 使用NoSQL:比如Redis
  • 网络io
    • 批量操作
    • pipeline
  • 缓存
    • Redis
  • 异步
    • Asyncio实现异步操作
    • 使用Celery减少io阻塞
  • 并发
    • 多线程
    • Gevent
  • 篇幅有限省略部分...

-END-

除上述资料外,还附赠全套Python学习资料,包含面试题、简历资料等具体看下方。

更多相关资料有需要的小伙伴回 01 即可获取