零碎知识
1.常见的数据类型中的方法
字符串 字典 列表 常用方法
caplitalize upper lower find rfind center ljust rjust format index strip lstrip() rstrip() append insert extend count pop sort reverse remove li[2:5] = [1, 2, 3] = ['HELLO', 1, 3] li[0:6:2] = ['HELLO', 1, 3] .get keys values items pop update
2.lambda表达式
v = lambda x:x+1 result = v(1) # 2 def v(x): return x+1 result = v(1)
3. 三元运算
result = 值1 if 条件 else 值2 如果条件为真:result = 值1 如果条件为假:result = 值2
4.内置函数
map:
遍历序列,对序列中每个元素进行操作,最终获取新的序列。
li = [11, 22, 33] new_list = map(lambda a: a + 100, li)li = [11, 22, 33] sl = [1, 2, 3] new_list = map(lambda a, b: a + b, li, sl)
filter:
对于序列中的元素进行筛选,最终获取符合条件的序列
li = [11, 22, 33] new_list = filter(lambda arg: arg > 22, li) #filter第一个参数为空,将获取原来序列
5.函数参数
def func(a, b=[]): b.append(a) return b r1 = func(1) print(r1) # 1 r15 = func(11,[]) print(r15) # 11 r2 = func(2) print(r2) # 1,2
6.列表生成式和生成器表达式
v1 = [i for i in range(10)] # 列表生成式 v1 = [i+100 for i in [11,22,33]] v2 = (i for i in range(10)) # 生成器 边循环 边生成, 内部还没有生成,除非循环 v2 = (i+100 for i in [11,22,33]) >>> v2 = (i for i in range(10)) >>> next(v2) 0 >>> next(v2) 1 >>> next(v2) 2 >>> v1 = [i for i in range(10)] >>> v1 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>>
7.列表生成式
lambda x,y: x*y if x < y else x/y #声明一个匿名函数 def func(): return 1 v = [func for i in range(10)] v = [lambda :1 for i in range(10)] v 是什么 v是列表且有10个函数 v = [lambda x:x+1 for i in range(10)] v[0](9) # 10 v = [lambda : i + 1 for i in range(10)] print('i:',i) # 9 print(v) # 10个函数体 print(v[4]()) # 10
8. 装饰器 ***
使用装饰器可以在函数执行前和执行后添加相应操作。 def wrapper(func): def result(): print 'before' func() print 'after' return result @wrapper def foo(): print 'foo'
foo()
# before
# foo
# after
生成器 **
val = (i for i in range(5))
生成器:一边循环一边计算的机制称为生成器 ,通过next()调用下一个元素
只负责生产,只能往前走,不能回退,生产结束时,若在生产,就报错StopIteration
>>> next(val)
0
>>> next(val)
1
>>> next(val)
2
>>> next(val)
3
>>> next(val)
4
>>> next(val)
Traceback (most recent call last):
File "<pyshell#56>", line 1, in <module>
next(val)
StopIteration
迭代器 *
迭代器对象表示一个数据流,不知道什么时候截止,不能使用len(),直到没有数据抛出StopIteration
迭代器(Iterator):可以被next()函数调用并不断返回下一个值的对象称为迭代器
9.反射
- importlib
- getattr
10.算法能力
11.斐波那契数列 后一个值=前两个的和
def func(max): n, a,b=0,0,1 while n < max: print(b) a,b =b,a+b n+=1 return "done" func(10)
1
1
2
3
5
8
13
21
34
55
知识
1. 进程 线程 一个应用程序就是一个进程,真正的执行单位是线程 一个进程下面可以开多个线程,线程共享该进程的所有资源。 2. io密集型 计算型 在python中一个进程中同一时刻只有一个线程执行用不上多核,有GIL锁。 # 如果并发的多个任务是计算密集型:多进程效率高 # 如果并发的多个任务是I/O密集型:多线程效率高 3. 创建app python manage.py startapp app01 python manage.py makemigrations python manage.py migrate 4.django的app下面有那些文件 app: admin models views tests 项目:settings url templates static 5.3次握手,4次挥手 3次握手 client请求,server同意请求,client同意 4次挥手 client请求,server同意,server请求,client同意 因为:server有可能还有数据要发送。 6.中间件,你用中间件做了什么? 登录认证,权限,跨域 process_request process_response process_view process_exception process_template_response(用的比较少) 7.索引B+树 B+树(数据结构,平衡树,根节点,子节点,数据) 索引能够让数据库查询数据的速度上升,而使写入数据的速度下降, 因为平衡树这个结构必须一直维持在一个正确的状态, 增删改数据都会改变平衡树各节点中的索引数据内容,破坏树结构, 因此,在每次数据改变时, DBMS必须去重新梳理树(索引)的结构以确保它的正确,这会带来不小的性能开销, 也就是为什么索引会给查询以外的操作带来副作用的原因。 8.redis类型,设置时间,取时间 字符串,集合,列表,字典,有序集合 expire()设置时间 conn.set("name", ex=10) ... 9.合并两个列表,去除列表中的重复元素 a = [12,4,67,45,6] b = [4,5,6,8,9] print(list(set(a+b))) 10.字符串与列表的转换 s = "helloworld" print(list(s)) li = ["hello", "world"] print(''.join(li)) 11.range()xrange()区别 py2: range() 生成的是列表 xrange() 生成的是一个生成器 py3: range() 就是一个生成器 xrange() 没了 12.将下边函数改写成lambda形式(3的倍数) list(filter(lambda n : not(n % 3), range(1, 100))) [ i for i in range(1, 100) if not(i % 3)] 13.cookie与session区别 cookie:存储在客户端的 session:存储在服务器的 14.求出函数的执行时间 利用装饰器 import time def time_fun(func): def inner(*args, **kwargs): time_start = time.time() func(*args, **kwargs) time_end = time.time() print(time_end - time_start) return inner @time_fun def add(x, y): time.sleep(2) return x+y 15.斐波那契数列(Fibonacci) 1,1,2,3,5,8,13,21,34,... 除第一个和第二个外,任何一个数都由前两个数相加 def fun(x): n, a, b = 0, 0, 1 while n < x: yield b a, b = b, a + b n += 1 res = fun(10) for i in res: print(i) while True: print(next(res)) 16.二分查找 # encoding=utf-8 def binary_search(alist, item): """二分查找 非递归方式""" n = len(alist) start = 0 end = n-1 while start <= end: mid = (start + end) // 2 if item == alist[mid]: return True elif item < alist[mid]: end = mid - 1 elif item > alist[mid]: start = mid + 1 return False def binary_search2(alist, item): """二分查找 递归方式""" n = len(alist) if 0 == n: return False mid = n // 2 if item == alist[mid]: return True elif item < alist[mid]: return binary_search2(alist[:mid], item) else: return binary_search2(alist[mid+1:], item) if __name__ == '__main__': li = [17, 20, 26, 31, 44, 54, 55, 77, 93] # print(binary_search(li, 55)) # print(binary_search(li, 100)) print(binary_search2(li, 55)) print(binary_search2(li, 100)) 17.django中的Q使用 SELECT * FROM order WHERE id BETWEEN 20 ADN 100 AND(num <= '20' or num >= '30'); from django.db.models import Q from login.models import Order #... Order.objects.get( Q(id >= 20) & (id <= 100), Q(num <= 20) | (num >= 30) ) 18.常见的请求头 - Content-Type json / url-encode / . - User-Agent 请求得设备 - referer 可以做图片防盗链。 - Host 当前得域名 - cookies 19.开发工具命令 git init git add . git commit -m "xxx" git stash git merge git rebase git remote add origin ... git clone git pull origin git push origin 20.高并发 高可用,读写分离 集群分布式 21.设计模式 单例模式 工厂模式 生产者 消费者 抽象工厂