重磅干货,第一时间送达

由于总结了太多的东西,所以篇幅有点长,这也是我"缝缝补补"总结了好久的东西。
- 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 
from enum import Enum
class COLOR(Enum):    YELLOW=1    GREEN=1    BLACK=3    RED=4print(COLOR.GREEN)for i in COLOR:    print(i)for i in COLOR.__members__.items():    print(i)for i in COLOR.__members__:    print(i)
a=1print(COLOR(a))
- six模块:兼容pyton2和pyton3的模块 
- 2to3工具:改变代码语法版本 
- __future__:使用下一版本的功能 
- 必须知道的collections - https://segmentfault.com/a/1190000017385799
 
 
- python排序操作及heapq模块 - https://segmentfault.com/a/1190000017383322
 
 
- itertools模块超实用方法 - https://segmentfault.com/a/1190000017416590
 
 
- dis(代码字节码分析) 
- inspect(生成器状态) 
- cProfile(性能分析) 
- bisect(维护有序列表) 
- fnmatch 
- timeit(代码执行时间) 
   def isLen(strString):                return True if len(strString)>6 else False
    def isLen1(strString):        
    
        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"))
 import types    types.coroutine 
  import html    html.escape("I'm Jim
")     html.unescape('I'm Jim
') 
- mock(解决测试依赖) 
- concurrent(创建进程池河线程池) 
from concurrent.futures import ThreadPoolExecutor
pool = ThreadPoolExecutor()task = pool.submit(函数名,(参数)) task.done()task.result()task.cancel()task.add_done_callback()task.running()
for data in pool.map(函数,参数列表):    print(返回任务完成得执行结果data)
from concurrent.futures import as_completedas_completed(任务列表)
wait(任务列表,return_when=条件)
future=asyncio.ensure_future(协程)  等于后面的方式  future=loop.create_task(协程)future.add_done_callback()添加一个完成后的回调函数loop.run_until_complete(future)future.result()查看写成返回结果
asyncio.wait()接受一个可迭代的协程对象asynicio.gather(*可迭代对象,*可迭代对象)    两者结果相同,但gather可以批量取消,gather对象.cancel()
一个线程中只有一个loop
在loop.stop时一定要loop.run_forever()否则会报错loop.run_forever()可以执行非协程最后执行finally模块中 loop.close()
asyncio.Task.all_tasks()拿到所有任务 然后依次迭代并使用任务.cancel()取消
偏函数partial(函数,参数)把函数包装成另一个函数名  其参数必须放在定义函数的前面
loop.call_soon(函数,参数)call_soon_threadsafe()线程安全loop.call_later(时间,函数,参数)在同一代码块中call_soon优先执行,然后多个later根据时间的升序进行执行
如果非要运行有阻塞的代码使用loop.run_in_executor(executor,函数,参数)包装成一个多线程,然后放入到一个task列表中,通过wait(task列表)来运行
通过asyncio实现httpreader,writer=await asyncio.open_connection(host,port)writer.writer()发送请求async for data in reader:    data=data.decode("utf-8")    list.append(data)然后list中存储的就是html
    
as_completed(tasks)完成一个返回一个,返回的是一个可迭代对象
协程锁async with Lock():
from multiprocessing import Manager,Processdef add_data(p_dict, key, value):    p_dict[key] = value
if __name__ == "__main__":    progress_dict = Manager().dict()    from queue import PriorityQueue
    first_progress = Process(target=add_data, args=(progress_dict, "bobby1", 22))    second_progress = Process(target=add_data, args=(progress_dict, "bobby2", 23))
    first_progress.start()    second_progress.start()    first_progress.join()    second_progress.join()
    print(progress_dict)
from multiprocessing import Pipe,Processdef producer(pipe):    pipe.send("bobby")
def consumer(pipe):    print(pipe.recv())
if __name__ == "__main__":    recevie_pipe, send_pipe = Pipe()        my_producer= Process(target=producer, args=(send_pipe, ))    my_consumer = Process(target=consumer, args=(recevie_pipe,))
    my_producer.start()    my_consumer.start()    my_producer.join()    my_consumer.join()
from multiprocessing import Queue,Processdef producer(queue):    queue.put("a")    time.sleep(2)
def consumer(queue):    time.sleep(2)    data = queue.get()    print(data)
if __name__ == "__main__":    queue = Queue(10)    my_producer = Process(target=producer, args=(queue,))    my_consumer = Process(target=consumer, args=(queue,))    my_producer.start()    my_consumer.start()    my_producer.join()    my_consumer.join()
    
def producer(queue):    queue.put("a")    time.sleep(2)
def consumer(queue):    time.sleep(2)    data = queue.get()    print(data)
if __name__ == "__main__":    queue = Manager().Queue(10)    pool = Pool(2)
    pool.apply_async(producer, args=(queue,))    pool.apply_async(consumer, args=(queue,))
    pool.close()    pool.join()
      True in [i in s for i in [a,b,c]]        any(i in s for i in [a,b,c])        list(filter(lambda x:x in s,[a,b,c]))
- set集合运用 
- {1,2}.issubset({1,2,3})#判断是否是其子集 
- {1,2,3}.issuperset({1,2}) 
- {}.isdisjoint({})#判断两个set交集是否为空,是空集则为True 
- 代码中中文匹配 
- 查看系统默认编码格式 
   import sys    sys.getdefaultencoding()    # setdefaultencodeing()设置系统编码方式
class A(dict):    def __getattr__(self,value):        return 2    def __getattribute__(self,item):        return item
    
    print([[x for x in range(1,101)][i:i+3] for i in range(0,100,3)])
type.__bases__  #(<class 'object'>,)object.__bases__    #()type(object)    #<class 'type'>
  class Yuan(type):        def __new__(cls,name,base,attr,*args,**kwargs):            return type(name,base,attr,*args,**kwargs)    class MyClass(metaclass=Yuan):        pass
- 什么是鸭子类型(即:多态)? 
- 深拷贝和浅拷贝 
- 深拷贝拷贝内容,浅拷贝拷贝地址(增加引用计数) 
- copy模块实现神拷贝 
- 单元测试 
 class MyTest(unittest.TestCase):        def tearDown(self):            print('本方法开始测试了')
        def setUp(self):            print('本方法测试结束')
        @classmethod        def tearDownClass(self):            print('开始测试')        @classmethod        def setUpClass(self):            print('结束测试')
        def test_a_run(self):            self.assertEqual(1, 1)  
  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
fib = lambda n: n if n <= 2 else fib(n - 1) + fib(n - 2)def fib(n):    a, b = 0, 1    for _ in range(n):        a, b = b, a + b    return b
fib = lambda n: n if n < 2 else 2 * fib(n - 1)
   import os    os.getenv(env_name,None)
    
  #查看分代回收触发    import gc    gc.get_threshold()  #output:(700, 10, 10)
  def conver_bin(num):        if num == 0:            return num        re = []        while num:            num, rem = divmod(num,2)            re.append(str(rem))        return "".join(reversed(re))    conver_bin(10)
- list1 = ['A', 'B', 'C', 'D'] 如何才能得到以list中元素命名的新列表 A=[],B=[],C=[],D=[]呢 
    list1 = ['A', 'B', 'C', 'D']
        for i in list1:        globals()[i] = []   
        for i in list1:        exec(f'{i} = []')   
     a = 'aaaaaa'    ma = memoryview(a)    ma.readonly      mb = ma[:2]  
    a = bytearray('aaaaaa')    ma = memoryview(a)    ma.readonly      mb = ma[:2]          mb[:2] = 'bb'    
L = [1,2,3]L.append(L)print(L)    
  class lazy(object):        def
    
 __init__(self, func):            self.func = func
        def __get__(self, instance, cls):            val = self.func(instance)                setattr(instance, self.func.__name__, val)            return val`
    class Circle(object):        def __init__(self, radius):            self.radius = radius
        @lazy        def area(self):            print('evalute')            return 3.14 * self.radius ** 2
all_files = []def getAllFiles(directory_path):    import os    for sChild in os.listdir(directory_path):        sChildPath = os.path.join(directory_path,sChild)        if os.path.isdir(sChildPath):            getAllFiles(sChildPath)        else:            all_files.append(sChildPath)    return all_files
from werkzeug import secure_filenamesecure_filename("My cool movie.mov") secure_filename("../../../etc/passwd") secure_filename(u'i contain cool \xfcml\xe4uts.txt') 
from datetime import datetime
datetime.now().strftime("%Y-%m-%d")
import timetime.strftime("%Y-%m-%d",time.localtime())
class Mydict(dict):    def __missing__(self,key):         return key
dict.fromkeys(['jim','han'],21) # output:{'jim': 21, 'han': 21}
 204 No Content     206 Partial Content     303 See Other     304 Not Modified     307 Temporary Redirect     401 Unauthorized     403 Forbidden     400     201     503 
            def application(environ, start_response):        start_response('200 OK', [('Content-Type', 'text/html')])        return 'Hello, web!
'
- RPC 
- CDN 
- SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。 
- SSH(安全外壳协议) 为 Secure Shell 的缩写,由 IETF 的网络小组(Network Working Group)所制定;SSH 为建立在应用层基础上的安全协议。SSH 是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。SSH最初是UNIX系统上的一个程序,后来又迅速扩展到其他操作平台。SSH在正确使用时可弥补网络中的漏洞。SSH客户端适用于多种平台。几乎所有UNIX平台—包括HP-UX、Linux、AIX、Solaris、Digital UNIX、Irix,以及其他平台,都可运行SSH。 
- TCP/IP 
- XSS/CSRF 
- 索引改进过程 
- Mysql面试总结基础篇 - https://segmentfault.com/a/1190000018371218
 
 
- Mysql面试总结进阶篇 - https://segmentfault.com/a/1190000018380324
 
 
- 深入浅出Mysql - http://ningning.today/2017/02/13/database/深入浅出mysql/
 
 
- 清空整个表时,InnoDB是一行一行的删除,而MyISAM则会从新删除建表 
- text/blob数据类型不能有默认值,查询时不存在大小写转换 
- 什么时候索引失效 
- 以%开头的like模糊查询 
- 出现隐士类型转换 
- 没有满足最左前缀原则 
- 失效场景: 
- 应尽量避免在 where 子句中使用 != 或 <> 操作符,否则引擎将放弃使用索引而进行全表扫描 
- 尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,即使其中有条件带索引也不会使用,这也是为什么尽量少用 or 的原因 
- 如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不会使用索引 
- 应尽量避免在 where 子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描 
例如:select id from t where substring(name,1,3) = 'abc' – name;以abc开头的,应改成:select id from t where name like 'abc%' 例如:select id from t where datediff(day, createdate, '2005-11-30') = 0 – '2005-11-30';应改为:
如:select id from t where num/2 = 100 应改为:select id from t where num = 100*2;
- 不适合键值较少的列(重复数据较多的列)比如:set enum列就不适合(枚举类型(enum)可以添加null,并且默认的值会自动过滤空格集合(set)和枚举类似,但只可以添加64个值) 
- 如果MySQL估计使用全表扫描要比使用索引快,则不使用索引 
 
 
- 什么是聚集索引 
- 为什么这么快? 
- 基于内存,由C语言编写 
- 使用多路I/O复用模型,非阻塞IO 
- 使用单线程减少线程间切换 
 
 
- 数据结构简单 
- 自己构建了VM机制,减少调用系统函数的时间 
- 优势 
- 
    
性能高 – Redis能读的速度是110000次/s,写的速度是81000次/s 
- 丰富的数据类型 
- 原子 – Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行 
- 丰富的特性 – Redis还支持 publish/subscribe(发布/订阅), 通知, key 过期等等特性 
- 什么是redis事务? 
- 将多个请求打包,一次性、按序执行多个命令的机制 
- 通过multi,exec,watch等命令实现事务功能 
- Python redis-py pipeline=conn.pipeline(transaction=True) 
- 持久化方式 
 
 
- 怎么实现队列 
- 常用的数据类型(Bitmaps,Hyperloglogs,范围查询等不常用) 
 
 
- String(字符串):计数器 
- List(列表):用户的关注,粉丝列表 
- Hash(哈希): 
- Set(集合):用户的关注者 
- Zset(有序集合):实时信息排行榜 
- 与Memcached区别 
- Memcached只能存储字符串键 
- Memcached用户只能通过APPEND的方式将数据添加到已有的字符串的末尾,并将这个字符串当做列表来使用。但是在删除这些元素的时候,Memcached采用的是通过黑名单的方式来隐藏列表里的元素,从而避免了对元素的读取、更新、删除等操作 
- Redis和Memcached都是将数据存放在内存中,都是内存数据库。不过Memcached还可用于缓存其他东西,例如图片、视频等等 
- 虚拟内存–Redis当物理内存用完时,可以将一些很久没用到的Value 交换到磁盘 
- 存储数据安全–Memcached挂掉后,数据没了;Redis可以定期保存到磁盘(持久化) 
- 应用场景不一样:Redis出来作为NoSQL数据库使用外,还能用做消息队列、数据堆栈和数据缓存等;Memcached适合于缓存SQL语句、数据集、用户临时性数据、延迟查询数据和Session等 
- Redis实现分布式锁 
- 使用setnx实现加锁,可以同时通过expire添加超时时间 
- 锁的value值可以是一个随机的uuid或者特定的命名 
- 释放锁的时候,通过uuid判断是否是该锁,是则执行delete释放锁 
- 常见问题 
 
 
- 一致性Hash算法 
- 基于redis实现一个分布式锁,要求一个超时的参数 
- 虚拟内存 
- 内存抖动 
单例模式
        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          class Single:        def __new__(cls,*args,**kwargs):            if not hasattr(cls,'_instance'):                cls._instance = super().__new__(cls,*args,**kwargs)            return cls._instance
工厂模式
  class Dog:        def __init__(self):            print("Wang Wang Wang")    class Cat:
    
        def __init__(self):            print("Miao Miao Miao")
    def fac(animal):        if animal.lower() == "dog":            return Dog()        if animal.lower() == "cat":            return Cat()        print("对不起,必须是:dog,cat")
构造模式
    class Computer:        def __init__(self,serial_number):            self.serial_number = serial_number            self.memory = None            self.hadd = None            self.gpu = None        def __str__(self):            info = (f'Memory:{self.memoryGB}',            'Hard Disk:{self.hadd}GB',            'Graphics Card:{self.gpu}')            return ''.join(info)    class ComputerBuilder:        def __init__(self):            self.computer = Computer('Jim1996')        def configure_memory(self,amount):            self.computer.memory = amount            return self         def configure_hdd(self,amount):            pass        def configure_gpu(self,gpu_model):            pass    class HardwareEngineer:        def __init__(self):            self.builder = None        def construct_computer(self,memory,hdd,gpu)            self.builder = ComputerBuilder()            self.builder.configure_memory(memory).configure_hdd(hdd).configure_gpu(gpu)        @property        def computer(self):            return self.builder.computer
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]
插入排序
   def insertion_sort(_list):        n = len(_list)        for i in range(1,n):            value = _list[i]            pos = i            while pos > 0 and value < _list[pos - 1]                _list[pos] = _list[pos - 1]                pos -= 1            _list[pos] = value            print(sql)
归并排序
 def merge_sorted_list(_list1,_list2):   #合并有序列表        len_a, len_b = len(_list1),len(_list2)        a = b = 0        sort = []        while len_a > a and len_b > b:            if _list1[a] > _list2[b]:                sort.append(_list2[b])                b += 1            else:                sort.append(_list1[a])                a += 1        if len_a > a:            sort.append(_list1[a:])        if len_b > b:            sort.append(_list2[b:])        return sort
    def merge_sort(_list):        if len(list1)<2:            return list1        else:            mid = int(len(list1)/2)            left = mergesort(list1[:mid])            right = mergesort(list1[mid:])            return merge_sorted_list(left,right)
堆排序heapq模块
 from heapq import nsmallest    def heap_sort(_list):        return nsmallest(len(_list),_list)
栈
    
from collections import deque    class Stack:        def __init__(self):            self.s = deque()        def peek(self):            p = self.pop()            self.push(p)            return p        def push(self, el):            self.s.append(el)        def pop(self):            return self.pop()
队列
   from collections import deque    class Queue:        def __init__(self):            self.s = deque()        def push(self, el):            self.s.append(el)        def pop(self):            return self.popleft()
二分查找
  def binary_search(_list,num):        mid = len(_list)//2        if len(_list) < 1:            return Flase        if num > _list[mid]:            BinarySearch(_list[mid:],num)        elif num < _list[mid]:            BinarySearch(_list[:mid],num)        else:            return _list.index(num)
关于数据库优化及设计
https://segmentfault.com/a/1190000018426586
- 如何使用两个栈实现一个队列 
- 反转链表 
- 合并两个有序链表 
- 删除链表节点 
- 反转二叉树 
- 设计短网址服务?62进制实现 
- 设计一个秒杀系统(feed流)? - https://www.jianshu.com/p/ea0259d109f9
 
 
- 为什么mysql数据库的主键使用自增的整数比较好?使用uuid可以吗?为什么? 
- 如果是分布式系统下我们怎么生成数据库的自增id呢? 
- 基于redis实现一个分布式锁,要求一个超时的参数 
- 如果redis单个节点宕机了,如何处理?还有其他业界的方案实现分布式锁码? 
- 使用数据结构和算法 
- 数据库 
- 索引优化 
- 慢查询消除 
 
 
- 批量操作,从而减少io操作 
- 使用NoSQL:比如Redis 
- 网络io 
- 缓存 
- 异步 
- Asyncio实现异步操作 
- 使用Celery减少io阻塞 
- 并发 
下载1:OpenCV-Contrib扩展模块中文版教程
在「小白学视觉」公众号后台回复:扩展模块中文教程,即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。在「小白学视觉」公众号后台回复:Python视觉实战项目,即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。在「小白学视觉」公众号后台回复:OpenCV实战项目20讲,即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。交流群
欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~

