第一部分 Python基礎篇(80題)
4. 解釋型語言,程序邊運行邊解釋
編譯型語言,程序會先生成目標文件,經過連接生成可執行文件
5.python解釋器總類及特色:
cpython:C語言開發使用最廣
ipython:基於cpython採用jit技術,對python進行動態編譯,提升執效率
jpython:運行在java上的解釋器,直接把py代碼編譯成java字節碼執行
6.位和字節的關係
8位==1字節
7.b,B,KB,MB,GB
8b=1B
1024B=1KB
1024KB=1MB
1024MB=1GB
8.請至少列舉5個PEP8規範(越多越好)
1.代碼編排縮進,4個空格的縮進,不使用tap,更不能混合使用tap和空格
2.不要在一句import中引用多個庫
3.儘可能避免沒必要要的空格
4.逗號,冒號,分號前不加空格
5.操做符左右更加一個空格
6.若是採用from xx import xx引用庫,能夠省略'module.',均可能出現命名衝突,這時要採用import xx
9.經過代碼實現進制轉換
#十進制轉換成2,8,16進制
v = 18
print(bin(v))#十進制轉換成二進制
v = 18
print(oct(v))#十進制轉換成八進制
v= 18
print(hex(v))#十進制轉18進制
#2,8,16進制轉換成10進制
v = '0b1111011'
print(int(v,2))#二進制字符串
v='011'#八進制
print(int(v,8))
v='0x0E'
print(int(v,16))
10.請編寫一個函數實現將IP地址轉換成一個整數
def Change(addr):
# 取每一個數
id = [int(x) for x in addr.split(".")]
print(id)
return sum(id[i] << [24, 16, 8, 0][i] for i in range(4))
ip = '10.3.9.12'
print(bin(Change(ip)))
11.python的最大遞歸層數
998層
12.求結果
or 從左到右,有一個真的值,則返回第一個真的值,若全部值都爲假,則返回最後一個值
and 從左到右,有一個假的值,則返回第一個假的值,若全部值均爲真,則返回最後一個值
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
13.ascii、unicode、utf-八、gbk區別
ascii 位字符編碼
gb2312 編碼:2字節表示一個漢字,最多表示65535個漢字
gbk編碼是對gb2312的擴展,徹底兼容gb2312
unicode是全部字符的集合
unt-8是unicode的擴展,字符爲1字節,漢字爲3字節
14.字節碼和機器碼的區別
字節碼:與硬件無關,通過編譯的,不可閱讀,實現方式:編譯器和虛擬機
字節碼是一種中間狀態(中間碼)的二進制代碼(文件)。須要直譯器轉義後才能成爲機器碼。
機器碼:電腦cpu直接讀取運行的機器指令,運行速度快,比較晦澀難懂
15.三元運算規則及應用場景
表達式?true:false
表達式的值若是爲真,則爲true,不然爲false
16.列舉py2和py3的區別
print函數 py2不須要括號,py3須要括號好
py2中有xrange和range py3中只有xrange => rang:其中rang是個迭代器
xreadline和readline
py2中經典類和新式類並不同,經典類的深度優先繼承,新式類是廣度優先
py3中經典類和新式類都是廣度優先
17.用一行代碼實現數值交換:
a=10
b=9
a,b=b,a
a,b = b,a
18.python2與py3中的long與int的區別
py2中的long類型==py3中的int類型
19.xrange與rang的區別:
py2中 xrange等於py3中的range是個迭代器
py2中的range是個列表
20.文件操做時:xreadlines和readlines的區別?
xreadlines是個迭代器
readlines是個列表,每一行爲一個列表元素
21.列舉布爾值爲False的常見值:
bool("")
bool([])
bool({})
bool(0)
bool(-0)
22.字符串、列表、元組、字典每一個經常使用的5個方法
str.spilt()
str.join()
str.replace()
字符串:str.split()
str.join()
str.replace()
str.upper()
str.count()
列表:list.append()
list.pop()
list.remove()
list.index()
list.extend()#列表拼接
元組(只能讀,不能更改):
字典:dict.get()
dict.update()#字典合併
dict.item()#字典轉換成列表
dict.setdefault()#添加字典,若是存在相同的鍵值,則不添加
23.lambda(匿名函數)表達格式及應用場景
calc=lambda x:x*3 lambda x :x*3
調用calc(3)
24.pass的做用?
終止本次循環
25.*arg與**kwargs做用
*arg:多個參數元組
**kwargs:字典
26 is與==的區別
變量的三個基本要素:分別是id,type,value
==:判斷value
is:判斷id
27.簡述深淺copy及應用場景
copy模塊
copy.copy
copy.deepcopy
字面:深淺copy對於字符串,數字,僅有一層的字典,列表,元組同樣,都只拷貝內存地址
內存地址的角度:
深copy對於字符串和數字與淺copy同樣
對於多層字典和列表:
第一層深淺copy相同,可是對於第二層,深copy會指向對象的值的內存地址,而淺copy則會只指向對象的第二層內存地址
28.python的垃圾回收機制
python會定時的去搜索沒有被指向的變量,進行清除
29.python的可變類型和不可變類型
python的可變類型爲:列表,字典
列表與字典中的值能夠更改
python的不可變類型爲:數字,字符串,元組
數字例如:i=5
i=6
系統不會將5刪除,而是指向了6,若是沒有其它變量應用5,原有對象就會收回
全部賦值爲5的變量同時指向了內存中爲5的值的地址
30.求結果:
v = dict.fromkeys(['k1','k2'],[])
v["k1"].append(666)
print(v)
v["k1"] = 777
print(v)
輸出:{'k2': [666], 'k1': [666]}
{'k2': [666], 'k1': 777}
若是子層中是個列表,則須要注意,append(666)則k2與k1都會被修改
直接賦值則不會
31.求結果:
def num():
return [lambda x:x*i for i in range(4)]
# [lambda x:x*1, lambda x:x*2, lambda x:x*3, lambda x:x*4]
print([m(2) for m in num()])
輸出:[6, 6, 6, 6]
32.列舉常見的內置函數?
abs
sum
range
max([])
min([])
round(1)#浮點數
len()
.....
33.filter、map、reduce的做用?
list1 = filter(lambda n:n%2==1,range(1,20))
打印1-20之間的奇數
list1 = map(lambda n:n%2==1,range(1,20)) # 匹配函數
打印1-20之間的數據,若是是奇數,爲true,若是是偶數,爲false
py3中,reduce內置函數,須要引入模塊functools
from functools import reduce
reduce 是累加函數
reduce(lambda x,y:x+y,range(1,20))
34.一行代碼實現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)]))
35.如何安裝第三方模塊,用過哪些第三方模塊?
經過pycharm編譯器中的file->setting->project->Project interpreter能夠下載安裝
經過pip安裝
sqlarchmey,mysql,selecter.....
restframe_work
36.至少列舉8個經常使用的模塊
re、time、os、sys、json、paramiko、threading、process、Queue、socket、mysql,sqlachme
37.re的match和search區別?
match()是否以什麼開頭
search()匹配全部
38.什麼是正則的貪婪匹配?
str="abcdnsidnc"
re= "ab*c"
貪婪匹配結果:"abcdnsidnc"
非貪婪匹配結果:abc
39.求結果: a. [ i % 2 for i in range(10) ] b. ( i % 2 for i in range(10) )
a. [ i % 2 for i in range(10) ]
輸出:[0,1,0,1,0,1,0,1,0,1]
b. ( i % 2 for i in range(10) )
輸出:是個迭代器,輸出的是迭代器的地址,可使用for循環函數來打印
40.求結果: a. 1 or 2 b. 1 and 2 c. 1 < (2==2) d. 1 < 2 == 2
a.輸出:1
b.輸出:2
c.輸出:False
d.輸出:True
d.答案分析:
其餘語言if(a>4 and a<10)
python 4<a<10
推出===> 1<2 ==2 爲 1<2 and 2==2
===> True and True
===> True
41.def func(a,b=[]) 這種寫法有什麼坑?
def func(a,b=[]):
b.append(a)
print(b)
func(1)
func(1)
func(1)
func(1)
輸出:
[1]
[1, 1]
[1, 1, 1]
[1, 1, 1, 1]
每次實例化都會使用第一次建立的list表
42.如何實現 「1,2,3」 變成 [‘1’,’2’,’3’] ?
split(',')
43.如何實現[‘1’,’2’,’3’]變成[1,2,3] ?
[int(i) for i in s]
44.比較: a = [1,2,3] 和 b = [(1),(2),(3) ] 以及 b = [(1,),(2,),(3,) ] 的區別?
a 與 b = [(1,),(2,),(3,) ]的區別:
a是個數字列表,b是個元組列表
a 與 b = [(1),(2),(3) ] 的區別:
無區別
45.如何用一行代碼生成[1,4,9,16,25,36,49,64,81,100] ?
[x*x for x in range(1,11)]
46.一行代碼實現刪除列表中重複的值 ?
list(set([]))
#集合去重
47.若是在函數中設置一個全局變量
global
48.logging模塊的做用?以及應用場景?
不知道
49.請用代碼簡答實現stack
class Stack(object):
def __init__(self):
self.stack = []
def push(self, 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):
#取出目前stack中最新的元素
return self.stack[-1]
50.經常使用字符串格式化哪幾種?
1.最方便
print("hello %s and %s" %("df","another df"))
2.最好用
print("hello %fisrt and %second"%("first":"df","second":"another df"))
3.最早進
print("hello {first} and {second}".format(first="df",second="another df"))
51.簡述 生成器、迭代器、可迭代對象 以及應用場景?
可迭代對象:實現了迭代器協議的對象就是可迭代對象
可迭代對象能夠生成迭代器:經過iter()轉換成iterator
生成器生成式子:[x*x for x in range(10)]是個列表
把[]改爲()就能夠變成迭代器
52.用python實現一個二分查找
def binary_chop(alist, data):
"""
非遞歸解決二分查找
:param alist:
:return:
"""
n = len(alist)
first = 0
last = n - 1
while first <= last:
mid = (last + first) // 2
if alist[mid] > data:
last = mid - 1
elif alist[mid] < data:
first = mid + 1
else:
return True
return False
if __name__ == '__main__':
lis = [2,4, 5, 12, 14, 23]
if binary_chop(lis, 14):
print('ok')談談你對閉包的理解?
def binary_chop(alist, data):
"""
非遞歸解決二分查找
:param alist:
:return:
"""
n = len(alist)
first = 0
last = n - 1
while first <= last:
mid = (last + first) // 2
if alist[mid] > data:
last = mid - 1
elif alist[mid] < data:
first = mid + 1
else:
return True
return False
if __name__ == '__main__':
lis = [2,4, 5, 12, 14, 23]
if binary_chop(lis, 14):
print('ok')
53.談談你對閉包的理解
不懂
54.os和sys模塊的做用?
os主要處理操做系統相關操做
sys主要處理系統相關操做
55.如何生成一個隨機數
import random
random.rangrange(1,100)
56.如何使用python刪除一個文件?
if os.file.exist(path):
os.remove(path)
57.談談你對面向對象的理解?
面向對象有三大特性,封裝、繼承和多態。
58.Python面向對象中的繼承有什麼特色
Python老是首先查找對應類型的方法,若是它不能在派生類中找到對應的方法,它纔開始到基類中逐個查找。
在繼承中基類的構造(__init__()方法)不會被自動調用,它須要在其派生類的構造中親自專門調用。有別於C#
59.面向對象深度優先和廣度優先是什麼?
不懂
60.面向對象中super的做用
用於調用父類的方法,解決多重繼承問題。
61.是否使用過functools中的函數?其做用是什麼?
reduce
62.列舉面向對象中帶下劃線的特殊方法,如:__new__、__init__
__call__
__str__
__add__
__dic__
__getitem__
63.如何判斷是函數仍是方法?
方法須要經過對象來調用
64.靜態方法和類方法區別?
靜態方法不須要傳入self參數,類成員方法須要傳入表明本類的self參數
靜態方法是無妨訪問實例變量和類變量的,類成員方法沒法訪問實例變量可是能夠訪問類變量
65.列舉面向對象中的特殊成員以及應用場景?
__doc__描述信息類
__call__ 對象後面加括號,觸發執行
__dict__ 查看類或對象中的全部成員
__str__ 若是一個類中定義了__str__方法,那麼在打印對象時,默認輸出該方法的返回值
66.一、二、三、四、5 能組成多少個互不相同且無重複的三位數
不懂
67.什麼是反射?以及應用場景?
反射主要根據字符串去尋找類的屬性值
web框架
68.metaclass做用?以及應用場景?
不懂
69.用盡可能多的方法實現單例模式。
70.裝飾器的寫法以及應用場景。
71.異常處理寫法以及如何主動跑出異常(應用場景)
72.什麼是面向對象的mro
73.isinstance做用以及應用場景?
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,json序列化時,能夠處理的數據類型有哪些?如何定製支持datetime類型?
Because nums[0] + nums[1] = 2 + 7 = 9,
75.json序列化時,能夠處理的數據類型有哪些?如何定製支持datetime類型?
(dict、list、string、int、float、long、bool、None)
import json
from json import JSONEncoder
from datetime import datetime
class ComplexEncoder(JSONEncoder):
def default(self, obj):
if isinstance(obj, datetime):
return obj.strftime('%Y-%m-%d %H:%M:%S')
else:
return super(ComplexEncoder,self).default(obj)
d = { 'name':'alex','data':datetime.now()}
print(json.dumps(d,cls=ComplexEncoder))
# {"name": "alex", "data": "2018-05-18 19:52:05"}
76.json序列化時,默認遇到中文會轉換成unicode,若是想要保留中文怎麼辦?
import json
a=json.dumps({"ddf":"你好"},ensure_ascii=False)
print(a) #{"ddf": "你好"}
77.什麼是斷言?應用場景?
78.有用過with statement嗎?它的好處是什麼?
79.使用代碼實現查看列舉目錄下的全部文件。
80.簡述 yield和yield from關鍵字。
第二部分 網絡編程和併發(34題)
1.簡述osi七層協議
應用層->表示層->會話層->傳輸層->網絡層->數據鏈路層->物理層
2.什麼是C/S和B/S架構?
C/S 客戶端/服務端架構
B/S 瀏覽器/服務器架構
3.簡述 三次握手、四次揮手的流程。
三次握手
客戶端->發送創建連接請求->服務端
服務端->發送給確認請求->客戶端
客戶端->發送數據包->服務端,連接創建
4.什麼是arp協議?
ARP協議,全稱「Address Resolution Protocol」,中文名是地址解析協議,
使用ARP協議可實現經過IP地址得到對應主機的物理地址(MAC地址)。
5.TCP和UDP的區別
TCP是由連接的,UDP是無連接的。
TCP可靠的,要求資源數多
UDP實時的,要求資源數少
6.什麼是局域網和廣域網?
局域網:一個區域內,多臺計算機互聯組成的
廣域網:鏈接不一樣區域局域網或城域網計算機通訊的遠程網
7.爲什麼基於tcp協議的通訊比基於udp協議的通訊更可靠?
由於tcp是由鏈接的:三次握手雙向機制,http使用tcp協議傳輸的
8.什麼是socket?簡述基於tcp協議的套接字通訊流程。
socket:Socket是網絡上兩個程序雙向通信鏈接的端點。
通信流程:
1.服務器經過socket函數建立一個套接字,用這個套接字完成監聽活動。
2.服務器綁定一個ip和端口
3.服務器調用listen來監聽端口狀態,等待客戶端連接
4.客戶端經過socket函數建立一個套接字,並設定遠端ip和端口。
5.客戶端經過connect函數來鏈接遠端服務器
6.服務器經過accept函數來接收客戶端的鏈接通信。
7.客戶端能夠經過write函數和read來實現與服務端的數據收發。
8.服務器能夠經過write函數和read來實現與客戶端的數據收發。
9.通信結束,關閉socket,調用close函數。
9.什麼是粘包? socket 中形成粘包的緣由是什麼? 哪些狀況會發生粘包現象?
粘包:多個數據包被連續存儲於連續的緩存中
緣由:發送方,每每等待接收到必定的數據後纔會發送數據,若是連續幾回發送少許數據,
經過TCP會根據算法把數據合成一包發送,接收方就收到了粘包數據。
那些狀況:
客戶端或者服務端沒有設置,響應機制,致使數據粘包。
10.IO多路複用的做用?
單個線程或者進程就能夠同時處理多個網絡IO鏈接。
11.什麼是防火牆以及做用?
將內部網絡與公用網絡隔離的方法。
提升內部網絡安全,過濾不安全服務。
12.select、poll、epoll 模型的區別?
select:支持的文件描述符數量太少 => 1024
在fd數量多的時候,系統開銷較大
poll:與select,描述fd集合方式不一樣
eproll:是對select和poll的改進,在爲每一個fd指定一個回調函數,設備就緒時,
直接喚醒並將fd加入就緒表。
13.簡述 進程、線程、協程的區別 以及應用場景?
16.threading.local的做用?
threading.local()這個方法的特色用來保存一個全局變量,
可是這個全局變量只有在當前線程才能訪問。java