1.python中的lambda是什么意思,可以舉例
1 匿名函數 2 a = lambda x:x+1 3 print(a(1))
2.請寫出以下代碼執行的結果
1 class Parent(object): 2 x = 1 3 class Child1(Parent): 4 pass 5 class Child2(Parent): 6 pass 7 print(Parent.x, Child1.x, Child2.x) 8 Child1.x = 2 9 print(Parent.x, Child1.x, Child2.x) 10 parent.x = 3 11 print(Parent.x, Child1.x, Child2.x) 12 13 14 111 121 323
3.寫出A0-A2的輸出結果,並解釋原因
1 A0 = [i for i in range(10) if i % 2 == 0] 2 A1 = {i: i+2 for i in A0} 3 A2 = sorted(A0, reverse=True) 4 5 6 A0 = [0, 2, 4, 6, 8] 7 A1 = {0:2,2:4,4:6,6:8,8:10} 8 A2 = [8,6,4,2,0]
4.寫出下列程序的輸出
1 a = [2, 5] 2 b = [a] * 4 3 b = tuple(b) 4 b[0][0] = 4 5 print(b) 6 print(a) 7 8 9 ([4,5],[4,5],[4,5],[4,5]) 10 [4,5]運算符來操作列表時淺拷貝,只拷貝最外邊一層,內層還是原來的引用。
5.寫出下邊代碼打印的內容
1 def decorate(func): 2 print("func") 3 def inner(**kwargs): 4 print("123456") 5 ret = func(**kwargs) 6 print("789") 7 return ret 8 print('inner') 9 return inner 10 @decorate 11 @decorate 12 def func(**kwargs): 13 return kwargs 14 15 16 17 func 18 inner 19 func 20 inner
6.如何用redis實現分布式鎖
1 import redis 2 redis_conn = redis.StrictRedis(host="127.0.0.1", port=6379) 3 try: 4 lock_num = lock_num = redis_conn.incr("lock", 1) 5 if lock_num == 1: 6 # 執行操作,拼接response 7 response 8 else: 9 return 404 10 finally: 11 redis_conn.incr("lock", -1) 12 return response 13 14 15 原理:redis是單線程的 16 目的,在分布式應用中,將並發變為串行,減少數據庫壓力,提升安全性能
7.redis中的數據類型有哪些
1 string list hash set zset
8.使用生成器寫一個到n的斐波那契數列def feibo(n):
1 def feibo(n): 2 a, b = 1, 0 3 for _ in range(n): 4 a, b = b, a + b 5 yield b
9.簡述Python的內存管理機制
小整數池 intern機制 引用計數為主,分代回收為輔
10.mysql事務隔離級別有哪些,分別會出現哪些問題,默認的事務隔離級別是什么

默認事務隔離級別是可重復讀
11.簡述對進程和線程的認識,並說說他們的區別

12.使用裝飾器實現一個單例
1 def wrap(cls): 2 instance = {} 3 def inner(*args, **kwargs): 4 if cls not in instance: 5 instance[cls] = cls(*args, **kwargs) 6 return instance[cls] 7 return inner 8 @wrap 9 class A(object): 10 def __init__(self, name): 11 self.name = name
13.HTTP常用狀態碼有哪些
200 - 請求成功
201 - 已創建。成功請求並創建了新的資源
301 - 資源(網頁等)被永久轉移到其它URL
302 - 臨時移動。與301類似。但資源只是臨時被移動。客戶端應繼續使用原有URI
404 - 請求的資源(網頁等)不存在
403 - 服務器理解請求客戶端的請求,但是拒絕執行此請求
500 - 內部服務器錯誤
505 - 服務器不支持請求的HTTP協議的版本,無法完成處理

14.post和get的區別是什么
15.對稱加密和非對稱加密是什么
對稱加密

非對稱性加密
一對公鑰和一對私鑰
用戶和銀行分別有自己的公鑰
用戶使用銀行給的公鑰對原文進行加密
銀行可以用自己的私鑰對密文進行解密
非對稱加密速度很慢。
現實中加密方式的使用
用戶使用對稱加密,通過秘鑰對原文進行加密
將秘鑰使用非對稱加密方式加密然后傳給銀行
銀行使用秘鑰解密
非對稱性加密
一對公鑰和一對私鑰
用戶和銀行分別有自己的公鑰
用戶使用銀行給的公鑰對原文進行加密
銀行可以用自己的私鑰對密文進行解密
非對稱加密速度很慢。
現實中加密方式的使用
用戶使用對稱加密,通過秘鑰對原文進行加密
將秘鑰使用非對稱加密方式加密然后傳給銀行
銀行使用秘鑰解密
16.Python線程安全模塊時什么,怎么使用
互斥鎖
1 import threading 2 # 定義全局變量 3 g_num = 0 4 # 創建全局互斥鎖 5 lock = threading.Lock() 6 # 循環一次給全局變量加1 7 def sum_num1(): 8 # 上鎖 9 lock.acquire() 10 for i in range(1000000): 11 global g_num 12 g_num += 1 13 print("sum1:", g_num) 14 # 釋放鎖 15 lock.release() 16 # 循環一次給全局變量加1 17 def sum_num2(): 18 # 上鎖 19 lock.acquire() 20 for i in range(1000000): 21 global g_num 22 g_num += 1 23 print("sum2:", g_num) 24 # 釋放鎖 25 lock.release() 26 if __name__ == '__main__': 27 # 創建兩個線程 28 first_thread = threading.Thread(target=sum_num1) 29 second_thread = threading.Thread(target=sum_num2) 30 # 啟動線程 31 first_thread.start() 32 second_thread.start()
17.寫出代碼的結果
1 def f(x, l=[]): 2 for i in range(x): 3 l.append(i*i) 4 print(l) 5 f(2) 6 f(3, [3,2,1]) 7 f(3) 8 9 10 11 [0, 1] [3,2,1,0,1,4] [0,1,0,1,4]
18.描述Python GIL的概念,以及它對python多線程的影響
1.全局解釋鎖。每個線程在執行的過程都需要先獲取GIL,保證同一時刻只有一個線程可以執行代碼 2.python語言和GIL並沒有關系,是由於歷史原因在Cpython解釋器中難以移除GIL。 3.線程釋放GIL鎖的情況:在IO操作等可能引起阻塞的系統調用之前,可以暫時釋放GIL,cpu會切換執行其他線程,
但在執行完畢后,必須重新獲取GIL。python3使用計時器(執行時間達到閾值后,當前線程釋放GIL) 如何解決GIL問題 1.換解釋器,默認是Cpython,可以換成jpython 2.使用其他語言寫其他線程。 3.進程+協程 結論: 1.Python使用多進程可充分利用多核cpu的資源 2.多線程爬取比單線程性能有提升,因為遇到IO阻塞會自動釋放GIL鎖。 為什么有了GIL鎖多線程使用時還要使用互斥鎖: GIL鎖不能保證一個線程是否執行完成,互斥鎖可以保證一個線程執行完成之后解鎖,讓別的程序再加鎖執行。
19.一行實現對列表a中的下標為偶數的元素進行加3后求和
1 sum([i+3 for i in a[1::2]])
20.對比說明jwt機制和cookie session機制的優缺點
cookie Session:
優點:
簡單方便,通用性好,可以存放敏感信息,可以靈活控制用戶的狀態
缺點:
每個用戶經過我們的應用認證之后,我們的應用都要在服務端做一次記錄,以方便用戶下次請求的鑒別,通常而言
session都是保存在內存中,而隨着認證用戶的增多,服務端的開銷會明顯增大。
擴展性: 用戶認證之后,服務端做認證記錄,如果認證的記錄被保存在內存中的話,這意味着用戶下次請求還必須
要請求在這台服務器上,這樣才能拿到授權的資源,這樣在分布式的應用上,相應的限制了負載均衡器的能力。
這也意味着限制了應用的擴展能力。
CSRF: 因為是基於cookie來進行用戶識別的, cookie如果被截獲,用戶就會很容易受到跨站請求偽造的攻擊。
jwt機制:
優點:
不需要在服務端去保留用戶的認證信息或者會話信息,減少服務器開銷
基於token認證機制的應用不需要去考慮用戶在哪一台服務器登錄了,這就為應用的擴展提供了便利。
缺點:
已頒布分令牌無法主動讓其失效(可以通過后端實現黑名單來實現,但其實黑名單的原理和cookie session其實
是一樣的)
21.談談你對drf的認識快速開發符合restful風格api接口的django擴展。
主要的核心組件:
序列化器、視圖、視圖集,結合django自帶的model和url
使用drf其實已經不再符合django的mvt開發模式了
主要的功能:
分頁、限流、權限、認證等
22.celery的工作流程是什么
celery架構由三個模塊組成:消息中間件(message broker),任務執行單元(worker)和任務執行結果存儲(
taskresult store)組成。
消息中間件(Broker): 消息中間人,是任務調度隊列,是一個獨立的服務,是一個生產者消費者模式,生產者把任務
放入隊列中,消費者(worker)從任務隊列中取出任務執行,任務的執行可以按照順序依次執行也可以按照計划時間進行。
但是Broker本身不提供隊列服務,所以要集成第三方隊列,推薦使用RatbbitMQ或Redis.
任務執行單元(worker):即執行任務的程序,可以有多個並發。它實時監控消息隊列,獲取隊列中調度的任務,並執
行它。
任務執行結果存儲(task result store):由於任務的執行同主程序分開,如果主程序想獲取任務執行的結果,
就必須通過中間件存儲。同消息中間人一樣,存儲也可以使用RabbitMQ、Redis;另外,假如不需要保存執行的結果也
可以不配置這個模塊。
23.Django中間件常用的5個方法
1 中間件:允許開發人員在請求之前或之后進行相應的處理。 2 3 1.10之前,Django中間件注冊`MIDDLEWARE_CLASSES`: 4 process_request 5 process_view 6 process_response 7 process_template_response 8 process_exception 9 10 1.10及之后,Django中間件注冊`MIDDLWARE`: 11 def simple_middleware(get_response): 12 # 一次性配置和初始化。 13 14 def middleware(request): 15 # 在調用視圖(以及稍后的中間件)之前 16 # 要為每個請求執行代碼。 17 18 response = get_response(request) 19 20 # 為每個請求/響應執行的代碼 21 # 在調用視圖之后 22 23 return response 24
25 return middleware

24.同步和異步有什么區別,Python如何實現異步同步:多個任務之間有先后順序執行,一個執行完下個才能執行。
異步:多個任務之間沒有先后順序,可以同時執行有時候一個任務可能要在必要的時候獲取另一個
同時執行的任務的結果,這個就叫回調!
阻塞:如果卡住了調用者,調用者不能繼續往下執行,就是說調用者阻塞了。
非阻塞:如果不會卡住,可以繼續執行,就是說非阻塞的。
同步異步相對於多任務而言,阻塞非阻塞相對於代碼執行而言
答celery可以 asyncio可以了解一下
25.sql語句中使用limit遇到哪些問題,是如何解決的
日常分頁SQL語句 select id,name,content from users order by id asc limit 100000,20 掃描100020行 如果記錄了上次的最大ID select id,name,content from users where id>100073 order by id asc limit 20 掃描20行。
26.
所有信號都是 django.core.signals.Signal
的實例。 providing_args
是一個列表,由信號將提供給監聽者的參數名稱組成。
from django.core.signals import Signal # 1. 定義郵件發送信號 email_send = Signal(providing_args=['email'])
信號處理函數一般定義在定義在子應用下的signals.py
文件中。
# 2. 處理函數定義 def send_email(sender, **kwargs): """email_send信號處理函數""" # TODO: 可以在這里編寫信號的處理代碼 print('email_send信號處理函數被調用')
信號連接就是將信號和處理函數對應起來,信號連接一般是在子應用配置類的ready
方法中進行操作。
class TestAppConfig(object): # ... def ready(self): # 3. 信號連接 email_send.connect(send_email)
發出信號之后,信號連接的處理函數就會被調用。
email_send.send(sender='信號發出者', **kwargs)
27.django懶加載是什么?
答:懶加載:使用的時候再去加載。 1)數據庫查詢: all,filter, exclude, order_by:返回查詢集QuerySet 惰性查詢:只有使用查詢集中數據的時候才會進行數據庫的查詢。 2)項目配置信息 from django.conf import settings
28.Django請求的生命周期
請求生命周期:客戶端發起請求->服務器響應完整過程
29.列舉Django的內置中間件
SessionMiddleWare:session中間件 獲取:request.session['<key>'] 設置:request.session['<key>'] = '<value>' CsrfViewMiddleware:csrf保護中間件 每次請求之前,進行csrf的驗證 process_view AuthenticationMiddleware:認證中間件 request.user:登錄的用戶對象 request.user:匿名用戶類的對象
30.簡述Django下(內建的)緩存機制
你的緩存配置是通過setting 文件的CACHES 配置來實現的: CACHES保存位置: 1. 服務器內存(默認) 2. 保存到數據庫的表中 3. 保存到文件中 4. 保存到內存型數據庫:redis Memcached 緩存級別: 1. 整站緩存 2. 視圖緩存 3. 模板片段緩存 底層緩存API: from django.core.cache import cache cache.set('<key>', '<value>'): 設置緩存 cache.get('<key>'): 獲取緩存 cache.delete('<key>'): 刪除緩存