1.python基礎
1.Python和Java、PHP、C、C#、C++等其他語言的對比?
答:
2.簡述解釋型和編譯型編程語言?
答:解釋型語言,在運行時才進行翻譯,每條語句都是執行時才進行翻譯,效率比較低;
編譯型語言,執行前需將高級語言編譯成機器語言,翻譯只做一次,執行效率較高;
3.位和字節的關系?
答:位,數據傳輸單位;字節,數據存儲單位;
4.b、B、KB、MB、GB 的關系?
答:B->GB為1024關系;1B=8bit
5.通過代碼實現如下轉換:
二進制轉換成十進制:v = “0b1111011”
int("0b1111011",base=2)
十進制轉換成二進制:v = 18
bin(18)
八進制轉換成十進制:v = “011”
int("011",base=8)
十進制轉換成八進制:v = 30
oct(30)
十六進制轉換成十進制:v = “0x12”
int("0x12",base=16)
十進制轉換成十六進制:v = 87 hex(87)
6.請編寫一個函數實現將IP地址轉換成一個整數。
7.python遞歸的最大層數?
答:由sys.setrecursionlimit()設置;
8.求結果:
v1 = 1 or 3
1
v2 = 1 and 3
3
v3 = 0 and 2 and 1 0
v4 = 0 and 2 or 1 1
v5 = 0 and 2 or 1 or 4 1
v6 = 0 or Flase and 1 False
9.ascii、unicode、utf-8、gbk 區別?
答:ascii ,美國制定了一套字符編碼,對英文字符與二進制之間做了聯系,這被稱為ASCII碼;
unicode,所有符號的編碼;
utf-8,它是一種變長編碼,可以使用1-4個字節表示一個符號,根據不同的符號來變化字節長度;
gbk,GB2312的擴展,完全兼容GB2312;
10.字節碼和機器碼的區別?
答:機器碼,名機器語言指令,有時也被稱為原生碼(Native Code),是電腦的CPU可直接解讀的數據。
字節碼(Bytecode)是一種包含執行程序、由一序列 op 代碼/數據對 組成的二進制文件。
11.三元運算規則以及應用場景?
答:在賦值變量的時候,可以直接加判斷,然后賦值
12.列舉 Python2和Python3的區別?
答:
13.用一行代碼實現數值交換:
a = 1
b = 2
答:a,b = b,a
14.Python3和Python2中 int 和 long的區別?
答:3中沒有long
15.xrange和range的區別?
答:xrange返回的是一個生成器對象;
16.文件操作時:xreadlines和readlines的區別?
17.列舉布爾值為False的常見值?
答:None,False,所有為0的數,“”,[],(),{};
18.字符串、列表、元組、字典每個常用的5個方法?
答:字符串,strip、lstrip、rstrip、count、center、find、index、replace、capitalize、startwith、endwith、split、rsplite、join
列表,append、insert、extend、pop、del、reverse、sort、len、max、min、count、index、sorted、insert
字典,get、pop、len、del
19.lambda表達式格式以及應用場景?
答:lambda argument_list:expression
filter、sorted、map、reduce、作為參數傳入
20.pass的作用?
答:作為空語句,保持程序結構的完整性,不做任何事情,一般用於做占位語句
21.*arg和**kwarg作用?
答:python的兩個可變參數,*arg代表多個無名參數,類型未tuple,**kwargs表示關鍵字參數,為dict使用時需要將*rag放置在**kwargs之前,否則會報錯;
22. is和==的區別
答:is判斷id是否相同,==判斷值是否相同
23.簡述Python的深淺拷貝以及應用場景?
答:淺拷貝是只僅僅拷貝數據集合的第一層數據,深拷貝指的是拷貝數據集合的所有層。所以對於只有一層的數據幾個來說深淺拷貝的意義是一樣的,如字典、元祖、集合、列表等。對於數字和字符串而言,無意義,因其永遠指向一個內存地址。
24.Python的垃圾回收機制?
25.Python的可變類型和不可變類型
答:可變類型,列表、字典、可變集合;不可變類型,數字、字符串、元組、不可變集合
26.求結果:
v = dict.fromkeys(['k1','k2'],[]) v[‘k1’].append(666) print(v) v[‘k1’] = 777 print(v)
答:{“K1”:[666],"K2":[666]} {“K1”:777,"K2":[666]}
27.求結果
def num(): return [lambda x:i*x for i in range(4)] print([m(2) for m in num()])
答:[6,6,6,6]
28.列舉常見的內置函數?
答:map、reduce、filter、sort
29.filter、map、reduce的作用?
答:filter,篩選;map,生成新序列;reduce,累加;
30.一行代碼實現9*9乘法表
答:
print('\n'.join(['\t'.join(["%2s*%2s=%2s"%(j,i,i*j) for j in range(1,i+1)]) for i in range(1,10)]))
31.如何安裝第三方模塊?以及用過哪些第三方模塊?
答:①pip install model_name;②python setup.py insyall;
32.至少列舉8個常用模塊都有那些?
33.re的match和search區別?
答:match只檢測開頭,search檢測整個字符串;
34.什么是正則的貪婪匹配?
答:貪婪匹配,趨向於最大長度;非貪婪匹配,匹配到結果就好,就少得匹配字符;
35.求結果: a. [ i % 2 for i in range(10) ] b. ( i % 2 for i in range(10) )
答:[0,1,0,1,0,1,0,1,0,1],(0,1)
36.求結果: a. 1 or 2 b. 1 and 2 c. 1 < (2==2) d. 1 < 2 == 2
答:1,2,False,True
37.def func(a,b=[]) 這種寫法有什么坑?
答:函數的第二個默認參數是一個list,當第一次執行的時候實例化了一個list,第二次執行還是用第一次執行的時候實例化的地址存儲,所以三次執行的結果就是 [1, 1, 1] ,想每次執行只輸出[1] ,默認參數應該設置為None。
38.如何實現 “1,2,3” 變成 [‘1’,’2’,’3’] ?
答:split
39.如何實現[‘1’,’2’,’3’]變成[1,2,3] ?
答:eval([‘1’,’2’,’3’])
40.比較: a = [1,2,3] 和 b = [(1),(2),(3) ] 以及 b = [(1,),(2,),(3,) ] 的區別?
41.如何用一行代碼生成[1,4,9,16,25,36,49,64,81,100] ?
答:
[x*x for x in range(1,11)]
42.一行代碼實現刪除列表中重復的值 ?
set(list)
43.如何在函數中設置一個全局變量 ?
答:global
44.logging模塊的作用?以及應用場景?
45.請用代碼簡答實現stack ;
答:
calss Stack(object): def __init__(self): self.stack = [] def push(seld,value): self.stack.append(value) def pop(self): if self.stack: self.stack.pop() else: raise LookupError("stack is empty!") def is_empty(self): return bool(self,stack) def top(self): return self.stack[-1]
46.常用字符串格式化哪幾種?
答:①%s;②%(first)s;③format;
47.簡述 生成器、迭代器、可迭代對象 以及應用場景?
答:生成器,函數體中有yield關鍵字的函數;
迭代器,一個可以記住遍歷位置的對象;__iter__()返回一個特殊地迭代器對象,__next__()返回下一個迭代器對象
48.用Python實現一個二分查找的函數。
答:
data = [1, 3, 6, 7, 9, 12, 14, 16, 17, 18, 20, 21, 22, 23, 30, 32, 33, 35] def binary_search(dataset,find_num): if len(dataset) > 1: mid = int(len(dataset) / 2) if dataset[mid] == find_num: # find it print("找到數字", dataset[mid]) elif dataset[mid] > find_num: # 找的數在mid左面 print("\033[31;1m找的數在mid[%s]左面\033[0m" % dataset[mid]) return binary_search(dataset[0:mid], find_num) else: # 找的數在mid右面 print("\033[32;1m找的數在mid[%s]右面\033[0m" % dataset[mid]) return binary_search(dataset[mid + 1:], find_num) else: if dataset[0] == find_num: # find it print("找到數字啦", dataset[0]) else: print("沒的分了,要找的數字[%s]不在列表里" % find_num) binary_search(data,20)
49.談談你對閉包的理解?
答:在一個外函數中定義了一個內函數,內函數里運用了外函數的臨時變量,並且外函數的返回值是內函數的引用。這樣就構成了一個閉包。
50.os和sys模塊的作用?
答:os,提供一種方便的使用操作系統的函數的方法;
sys,可供解釋器使用或維護的變量和解釋器進行交互的函數;
51.如何生成一個隨機數?
答:使用random函數;
55.如何使用python刪除一個文件?
答:os模塊,os.remove,os.removedirs(path),os.rmdir(path)
56.談談你對面向對象的理解?
答:所謂的面向對象就是將我們的程序模塊化,對象化,把具體事物的特性屬性和通過這些屬性來實現一些動作的具體方法放到一個類里面,這就是封裝。封裝是我們所說的面相對象編程的特征之一。除此之外還有繼承和多態。
57.談談你對面向對象的理解?
58.Python面向對象中的繼承有什么特點?
答:建造系統中的類,避免重復操作;新類是基於已經存在的類,這樣可以提升代碼的復用程度
59.面向對象深度優先和廣度優先是什么?
答:
60.面向對象中super的作用?
答:用於調用父類的一個方法
61.是否使用過functools中的函數?其作用是什么?
答:用於高階函數,指那些作用於函數或者返回其他函數的函數。通常情況下,只要是可以被當做函數調用的對象就是這個模塊的目標。
62.列舉面向對象中帶爽下划線的特殊方法,如:__new__、__init__
63.如何判斷是函數還是方法?
答:函數,函數是封裝了一些獨立的功能,可以直接調用,python內置了許多函數,同時可以自建函數來使用。
方法:方法和函數類似,同樣封裝了獨立的功能,但是方法是需要通過對象來調用的,表示針對這個對象要做的操作,使用時采用點方法。
64.靜態方法和類方法區別?
答:都可以通過實例或者類調用,不過實例方法通過類調用時需要傳遞實例的引用;
65.列舉面向對象中的特殊成員以及應用場景
答:__doc__描述類的信息
__call__對象后面加括號,觸發執行
__dict__查看類或對象的所有成員
__str__打印對象時,默認輸出該方法的返回值
__getitem__,__setitem__,__delitem__用於索引操作,如字典,分別表示獲取,設置,刪除數據
__new__,__metaclass__
66.1、2、3、4、5 能組成多少個互不相同且無重復的三位數
答:
67.什么是反射?以及應用場景?
答:核心本質其實就是利用字符串的形式去對象(模塊)中操作(查找/獲取/刪除/添加)成員,一種基於字符串的事件驅動
68.metaclass作用?以及應用場景?
答:MetaClass是用來創建類的,就好比類是用來創建對象的。如果說類是對象的模板,那么metaclass就是類的模板。
直接將需要的屬性全部作為新組合類的成員列出來;
分別將各個獨立的屬性集定義成單個的類,然后通過在組合類添加每個屬性類的實例(instance)的方式來引用各個屬性類中定義的屬性;
69.用盡量多的方法實現單例模式。
答:
#模塊單例 #fool.py class Singleton(object): def foo(self): pass singleton = Singleton() #foo.py from fool import singleton
#靜態變量方法 class Singleton(object): def __new__(cls,a): if not hasattr(cls."_instance"): cls._instance =object.__new__(cls) return cls._instance def __init__(self,a): self.a=a def aa(self): print(a) a=Singleton("a")
class Singleton1(type): def __init__(self, *args, **kwargs): self.__instance = None super(Singleton1,self).__init__(*args, **kwargs) def __call__(self, *args, **kwargs): if self.__instance is None: self.__instance = super(Singleton1,self).__call__(*args, **kwargs) return self.__instance class Singleton2(type): _inst = {} def __call__(cls, *args, **kwargs): print(cls) if cls not in cls._inst: cls._inst[cls] = super(Singleton2, cls).__call__(*args) return cls._inst[cls] class C(metaclass=Singleton1): pass
def singleton(cls, *args, **kw): instance = {} def _singleton(args): if cls not in instance: instance[cls] = cls(*args, **kw) return instance[cls] return _singleton @singleton class A: pass
70.裝飾器的寫法以及應用場景。
答:python裝飾器本質上就是一個函數,它可以讓其他函數在不需要做任何代碼變動的前提下增加額外的功能,裝飾器的返回值也是一個函數對象(函數的指針)
①授權;②日志;③帶參數的裝飾器;④在函數中嵌入裝飾器;⑤裝飾器類
71.異常處理寫法以及如何主動跑出異常(應用場景)
答:
try: pass except Exception as e: print(str(e)) else: pass finally: pass #主動拋出異常 raise TypeError("error!")
72.什么是面向對象的mro
答:方法解析順序
經典類(calssic class),深度優先遍歷當用super調用父類的方法時,會按照__mro__屬性中的元素順序去挨個查找方法。我們可以通過“類名.__mro__”或“類名.mro()”來查看上面代碼中D類的__mro__屬性值:
73.isinstance作用以及應用場景?
答:來判斷一個對象是否是一個已知的類型;
判斷object是否與第二個參數的類型相同
74.寫代碼並實現:
Given an array of integers, return indices of the two numbers such that they add up to a specific target.You may assume that each input would
have exactly one solution, and you may not use the same element twice.
Example:
Given nums = [2, 7, 11, 15], target = 9,
Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1]
75.json序列化時,可以處理的數據類型有哪些?如何定制支持datetime類型?
答: string、int、list、tuple、dict、bool、null
定制支持datetime類型
76.json序列化時,默認遇到中文會轉換成unicode,如果想要保留中文怎么辦?
答:
import json a=json.dumps({"ddf":"你好"},ensure_ascii=False) print(a) #{"ddf": "你好"}
77.什么是斷言?應用場景?
答:是用來檢查一個條件,如果它為真,就不做任何事。如果它為假,則會拋出AssertError並且包含錯誤信息。例如:
防御型的編程
運行時檢查程序邏輯
檢查約定
程序常量
檢查文檔
78.有用過with statement嗎?它的好處是什么?
答:語句的作用是通過某種方式簡化異常處理,它是所謂的上下文管理器的一種
79.使用代碼實現查看列舉目錄下的所有文件。
80.簡述 yield和yield from關鍵字。
答:yield from generator 。實際上就是返回另外一個生成器
yield 生成器
2.網絡編程和並發
1.簡述 OSI 七層協議。
答:物理層,數據連接層,網絡層,傳輸層,會話層,表示層,應用層
2.什么是C/S和B/S架構?
答:C/S是客戶端和服務器端結構;B/S是瀏覽器和服務器結構;
3.簡述 三次握手、四次揮手的流程。
答:三次握手,①連接開始時,連接建立發送SYN包到服務器,並進入SYN_SENT狀態,等待服務器確認;SYN:同步序列號編號;②服務器收到SYN包,並確認SYN,同時發送自己的一個SYN包,即SYN+ACK包,此事服務器進入SYN_RECV狀態;③客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK,此包發送完畢,客戶端與服務器同時進入ESTABLISHED狀態,完成三次握手;
四次握手
- 1)A的應用進程先向其TCP發出連接釋放報文段(FIN=1,序號seq=u),並停止再發送數據,主動關閉TCP連接,進入FIN-WAIT-1(終止等待1)狀態,等待B的確認。
- 2)B收到連接釋放報文段后即發出確認報文段,(ACK=1,確認號ack=u+1,序號seq=v),B進入CLOSE-WAIT(關閉等待)狀態,此時的TCP處於半關閉狀態,A到B的連接釋放。
- 3)A收到B的確認后,進入FIN-WAIT-2(終止等待2)狀態,等待B發出的連接釋放報文段。
- 4)B沒有要向A發出的數據,B發出連接釋放報文段(FIN=1,ACK=1,序號seq=w,確認號ack=u+1),B進入LAST-ACK(最后確認)狀態,等待A的確認。
- 5)A收到B的連接釋放報文段后,對此發出確認報文段(ACK=1,seq=u+1,ack=w+1),A進入TIME-WAIT(時間等待)狀態。此時TCP未釋放掉,需要經過時間等待計時器設置的時間2MSL后,A才進入CLOSED狀態。
4.什么是arp協議?
答:地址解析協議,使用ARP協議可實現通過IP地址獲得對應主機的物理地址(MAC地址)。
5.TCP和UDP的區別?
答:
1、TCP面向連接(如打電話要先撥號建立連接);UDP是無連接的,即發送數據之前不需要建立連接
2、TCP提供可靠的服務。也就是說,通過TCP連接傳送的數據,無差錯,不丟失,不重復,且按序到達;UDP盡最大努力交付,即不保證可靠交付
3、TCP面向字節流,實際上是TCP把數據看成一連串無結構的字節流;UDP是面向報文的
UDP沒有擁塞控制,因此網絡出現擁塞不會使源主機的發送速率降低(對實時應用很有用,如IP電話,實時視頻會議等)
4、每一條TCP連接只能是點到點的;UDP支持一對一,一對多,多對一和多對多的交互通信
5、TCP首部開銷20字節;UDP的首部開銷小,只有8個字節
6、TCP的邏輯通信信道是全雙工的可靠信道,UDP則是不可靠信道
6.什么是局域網和廣域網?
答:局域網和廣域網是按規模大小而划分的兩種計算機網絡。范圍在幾千米以內的計算機網絡統稱為局域網;而連接的范圍超過10千米的,則稱為廣域網,因特網(Intenet)就是目前最大的廣域網。
7.為何基於tcp協議的通信比基於udp協議的通信更可靠?
8.什么是socket?簡述基於tcp協議的套接字通信流程。
9.什么是粘包? socket 中造成粘包的原因是什么? 哪些情況會發生粘包現象?
10.IO多路復用的作用?
11.什么是防火牆以及作用?
12.select、poll、epoll 模型的區別?
13.簡述 進程、線程、協程的區別 以及應用場景?
14.GIL鎖是什么鬼?
15.Python中如何使用線程池和進程池?
16.threading.local的作用?
17.進程之間如何進行通信?
18.什么是並發和並行?
19.進程鎖和線程鎖的作用?
20.解釋什么是異步非阻塞?
21.路由器和交換機的區別?
22.什么是域名解析?
23.如何修改本地hosts文件?
24.生產者消費者模型應用場景及優勢?
25.什么是cdn?
26.LVS是什么及作用?
27.Nginx是什么及作用?
28.keepalived是什么及作用?
29.haproxy是什么以及作用?
30.什么是負載均衡
31.什么是rpc及應用場景?
32.簡述 asynio模塊的作用和應用場景。
33.簡述 gevent模塊的作用和應用場景。
34.twisted框架的使用和應用?
3.數據庫和緩存
1.列舉常見的關系型數據庫和非關系型都有那些?
答:關系型,Oracle、DB2、Microsoft SQL Server、Microsoft Access、MySQL
非關系型,NoSql、Cloudant、MongoDb、redis、HBase
2.MySQL常見數據庫引擎及比較?
答:
3.簡述數據三大范式?
答:①當關系模式R的所有屬性都不能在分解為更基本的數據單位時,稱R是滿足第一范式的,簡記為1NF。滿足第一范式是關系模式規范化的最低要
②如果關系模式R滿足第一范式,並且R得所有非主屬性都完全依賴於R的每一個候選關鍵屬性,稱R滿足第二范式,簡記為2NF。
③設R是一個滿足第一范式條件的關系模式,X是R的任意屬性集,如果X非傳遞依賴於R的任意一個候選關鍵字,稱R滿足第三范式,簡記為3NF.
4.什么是事務?MySQL如何支持事務?
答:事務是由一步或幾步數據庫操作序列組成邏輯齒形單元,這系列妖魔全部執行,要么全部放棄執行。具有原子性,一致性,隔離性,持續性。
①begin,rollback,commit來實現;②直接使用set來改變mysql的自動提交模式;
5.簡述數據庫設計中一對多和多對多的應用場景?
答:一對一,外鍵關聯、主鍵關聯;
多對多,一般采用中間表的方式處理,將多對多表轉化為兩個一對多;
6.如何基於數據庫實現商城商品計數器?
答:
create table product (id primary key auto_increment, pname varchar(64), pcount int);
7.常見SQL(必備)
詳見武沛齊博客:https://www.cnblogs.com/wupeiqi/articles/5729934.html
8.簡述觸發器、函數、視圖、存儲過程?
9.MySQL索引種類
普通索引:這是最基本的索引,它沒有任何限制,比如上文中為title字段創建的索引就是一個普通索引,MyIASM中默認的BTREE類型的索引,也是我們大多數情況下用到的索引。
–直接創建索引 CREATE INDEX index_name ON table(column(length)) –修改表結構的方式添加索引 ALTER TABLE table_name ADD INDEX index_name ON (column(length)) –創建表的時候同時創建索引 CREATE TABLE `table` ( `id` int(11) NOT NULL AUTO_INCREMENT , `title` char(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL , `content` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL , `time` int(10) NULL DEFAULT NULL , PRIMARY KEY (`id`), INDEX index_name (title(length)) ) –刪除索引 DROP INDEX index_name ON table
唯一索引:與普通索引類似,不同的就是:索引列的值必須唯一,但允許有空值(注意和主鍵不同)。如果是組合索引,則列值的組合必須唯一,創建方法和普通索引類似
–創建唯一索引 CREATE UNIQUE INDEX indexName ON table(column(length)) –修改表結構 ALTER TABLE table_name ADD UNIQUE indexName ON (column(length)) –創建表的時候直接指定 CREATE TABLE `table` ( `id` int(11) NOT NULL AUTO_INCREMENT , `title` char(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL , `content` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL , `time` int(10) NULL DEFAULT NULL , PRIMARY KEY (`id`), UNIQUE indexName (title(length)) );
全文索引:MySQL從3.23.23版開始支持全文索引和全文檢索,FULLTEXT索引僅可用於 MyISAM 表;他們可以從CHAR、VARCHAR或TEXT列中作為CREATE TABLE語句的一部分被創建,或是隨后使用ALTER TABLE 或CREATE INDEX被添加。////對於較大的數據集,將你的資料輸入一個沒有FULLTEXT索引的表中,然后創建索引,其速度比把資料輸入現有FULLTEXT索引的速度更為快。不過切記對於大容量的數據表,生成全文索引是一個非常消耗時間非常消耗硬盤空間的做法。
–創建表的適合添加全文索引 CREATE TABLE `table` ( `id` int(11) NOT NULL AUTO_INCREMENT , `title` char(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL , `content` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL , `time` int(10) NULL DEFAULT NULL , PRIMARY KEY (`id`), FULLTEXT (content) ); –修改表結構添加全文索引 ALTER TABLE article ADD FULLTEXT index_content(content) –直接創建索引 CREATE FULLTEXT INDEX index_content ON article(content)
組合索引(最左前綴):平時用的SQL查詢語句一般都有比較多的限制條件,所以為了進一步榨取MySQL的效率,就要考慮建立組合索引。
–使用到上面的索引 SELECT * FROM article WHREE title='測試' AND time=1234567890; SELECT * FROM article WHREE utitle='測試'; –不使用上面的索引 SELECT * FROM article WHREE time=1234567890;
10.索引在什么情況下遵循最左前綴的規則?
11.主鍵和外鍵的區別?
答:主鍵,唯一標識一條記錄,不能有重復的,不允許為空
外鍵,表的外鍵是另一表的主鍵, 外鍵可以有重復的, 可以是空值
12.MySQL常見的函數?
答:字符串函數,數字函數,日期函數,高級函數
13.列舉 創建索引但是無法命中索引的8種情況。
答:①如果條件中有or,即使其中有條件帶索引也不會使用;②對於多列索引,不是使用的第一部分(第一個),則不會使用索引;③like查詢是以%開頭;④如果列類型是字符串,那一定要在條件中將數據使用引號引用起來,否則不使用索引;⑤如果mysql估計使用全表掃描要比使用索引快,則不使用索引;
14.如何開啟慢日志查詢?
答:開啟慢查詢日志,可以讓MySQL記錄下查詢超過指定時間的語句,通過定位分析性能的瓶頸,才能更好的優化數據庫系統的性能。
#查看慢查詢相關參數 show variables like 'slow_query%'; show variables like 'long_query_time'; #設置,臨時生效 set global slow_query_log='ON'; set global slow_query_log_file='/var/lib/mysql/test-10-226-slow.log'; set global long_query_time=1; #設置,永久生效 #編輯配置文件/etc/my.cnf加入如下內容 [mysqld] slow_query_log = ON slow_query_log_file = /var/lib/mysql/test-10-226-slow.log long_query_time = 1
15.數據庫導入導出命令(結構+數據)?
答:
16.數據庫優化方案?
答:
17.char和varchar的區別?
答:char的長度是不可變的;varchar的長度是可變的
18.簡述MySQL的執行計划?
答:
19.在對name做了唯一索引前提下,簡述以下區別:
select * from tb where name = ‘Oldboy-Wupeiqi’
select * from tb where name = ‘Oldboy-Wupeiqi’ limit 1
答:切片的作用相似,沒有步進參數
20.1000w條數據,使用limit offset 分頁時,為什么越往后翻越慢?如何解決?
答:當一個數據庫表過於龐大,LIMIT offset, length中的offset值過大,則SQL查詢語句會非常緩慢
子查詢優化法;倒排表優化法;反向查找優化法;limit限制優化法;只查索引法
21.什么是索引合並?
答:索引合並是把幾個索引的范圍掃描合並成一個索引;索引合並的時候,會對索引進行並集,交集或者先交集再並集操作,以便合並成一個索引;這些需要合並的索引只能是一個表的。不能對多表進行索引合並。
22.什么是覆蓋索引?
答:如果索引的葉子節點包含了要查詢的數據,那么就不用回表查詢了,也就是說這種索引包含(亦稱覆蓋)所有需要查詢的字段的值,我們稱這種索引為覆蓋索引。
23.簡述數據庫讀寫分離?
答:讓主數據庫處理事務性查詢,而從數據庫處理SELECT查詢。數據庫復制被用來把事務性查詢導致的變更同步到集群中的從數據庫
24.簡述數據庫分庫分表?(水平、垂直)
答:
25.redis和memcached比較?
26.redis中數據庫默認是多少個db 及作用?
27.python操作redis的模塊?
28.如果redis中的某個列表中的數據量非常大,如果實現循環顯示每一個值?
29.redis如何實現主從復制?以及數據同步機制?
30.redis中的sentinel的作用?
31.如何實現redis集群?
32.redis中默認有多少個哈希槽?
33.簡述redis的有哪幾種持久化策略及比較?
34.列舉redis支持的過期策略。
35.MySQL 里有 2000w 數據,redis 中只存 20w 的數據,如何保證 redis 中都是熱點數據?
36.寫代碼,基於redis的列表實現 先進先出、后進先出隊列、優先級隊列。
37.如何基於redis實現消息隊列?
38.如何基於redis實現發布和訂閱?以及發布訂閱和消息隊列的區別?
39.什么是codis及作用?
40.什么是twemproxy及作用?
41.寫代碼實現redis事務操作。
42.redis中的watch的命令的作用?
43.基於redis如何實現商城商品數量計數器?
44.簡述redis分布式鎖和redlock的實現機制。
45.什么是一致性哈希?Python中是否有相應模塊?
46.如何高效的找到redis中所有以oldboy開頭的key?
4.前端、框架和其他
1.談談你對http協議的認識。
答:因特網上應用最廣泛的一種網絡協議,基於TCP、IP通訊協議來傳輸數據;
2.談談你對websocket協議的認識。
答:
3.什么是magic string ?
4.如何創建響應式布局?
5.你曾經使用過哪些前端框架?
6.什么是ajax請求?並使用jQuery和XMLHttpRequest對象實現一個ajax請求。
7.如何在前端實現輪訓?
8.如何在前端實現長輪訓?
9.vuex的作用?
10.vue中的路由的攔截器的作用?
11.axios的作用?
12.列舉vue的常見指令。
簡13.述jsonp及實現原理?
14.是什么cors ?
15.列舉Http請求中常見的請求方式?
答:GET、HEAD、POST、PUT、DELETE、CONNECT、OPTIONS、TRACE
16.列舉Http請求中的狀態碼?
答:200-請求成功;301 - 資源被永久轉移到其他URL;404 - 請求的資源不存在;500 - 內部服務器錯誤
17.列舉Http請求中常見的請求頭?
答:Allow,Date,Location
18.看圖寫結果:
答:李傑
19.看圖寫結果:
答:武沛齊
20.看圖寫結果:
答:老男孩
21.看圖寫結果:
22.看圖寫結果:
23.看圖寫結果:
24.django、flask、tornado框架的比較?
25.什么是wsgi?
答:一種描述web server與web appliaction的通訊的規范
26.django請求的生命周期?
答:wsgi - 中間件 - 路由系統 - 視圖函數 - (ORM,Template,渲染)
27.列舉django的內置組件?
答:admin,model,form
28.列舉django中間件的5個方法?以及django中間件的應用場景?
答:Process Request:請求進來時,權限認證;
process view:路由匹配之后,能夠得到的視圖;
process exception:異常時執行;
process template responseprocess:模板渲染時執行
process response:請求有響應時執行
29.簡述什么是FBV和CBV?
答:FBV,基於函數的視圖;CBV,基於類的視圖;
30.django的request對象是在什么時候創建的?
答:請求走到WSGIHandler類的時候,執行cell方法,將environ封裝成request
31.如何給CBV的程序添加裝飾器?
答:
from django.utils.decorators import method_decorator 1、給方法加: @method_decorator(check_login) def post(self, request): ... 2、給dispatch加: @method_decorator(check_login) def dispatch(self, request, *args, **kwargs): ... 3、給類加: @method_decorator(check_login, name="get") @method_decorator(check_login, name="post") class HomeView(View): ...
32.列舉django orm 中所有的方法(QuerySet對象的所有方法)
答:all(),filter(**kwargs),get(**kwargs),exclude(**kwargs),order_by(*field),reverse(),count(),first()
33.only和defer的區別?
答:only("id"),取的對象只有id,defer則除了id都有
34.select_related和prefetch_related的區別?
答:
前提:有外鍵存在時,可以很好的減少數據庫請求的次數,提高性能
select_related通過多表join關聯查詢,一次性獲得所有數據,只執行一次SQL查詢
prefetch_related分別查詢每個表,然后根據它們之間的關系進行處理,執行兩次查詢
35.filter和exclude的區別?
答:兩者取到的值都是QuerySet對象,filter選擇滿足條件的,exclude:排除滿足條件的.
36.列舉django orm中三種能寫sql語句的方法。
答:
1.使用execute執行自定義的SQL
直接執行SQL語句(類似於pymysql的用法)
# 更高靈活度的方式執行原生SQL語句
from django.db import connection
cursor = connection.cursor()
cursor.execute("SELECT DATE_FORMAT(create_time, '%Y-%m') FROM blog_article;")
ret = cursor.fetchall()
print(ret)
2.使用extra方法 :queryset.extra(select={"key": "原生的SQL語句"})
3.使用raw方法
1.執行原始sql並返回模型
2.依賴model多用於查詢
37.django orm 中如何設置讀寫分離?
答:
38.F和Q的作用?
答:Q查詢——對對象的復雜查詢;F查詢——專門取對象中某列值的操作;
39.values和values_list的區別?
答:values方法可以獲取number字段的字典列表;values_list可以獲取number的元組列表
40.如何使用django orm批量創建數據?
答:批量插入數據的時候,首先要創建一個對象的列表,然后調用bulk_create方法,一次將列表中的數據插入到數據庫中。
product_list_to_insert = list() for x in range(10): product_list_to_insert.append(Product(name='product name ' + str(x), price=x)) Product.objects.bulk_create(product_list_to_insert)
41.django的Form和ModeForm的作用?
答:form,①生成頁面可用的HTML標簽;②對用戶提交的數據進行校驗;③保留上次輸入的內容;
ModelForm,Django 提供一個輔助類來讓我們可以從Django 的模型創建Form
42.django的Form組件中,如果字段中包含choices參數,請使用兩種方式實現數據源實時更新。
答:
def__init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.fields["city"].widget.choices = models.City.objects.all().values_list("id", "name") authors = form_model.ModelMultipleChoiceField(queryset=models.NNewType.objects.all())//多選
43.django的Model中的ForeignKey字段中的on_delete參數有什么作用?
答:
- 刪除關聯表中的數據時,當前表與其關聯的field的操作
44.django中csrf的實現機制?
答:
- 第一步:django第一次響應來自某個客戶端的請求時,后端隨機產生一個token值,把這個token保存在SESSION狀態中;同時,后端把這個token放到cookie中交給前端頁面;
- 第二步:下次前端需要發起請求(比如發帖)的時候把這個token值加入到請求數據或者頭信息中,一起傳給后端;Cookies:{csrftoken:xxxxx}
- 第三步:后端校驗前端請求帶過來的token和SESSION里的token是否一致。
45.django如何實現websocket?
答:
django實現websocket官方推薦大家使用channels。channels通過升級http協議 升級到websocket協議。保證實時通訊。也就是說,我們完全可以用channels實現我們的即時通訊。而不是使用長輪詢和計時器方式來保證偽實時通訊。他通過改造django框架,使django既支持http協議又支持websocket協議。
46.基於django使用ajax發送post請求時,都可以使用哪種方法攜帶csrf token?
答:
后端將csrftoken傳到前端,發送post請求時攜帶這個值發送
data: { csrfmiddlewaretoken: '{{ csrf_token }}' },
獲取form中隱藏標簽的csrftoken值,加入到請求數據中傳給后端
data: { csrfmiddlewaretoken:$('[name="csrfmiddlewaretoken"]').val() },
cookie中存在csrftoken,將csrftoken值放到請求頭中
headers:{ "X-CSRFtoken":$.cookie("csrftoken")}
47.django中如何實現orm表中添加數據時創建一條日志記錄。
48.django緩存如何設置?
答:
# 全站緩存 MIDDLEWARE_CLASSES = ( ‘django.middleware.cache.UpdateCacheMiddleware’, #第一 'django.middleware.common.CommonMiddleware', ‘django.middleware.cache.FetchFromCacheMiddleware’, #最后 ) # 視圖緩存 from django.views.decorators.cache import cache_page import time @cache_page(15) #超時時間為15秒 def index(request): t=time.time() #獲取當前時間 return render(request,"index.html",locals()) # 模板緩存 {% load cache %} <h3 style="color: green">不緩存:-----{{ t }}</h3> {% cache 2 'name' %} # 存的key <h3>緩存:-----:{{ t }}</h3> {% endcache %}
49.django的緩存能使用redis嗎?如果可以的話,如何配置?
答:
#1.安裝 pip install django-redis #2.在stting中配置CACHES,可以設置多個緩存,根據名字使用 CACHES = { "default": { "BACKEND": "django_redis.cache.RedisCache", "LOCATION": "redis://127.0.0.1:6379", "OPTIONS": { "CLIENT_CLASS": "django_redis.client.DefaultClient", "CONNECTION_POOL_KWARGS": {"max_connections": 100} # "PASSWORD": "密碼", } } }, #另添加緩存 "JERD": { } #3.根據名字去連接池中獲取連接 from django_redis import get_redis_connection conn = get_redis_connection("default")
50.django路由系統中name的作用?
答:
51.django的模板中filter和simple_tag的區別?
答:
# 自定義filter:{{ 參數1|filter函數名:參數2 }} # 1.可以與if標簽來連用 # 2.自定義時需要寫兩個形參 # simple_tag:{% simple_tag函數名 參數1 參數2 %} # 1.可以傳多個參數,沒有限制 # 2.不能與if標簽來連用
filter,可以與if標簽來連用,自定義是需要寫兩個形參;simple_tags,可以傳多個參數沒有限制,不能與if連用;
52.django-debug-toolbar的作用?
答:1.是django的第三方工具包,給django擴展了調試功能
#包括查看sql語句,db查詢次數,request,headers等
53.django中如何實現單元測試?
答:
54.解釋orm中 db first 和 code first的含義?
#數據持久化的方式: #db first基於已存在的數據庫,生成模型 #code first基於已存在的模型,生成數據庫庫
55.django中如何根據數據庫表生成model中的類?
答:
#1.在settings中設置要連接的數據庫 #2.生成model模型文件 #python manage.py inspectdb #3.模型文件導入到models中 # python manage.py inspectdb > app/models.py
56.使用orm和原生sql的優缺點?
答:
#1.orm的開發速度快,操作簡單。使開發更加對象化 #執行速度慢。處理多表聯查等復雜操作時,ORM的語法會變得復雜 #2.sql開發速度慢,執行速度快。性能強
57.簡述MVC和MTV
答:
58.django的contenttype組件的作用?
答:
#這個組件保存了項目中所有app和model的對應關系,每當我們創建了新的model並執行數據庫遷移后,ContentType表中就會自動新增一條記錄 #當一張表和多個表FK關聯,並且多個FK中只能選擇其中一個或其中n個時,可以利用contenttypes
59.談談你對restfull 規范的認識?
60.接口的冪等性是什么意思?
61.什么是RPC?
62.Http和Https的區別?
63.為什么要使用django rest framework框架?
64.django rest framework框架中都有那些組件?
答:
#1.序列化組件:serializers 對queryset序列化以及對請求數據格式校驗 #2.路由組件routers 進行路由分發 #3.視圖組件ModelViewSet 幫助開發者提供了一些類,並在類中提供了多個方法 #4.認證組件 寫一個類並注冊到認證類(authentication_classes),在類的的authticate方法中編寫認證邏 #5.權限組件 寫一個類並注冊到權限類(permission_classes),在類的的has_permission方法中編寫認證邏輯。 #6.頻率限制 寫一個類並注冊到頻率類(throttle_classes),在類的的allow_request/wait 方法中編寫認證邏輯 #7.解析器 選擇對數據解析的類,在解析器類中注冊(parser_classes) #8.渲染器 定義數據如何渲染到到頁面上,在渲染器類中注冊(renderer_classes) #9.分頁 對獲取到的數據進行分頁處理, pagination_class #10.版本 版本控制用來在不同的客戶端使用不同的行為 #在url中設置version參數,用戶請求時候傳入參數。在request.version中獲取版本,根據版本不同 做不同處理
65.django rest framework框架中的視圖都可以繼承哪些類?
答:
#class View(object): #class APIView(View): 封裝了view,並且重新封裝了request,初始化了各種組件 #class GenericAPIView(views.APIView): #1.增加了一些屬性和方法,如get_queryset,get_serializer #class GenericViewSet(ViewSetMixin, generics.GenericAPIView) #父類ViewSetMixin 重寫了as_view,返回return csrf_exempt(view) #並重新設置請求方式與執行函數的關系 #class ModelViewSet(mixins.CreateModelMixin, # mixins.RetrieveModelMixin, # mixins.UpdateModelMixin, # mixins.DestroyModelMixin, # mixins.ListModelMixin, # GenericViewSet):pass #繼承了mixins下的一些類,封裝了list,create,update等方法 #和GenericViewSet
66.簡述 django rest framework框架的認證流程。
答:
#1.用戶請求走進來后,走APIView,初始化了默認的認證方法 #2.走到APIView的dispatch方法,initial方法調用了request.user #3.如果我們配置了認證類,走我們自己認證類中的authentication方法
67.django rest framework如何實現的用戶訪問頻率控制?
答:
#使用IP/用戶賬號作為鍵,每次的訪問時間戳作為值,構造一個字典形式的數據,存起來,每次訪問時對時間戳列表的元素進行判斷, #把超時的刪掉,再計算列表剩余的元素數就能做到頻率限制了 #匿名用戶:使用IP控制,但是無法完全控制,因為用戶可以換代理IP登錄用戶:使用賬號控制,但是如果有很多賬號,也無法限制