用于python面試整理来候,主要來源于http://www.cnblogs.com/skiler/p/6952707.html会前,很感謝博主分享称杨,歡迎指正交流。
Python面試200題(含爬蟲)
面試題(一)【15】
1砌烁、現(xiàn)有兩元祖? (('a'),('b'),('c'),('d') ) ,請使用Python中的匿名函數(shù)生成列表[ {'a':'c',{'c':'d'}]
答案:v = list(map(lambda x,y:{x:y},data[0:2],data[2:4]))
data = (('a'),('b'),('c'),('d') )
v = list(map(lambda x,y:{x:y},data[0:2],data[2:4]))
data[0:2] = ('a'),('b')
data[2:4] = ('c'),('d')
匿名函數(shù)傳進(jìn)去? 參數(shù)(x,y)? 返回{x:y}
map(func,iterable) #對于iterable依次傳遞給func筐喳,返回的是可迭代對象
2、看代碼 寫結(jié)果
def multipliters():
? ? return [lambda x:i * x for i in range(4)]
print([m(2) for m in multipliters()])
# 第一種是 將生成器對象生成的匿名函數(shù)轉(zhuǎn)化成列表 函喉,匿名函數(shù)使用的是相同的內(nèi)存空間避归。
# 轉(zhuǎn)換成列表后,循環(huán)結(jié)束管呵,命名空間里的i都為3
def multipliters():
? ? return [lambda x:i * x for i in range(4)]
print([m(2) for m in multipliters()])
# 以下是依次返回 生成器生成的每個(gè)匿名函數(shù)梳毙,每次調(diào)用i都在變化
def multipliters2():
? ? return (lambda x: i*x for i in range(4))
print([m(2) for m in multipliters2()])
3、1 or 2和1 and 2分別輸出什么捐下?
# 1? ? 2?
# 0 "" [] {} set() None False放入判斷表達(dá)式都為假
# or或? and與
# 整個(gè)式子 不斷去向右查看账锹,直到能確定為真就停下來
4、看代碼 寫結(jié)果
value = "B" and "A" or "C"?
print(value)
# A
# 整個(gè)式子 不斷去向右查看坷襟,直到能確定為真就停下來
5奸柬、看代碼寫結(jié)果
v1 = [i % 2 for i in range(10)]
v2 = (i % 2 for i in range(10))
print(v1,v2)
# v1 = [i % 2 for i in range(10)]為列表生成式
# v2 = (i % 2 for i in range(10))為 at 0x00E4F990>為生成式
6、看代碼婴程,寫結(jié)果
def extendList(val,li=[]):
? ? li.append(val)
? ? return li
list1 = extendList(10)
list2 = extendList(123,[])
list3 = extendList('a')
print(list1)
print(list2)
print(list3)
# [10, 'a']
# [123]
# [10, 'a']
# 參數(shù)變量在編譯會(huì)生成廓奕,而且只會(huì)生成一次,其內(nèi)存地址的指向不發(fā)生變化
# 所以會(huì)有默認(rèn)的 []
# 1排抬、3都會(huì)使用默認(rèn)的 編譯生成同一個(gè)[]
# 2新生成一個(gè)[]?
7懂从、下面代碼誰報(bào)錯(cuò)?
v1 = {}
v2 = {3:5}
v3 = {[11,23]:5}
v4 = {(11,23):5}
v3錯(cuò)誤蹲蒲,字典元素的鍵不能為可變對象
8番甩、輸出以下結(jié)果
for i in range(5,0,1):
? ? print(i)
# range(起始元素,結(jié)束元素(不包含),每次的變化)
# 5 每次加1,啥時(shí)候能加到0届搁,O(∩_∩)O哈哈~
9缘薛、請說出range和xrange的區(qū)別
# from collections import Iterable,Iterator
# Iterable可迭代對象
# Iterator迭代器?
# print(isinstance(xrange(10),Iterator))
# print(isinstance(xrange(10),Iterable))
# python2中range(start, stop[, step])和range(stop)會(huì)生成-> range object,,返回是列表,是可迭代對象卡睦,全部放在內(nèi)存里
# python2中xrange(start, stop[, step])和range(stop)會(huì)生成-> xrange object宴胧,返回是可迭代對象,每次調(diào)用時(shí)才會(huì)生成
# python3 沒有xrange表锻,只有range恕齐,也是可迭代對象,每次調(diào)用時(shí)才會(huì)生成
10瞬逊、請將"1,2,3"显歧,變成["1","2","3"]
"1,2,3".split(',')
11仪或、一行代碼生成[1,4,9,16,25,36,49,64,81,100]
[i*i for i in range(11)]
12、一行生成9 * 9乘法表
[ x? ? ? ? ? ? ? ? ? ? ? ? ? ? ? for x in range(1,10)]
[ x*y for y in range(1,x+1)]
[ ([ x*y for y in range(1,x+1)]) for x in range(1,10)]
[ ([ '{}*{} = {}'.format(x,y,x*y) for y in range(1,x+1)]) for x in range(1,10)]
'\n'.join([ str(x) for x in range(1,10)])
print('\n'.join([ ' '.join( [ '{}*{} = {}'.format(x,y,x*y) for y in range(1,x+1)] ) for x in range(1,10)]) )
13士骤、map(str,[1,2,3,4,5,6,7,8,9])輸出什么范删?Python2和Python3輸出的結(jié)果一樣嗎?
print(isinstance(map(str,[1,2,3,4,5,6,7,8,9]),Iterable))
print(isinstance(map(str,[1,2,3,4,5,6,7,8,9]),Iterator))
# python 3 是Iterator
# python 2 ['1', '2', '3', '4', '5', '6', '7', '8', '9'] ,是可迭代對象拷肌,但不是Iterator
14壶冒、Django如何在Model保存前做一定的固定操作蘸拔,比如寫一條日志
利用Django的Model的Signal Dispatcher,通過django.db.models.signals.pre_save()方法强缘,在事件發(fā)生前散庶,發(fā)射觸發(fā)信號(hào),這一切都被調(diào)度中的receiver方法深藏功與名的保存了带猴。
信號(hào)的處理一般都寫在Model中昔汉,舉個(gè)例子:
import logging
from django.db import models
from django.db.models.signals import pre_save
from django.dispatch import receiver
class Order(models.Model):
? ? # ...
logger = logging.getLogger(__name__)
@receiver(pre_save, sender=Order)
def pre_save_handler(sender, **kwargs):
? ? #我們可以在Order這個(gè)Model保存之前盡情調(diào)戲了:)
? ? logger.debug("{},{}".format(sender, **kwargs))
參考:http://python.jobbole.com/81871/
15、1,2,3,4,5能組成多少個(gè)互不相同的無重復(fù)的三位數(shù)
5 * 4 * 3
建造者模式 【1】
一拴清、內(nèi)容
將一個(gè)復(fù)雜對象的構(gòu)建與它的表示分離靶病,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。建造者模式與抽象工廠模式相似口予,也用來創(chuàng)建復(fù)雜對象娄周。主要區(qū)別是建造者模式著重一步步構(gòu)造一個(gè)復(fù)雜對象,而抽象工廠模式著重于多個(gè)系列的產(chǎn)品對象沪停。
二煤辨、角色
抽象建造者(Builder)
具體建造者(Concrete Builder)
指揮者(Director)
產(chǎn)品(Product)
三、優(yōu)點(diǎn)
隱藏了一個(gè)產(chǎn)品的內(nèi)部結(jié)構(gòu)和裝配過程
將構(gòu)造代碼與表示代碼分開
可以對構(gòu)造過程進(jìn)行更精細(xì)的控制
四木张、適用場景
當(dāng)創(chuàng)建復(fù)雜對象的算法(Director)應(yīng)該獨(dú)立于該對象的組成部分以及它們的裝配方式(Builder)時(shí)
當(dāng)構(gòu)造過程允許被構(gòu)造的對象有不同的表示時(shí)(不同Builder)众辨。
五、實(shí)例
# coding : utf-8
# create by ztypl on 2017/5/25
from abc import abstractmethod, ABCMeta
#------產(chǎn)品------
class Player:
? ? def __init__(self, face=None, body=None, arm=None, leg=None):
? ? ? ? self.face = face
? ? ? ? self.arm = arm
? ? ? ? self.leg = leg
? ? ? ? self.body = body
? ? def __str__(self):
? ? ? ? return "%s, %s, %s, %s" % (self.face, self.arm, self.body, self.leg)
#------建造者------
class PlayerBuilder(metaclass=ABCMeta):
? ? @abstractmethod
? ? def build_face(self):
? ? ? ? pass
? ? @abstractmethod
? ? def build_arm(self):
? ? ? ? pass
? ? @abstractmethod
? ? def build_leg(self):
? ? ? ? pass
? ? @abstractmethod
? ? def build_body(self):
? ? ? ? pass
? ? @abstractmethod
? ? def get_player(self):
? ? ? ? pass
class BeautifulWomanBuilder(PlayerBuilder):
? ? def __init__(self):
? ? ? ? self.player = Player()
? ? def build_face(self):
? ? ? ? self.player.face = "漂亮臉蛋"
? ? def build_arm(self):
? ? ? ? self.player.arm="細(xì)胳膊"
? ? def build_body(self):
? ? ? ? self.player.body="細(xì)腰"
? ? def build_leg(self):
? ? ? ? self.player.leg="長腿"
? ? def get_player(self):
? ? ? ? return self.player
class PlayerDirector:
? ? def build_player(self, builder):
? ? ? ? builder.build_body()
? ? ? ? builder.build_arm()
? ? ? ? builder.build_leg()
? ? ? ? builder.build_face()
? ? ? ? return builder.get_player()
director = PlayerDirector()
builder = BeautifulWomanBuilder()
p = director.build_player(builder)
print(p)
六舷礼、UML圖
面試題(二)【12】
1鹃彻、什么是lambda函數(shù)?它有什么好處妻献?另外python在函數(shù)編程方面提供了些什么函數(shù)和語法蛛株?
lambda是Python中的匿名函數(shù)。它語法簡單育拨,簡化代碼谨履,不會(huì)產(chǎn)生命名沖突,污染命名空間熬丧。Python提供了map笋粟,reduce,filter等函數(shù)方法,提供了裝飾器矗钟,閉包等語法
2唆香、詳細(xì)說說tuple、list吨艇、dict的用法,它們的特點(diǎn)腾啥;
tuple 元祖东涡,固定長度不可變的順序容器,訪問效率高倘待,是和存儲(chǔ)一些常量數(shù)據(jù)疮跑,可以作為字典的鍵使用
list 列表,是長度可變有序的數(shù)據(jù)存儲(chǔ)容器凸舵,祖娘。可以通過下標(biāo)索引取到相應(yīng)的數(shù)據(jù)
dict 字典啊奄,長度可變的hash字典容器渐苏。存儲(chǔ)的方式為鍵值對,可以通過相應(yīng)的鍵獲取相應(yīng)的值菇夸,key支持多種類型
3琼富、說說python中裝飾器、迭代器的用法庄新;描述下dict的items()方法與iteritems()方法的不同鞠眉;
裝飾器是指對函數(shù)執(zhí)行過程,做一些擴(kuò)展择诈,甚至可以更改本身函數(shù)的執(zhí)行
迭代器是指遵循迭代器協(xié)議的對象械蹋,這類對象在被for循環(huán)時(shí),每次迭代生成下一個(gè)項(xiàng)羞芍,不用一開始就生成整個(gè)列表
在python3中不存在iteritems哗戈,items方法返回可迭代對象
在python2中items()返回[(key,value)]的列表對象,iteritems()返回迭代器對象涩金,iteritems()循環(huán)時(shí)不可以增刪dict的內(nèi)容
4谱醇、講講對unicode, gbk, utf-8等的理解,python2.x是如何處理編碼問題步做?
unicode編碼:為了解決各個(gè)國家的語言的存儲(chǔ)副渴,引進(jìn)的unicode碼,包括UCS2,UCS4,UTF-8,UTF-7等
gbk:和unicode不一樣的編碼方式全度,常用的為gbk-2312
utf-8: UTF-8 使用 1-4 個(gè)字節(jié)來存儲(chǔ)單個(gè)字符煮剧,應(yīng)該是目前最流行的字符集。Linux 默認(rèn)字符集就是UTF-8。既解決了大多數(shù)語言的編碼方式勉盅,又避免了簡單字符存儲(chǔ)對空間的浪費(fèi)
python 2.x需要在文件上方聲明文件的編碼方式# -*- coding: utf8 -*-佑颇,可以通過str.decode/str.encode處理字符串的文本編碼
保證 python 編輯器的編碼正確,或使用 u’中文’保證被轉(zhuǎn)換成 unicode 編碼草娜,推薦使用
sys.setdefaultencoding('utf-8')來保證我們的編碼
5挑胸、Python 是如何進(jìn)行內(nèi)存管理的?python 的程序會(huì)內(nèi)存泄露嗎宰闰?說說有沒有什么方面防止或檢測內(nèi)存泄露茬贵?
Python GC主要使用 引用計(jì)數(shù) 來跟蹤和回收垃圾。在引用計(jì)數(shù)的基礎(chǔ)上移袍,通過“標(biāo)記-清除”解決容器對象可能產(chǎn)生的循環(huán)引用問題解藻。通過分代
以空間換時(shí)間的方法提高垃圾回收效率
1、引用計(jì)數(shù): 每個(gè)對象中都有ob-refcnt來做引用計(jì)數(shù)葡盗。當(dāng)一個(gè)對象...,ob-refcnt就會(huì)增加螟左,當(dāng)引用的對象刪除,那么ob-refcnt就會(huì)減少當(dāng)ob-refcnt為零觅够,就會(huì)釋放該對象的內(nèi)存空間
2胶背、標(biāo)記清除: 解決循環(huán)引用的問題。先按需分配蔚约,等到?jīng)]有空閑內(nèi)存的時(shí)候奄妨,從寄存器和程序棧上的引用出發(fā),遍歷所有對象和引用把所有能訪問的打標(biāo)記苹祟,最后將沒有標(biāo)記的對象釋放掉
3砸抛、分代技術(shù): 提高效率,提高垃圾回收的效率树枫,按照存活時(shí)間直焙,分成不同的集合。將內(nèi)存塊按照其存活時(shí)間劃分為不同的集合砂轻。每個(gè)集合就稱為一個(gè)“代”奔誓,垃圾回收的頻率隨代的存活時(shí)間增大而減小。搔涝。Python默認(rèn)定義分代對象集合厨喂,引用數(shù)越大,對象的存活時(shí)間越長
Python也會(huì)內(nèi)存泄露庄呈,Python本身的垃圾回收機(jī)制無法回收重寫了__del__的循環(huán)引用的對象
程序員管理好每個(gè)python對象的引用蜕煌,盡量在不需要使用對象的時(shí)候,斷開所有引用
盡量少通過循環(huán)引用組織數(shù)據(jù)诬留,可以改用weakref做弱引用或者用id之類的句柄訪問對象
通過gc模塊的接口可以檢查出每次垃圾回收有哪些對象不能自動(dòng)處理斜纪,再逐個(gè)逐個(gè)處理
6贫母、關(guān)于 python 程序的運(yùn)行性能方面,有什么手段能提升性能盒刚?
1腺劣、使用多進(jìn)程,充分利用機(jī)器的多核性能
2因块、對于性能影響較大的部分代碼橘原,可以使用C或C++編寫
3、對于IO阻塞造成的性能影響涡上,可以使用IO多路復(fù)用來解決
4靠柑、盡量使用python的內(nèi)建函數(shù)
5、盡量使用局部變量
7吓懈、list對象alist [{'name':'a','age':20},{'name':'b','age':30},{'name':'c','age':25}],請按alist中元素的age由大到小排序靡狞;
def sort_by_age(list1):
? ? return sorted(alist,key=lambda x:x['age'],reverse=True)
8耻警、兩個(gè)list對象alist ['a','b','c','d','e','f'], blist ['x','y','z','d','e','f'],請用簡潔的方法合并這兩個(gè)list甸怕,并且list里面的元素不能重復(fù)甘穿;
alist = ['a','b','c','d','e','f']
blist = ['x','y','z','d','e','f']
def merge_list(*args):
? ? s = set()
? ? for i in args:
? ? ? ? s = s.union(i)
? ? return list(s)
9、打亂一個(gè)排好序的list對象alist梢杭;
import random
random.shuffle(alist)
10温兼、簡單實(shí)現(xiàn)一個(gè)stack
class Stack:
? ? def __init__(self):
? ? ? ? self.items = []
? ? def __iter__(self):
? ? ? ? return self.items.__iter__()
? ? def pop(self):
? ? ? ? return self.items.pop()
? ? def top(self):
? ? ? ? if len(self.items) > 0:
? ? ? ? ? ? return self.items[len(self.items) - 1]
? ? def push(self, item):
? ? ? ? self.items.append(item)
? ? def empty(self):
? ? ? ? self.items = []
? ? def size(self):
? ? ? ? return len(self.items)
11、輸入某年某月某日武契,判斷這一天是這一年的第幾天募判?(可以用 python 標(biāo)準(zhǔn)庫)
import datetime
def dayofyear():
? ? year = input("請輸入年份:")
? ? month = input("請輸入月份:")
? ? day = input("請輸入天:")
? ? date1 = datetime.date(year=int(year),month=int(month),day=int(day))
? ? date2 = datetime.date(year=int(year),month=1,day=1)
? ? return (date1 -date2).days
12、將字符串:"k:1|k1:2|k2:3|k3:4"咒唆,處理成python字典:{k:1, k1:2, ... }
str1 = "k:1|k1:2|k2:3|k3:4"
def str2dict(str1):
? ? dict1 = {}
? ? for iterms in str1.split('|'):
? ? ? ? key,value = iterms.split(':')
? ? ? ? dict1[key] = value
? ? return dict1
面試題(三)【1】
請完成一個(gè)程序届垫,并能按步驟實(shí)現(xiàn)以下功能:
1.下載https://en.wikipedia.org/wiki/Machine_translation頁面的內(nèi)容并保存為mt.html
?????? 需要編寫代碼來下載頁面。
2.統(tǒng)計(jì)mt.html中
標(biāo)簽內(nèi)下所有單詞以及數(shù)目并存儲(chǔ)到mt_word.txt中全释。
mt_word.txt有如下幾點(diǎn)要求:
?????? a) 每個(gè)單詞一行装处。單詞在前,單詞出現(xiàn)的次數(shù)在后浸船,中間用Tab(\t)進(jìn)行分隔妄迁。
?????? b) 單詞要按照單詞數(shù)目從多到少的順序進(jìn)行排列。比如說單詞a出現(xiàn)了100次李命,單詞b出現(xiàn)了10次登淘,則單詞a要在單詞b的前面。
3. 提取出mt.html中所有的年份信息(比如說頁面中的1629, 1951這些的四位數(shù)字就是年份)存儲(chǔ)到mt_year.txt中项戴。
mt_year.txt有如下幾點(diǎn)要求:
a)每個(gè)年份是一行形帮。
?????? a) 年份需要從過去到現(xiàn)在的順序進(jìn)行排列槽惫。比如說文章中出現(xiàn)了2007和1997,則1997需要排在2007的前面辩撑。
要求:
1. 僅限python編程界斜,而且僅僅可以使用python自帶的函數(shù)或庫。
2.提交可執(zhí)行的程序以及mt.html, mt_word.txt, mt_year.txt合冀。
3. 限定在一個(gè)小時(shí)內(nèi)完成各薇。
# 1.下載https://en.wikipedia.org/wiki/Machine_translation頁面的內(nèi)容并保存為mt.html需要編寫代碼來下載頁面。
session = requests.session()
response = session.get(url="https://en.wikipedia.org/wiki/Machine_translation")
with open('mt.html','wb') as f:
? ? f.write(response.content)
# 2君躺、統(tǒng)計(jì)mt.html中
標(biāo)簽內(nèi)下所有單詞以及數(shù)目并存儲(chǔ)到mt_word.txt中
# 解析頁面峭判,拿到所有的p標(biāo)簽中的文本
soup = BeautifulSoup(response.text,features="lxml")
tag2 = soup.find_all(name='p')
list_p = []
for i in tag2:
? ? list_p.append(i.get_text())
# 將所有的文本合并成一個(gè)字符串
str_p = ' '.join(list_p)
word_set = set()
for word in str_p.split():
? ? word = word.strip(',.()""/; ')
? ? word_set.add(word)
# word_dict = {}
word_list = []
for word in word_set:
? ? if word == '':
? ? ? ? continue
? ? # word_dict[word] = str_p.count(word)
? ? dict2 = {word:str_p.count(word)}
? ? word_list.append(dict2)
# 將單詞按照數(shù)目反序排列,然后寫入文件
blist = sorted(word_list,key = lambda x:list(x.values())[0],reverse =True)
with open('mt_word.txt','w') as f:
? ? for item in blist:
? ? ? ? for k,v in item.items():
? ? ? ? ? ? line = k + '\t' + str(v) + '\n'
? ? ? ? ? ? f.write(line)
# 3棕叫、提取出mt.html中所有的年份信息(比如說頁面中的1629, 1951這些的四位數(shù)字就是年份)存儲(chǔ)到mt_year.txt中
year = re.compile(r'\d{4}')
years_list = re.findall(year,response.text)
years_list = sorted(list(set(years_list)))
with open('mt_year.txt','w') as f:
? ? for year in years_list:
? ? ? ? line = year + '\n'
? ? ? ? f.write(line)
答案
面試題(四)爬蟲【16】
一林螃、試列出至少三種目前流行的大型數(shù)據(jù)庫的名稱:________、_________俺泣、__________,其中您最熟悉的是__________,從__________年開始使用疗认。
Oracle,Mysql伏钠,SQLServer? Oracle根據(jù)自己情況
二横漏、有表List,并有字段A熟掂、B缎浇、C,類型都是整數(shù)赴肚。表中有如下幾條記錄:
ABC
279
564
3119
現(xiàn)在對該表一次完成以下操作:
查詢出B和C列的值素跺,要求按B列升序排列
寫出一條新的記錄,值為{7,9,8}
查詢C列尊蚁,要求消除重復(fù)的值亡笑,按降序排列
寫出完成完成以上操作的標(biāo)準(zhǔn)的SQL語句,并且寫出操作3的結(jié)果横朋。
create table List2(A int ,B int,C int)
select B,C from List order by B
insert into List values(7,9,8)
select distinct(C) from List order by 1 desc;
9 8 4
三仑乌、請簡要說明視圖的作用
1. 數(shù)據(jù)庫視圖隱藏了數(shù)據(jù)的復(fù)雜性。
2. 數(shù)據(jù)庫視圖有利于控制用戶對表中某些列的訪問琴锭。
3. 數(shù)據(jù)庫視圖使用戶查詢變得簡單晰甚。
四、列舉您使用過的python網(wǎng)絡(luò)爬蟲所用到的網(wǎng)絡(luò)數(shù)據(jù)包(最熟悉的在前):
requests决帖、urllib厕九、urllib2、httplib2
五地回、列舉您使用過的python網(wǎng)絡(luò)爬蟲所用到的解析數(shù)據(jù)包(最熟悉的在前):
BeautifulSoup扁远、pyquery俊鱼、Xpath、lxml
六畅买、列舉您使用過的python中的編碼方式(最熟悉的在前):
UTF-8并闲,ASCII,gbk
七谷羞、python3.5語言中enumerate的意思是_______________________
對于一個(gè)可迭代的(iterable)/可遍歷的對象(如列表帝火、字符串),enumerate將其組成一個(gè)索引序列湃缎,利用它可以同時(shí)獲得索引和值
enumerate多用于在for循環(huán)中得到計(jì)數(shù)
八犀填、99的八進(jìn)制表示是_______________________
143
九、請舉出三種常用的排序算法
冒泡嗓违、選擇九巡、快速
十、列出比較熟悉的爬蟲框架
Scrapy
十一蹂季、用4比庄、9、2乏盐、7四個(gè)數(shù)字,可以使用+制恍、-父能、*和/,每個(gè)數(shù)字使用一次净神,使表達(dá)式的結(jié)果為24何吝,表達(dá)式是_____________________________
(9+7-4)*2
十二、???? 對你最有影響的或是您認(rèn)為最有價(jià)值的軟件方面的幾本書是鹃唯?
十三爱榕、您最熟悉的Unix環(huán)境是_____________.Unix下查詢環(huán)境變量的命令是________,查詢腳本定時(shí)任務(wù)的命令是____________________
1 AIX,env? crontab
十四坡慌、???? 寫出在網(wǎng)絡(luò)爬蟲爬取數(shù)據(jù)的過程中黔酥,遇到的防爬蟲問題的解決方案
?通過headers反爬蟲:解決策略,偽造headers
?基于用戶行為反爬蟲:動(dòng)態(tài)變化去爬取數(shù)據(jù)洪橘,模擬普通用戶的行為
?基于動(dòng)態(tài)頁面的反爬蟲:跟蹤服務(wù)器發(fā)送的ajax請求跪者,模擬ajax請求
十五、閱讀以下Python程序
for i in range(5,0,-1):
????? print(i)
請?jiān)谙旅鎸懗龃蛴〗Y(jié)果
5 4 3 2 1
十六熄求、在某系統(tǒng)中一個(gè)整數(shù)占用兩個(gè)八位字節(jié)渣玲,使用Python按下面的要求編寫完整程序。
接收從標(biāo)準(zhǔn)輸入中依次輸入的五個(gè)數(shù)字弟晚,將其組合成為一個(gè)整數(shù)忘衍,放入全局變量n中逾苫,隨后在標(biāo)準(zhǔn)輸出輸出這個(gè)整數(shù)。(ord(char)獲取字符ASCII值的函數(shù))
面試題(五)爬蟲 【14】
1枚钓、post铅搓、get有什么區(qū)別?
1. 根據(jù)HTTP規(guī)范秘噪,GET一般用于獲取/查詢資源信息狸吞,應(yīng)該是安全的和冪等。而POST一般用于更新資源信息
2. get是在url中傳遞數(shù)據(jù)指煎,數(shù)據(jù)放在請求頭中蹋偏。 post是在請求體中傳遞數(shù)據(jù)
3. get傳送的數(shù)據(jù)量較小,只能在請求頭上發(fā)送數(shù)據(jù)至壤。post傳送的數(shù)據(jù)量較大威始,一般被默認(rèn)為不受限制。
5. get安全性非常低像街,post安全性較高黎棠。但是執(zhí)行效率卻比Post方法好。
建議:
1镰绎、get方式的安全性較Post方式要差些脓斩,包含機(jī)密信息的話,建議用Post數(shù)據(jù)提交方式畴栖;
2随静、在做數(shù)據(jù)查詢時(shí),建議用Get方式吗讶;而在做數(shù)據(jù)添加燎猛、修改或刪除時(shí),建議用Post方式照皆;
2重绷、http、https協(xié)議有什么區(qū)別膜毁?
http協(xié)議是超文本傳輸協(xié)議昭卓,被用于在web瀏覽器和網(wǎng)站服務(wù)器之間傳遞信息。http協(xié)議工作是以明文方式發(fā)送內(nèi)容瘟滨,不提供任何形式的數(shù)據(jù)加密葬凳,而這也是很容易被黑客利用的地方,如果黑客截取了web瀏覽器和網(wǎng)站服務(wù)器之間的傳輸信息室奏,就可以直接讀懂其中的信息火焰,因此http協(xié)議不適合傳輸一些重要的、敏感的信息胧沫,比如信用卡密碼及支付驗(yàn)證碼等昌简。
安全套接字層https協(xié)議就是為了解決http協(xié)議的這一安全缺陷而出生的占业,為了數(shù)據(jù)傳輸?shù)陌踩琱ttps在http的基礎(chǔ)上加入了ssl協(xié)議纯赎,ssl依靠證書來驗(yàn)證服務(wù)器的身份谦疾,為瀏覽器和服務(wù)器之間的通信加密,這樣的話即使黑客借去了發(fā)送過程中的信息犬金,也無法破解讀懂它念恍,我們網(wǎng)站及用戶的信息便得到了最大的安全保障。
https協(xié)議需要到ca申請證書晚顷,一般免費(fèi)證書很少峰伙,需要費(fèi)用。
http是超文本傳輸協(xié)議该默,信息是明文傳輸瞳氓,https 則是具有安全性的ssl加密傳輸協(xié)議
http和https使用的是完全不同的連接方式用的端口也不一樣,前者是80,后者是443。
http的連接很簡單,是無狀態(tài)的栓袖, HTTPS協(xié)議是由SSL+HTTP協(xié)議構(gòu)建的可進(jìn)行加密傳輸匣摘、身份認(rèn)證的網(wǎng)絡(luò)協(xié)議 要比http協(xié)議安全
3、 域名和IP之間有什么關(guān)系裹刮,如何查看某個(gè)域名對應(yīng)的所有IP音榜?
國際互聯(lián)網(wǎng)(Internet)上有成千百萬臺(tái)主機(jī)(host),為了區(qū)分這些主機(jī)捧弃,人們給每臺(tái)主機(jī)都分配了一個(gè)專門的“地址”作為標(biāo)識(shí)囊咏,稱為IP地址
由于IP地址全是些的數(shù)字,為了便于用戶記憶塔橡,Internet上引進(jìn)了域名服務(wù)系統(tǒng)DNS(Domain Name System)。
當(dāng)您鍵入某個(gè)域名的時(shí)候霜第,這個(gè)信息首先到達(dá)提供此域名解析的服務(wù)器上葛家,再將此域名解析為相應(yīng)網(wǎng)站的IP地址。完成這一任務(wù)的過程就稱為域名解析泌类。
1.ping? 2.nslookup 3.使用站長工具等
4癞谒、http協(xié)議頭中,keep-alive字段有什么作用刃榨?
HTTP協(xié)議采用“請求-應(yīng)答”模式弹砚,當(dāng)使用普通模式,即非KeepAlive模式時(shí)枢希,每個(gè)請求/應(yīng)答客戶和服務(wù)器都要新建一個(gè)連接桌吃,完成 之后立即斷開連接(HTTP協(xié)議為無連接的協(xié)議);
當(dāng)使用Keep-Alive模式(又稱持久連接苞轿、連接重用)時(shí)茅诱,Keep-Alive功能使客戶端到服 務(wù)器端的連接持續(xù)有效逗物,當(dāng)出現(xiàn)對服務(wù)器的后繼請求時(shí),Keep-Alive功能避免了建立或者重新建立連接瑟俭。
通過使用keep-alive機(jī)制翎卓,可以減少tcp連接建立次數(shù),也意味著可以減少TIME_WAIT狀態(tài)連接摆寄,以此提高性能和提高h(yuǎn)ttpd服務(wù)器的吞吐率(更少的tcp連接意味著更少的系統(tǒng)內(nèi)核調(diào)用,socket的accept()和close()調(diào)用)失暴。
5、robots協(xié)議是什么微饥?
Robots協(xié)議(也稱為爬蟲協(xié)議逗扒、爬蟲規(guī)則、機(jī)器人協(xié)議等)也就是robots.txt畜号,網(wǎng)站通過robots協(xié)議告訴搜索引擎哪些頁面可以抓取缴阎,哪些頁面不能抓取。
Robots協(xié)議是網(wǎng)站國際互聯(lián)網(wǎng)界通行的道德規(guī)范简软,其目的是保護(hù)網(wǎng)站數(shù)據(jù)和敏感信息蛮拔、確保用戶個(gè)人信息和隱私不被侵犯。因其不是命令痹升,故需要搜索引擎自覺遵守建炫。
6、 列出幾種常見的關(guān)系型數(shù)據(jù)庫和非關(guān)系型數(shù)據(jù)庫疼蛾?(每種至少兩個(gè))
Oracle肛跌、Mysql、SQLServer察郁、DB2? ? ? ? ? Redis MongoDB Cassandra
7衍慎、 內(nèi)存泄露是什么?如何避免皮钠?
指由于疏忽或錯(cuò)誤造成程序未能釋放已經(jīng)不再使用的內(nèi)存的情況稳捆。
內(nèi)存泄漏并非指內(nèi)存在物理上的消失,而是應(yīng)用程序分配某段內(nèi)存后麦轰,由于設(shè)計(jì)錯(cuò)誤乔夯,失去了對該段內(nèi)存的控制,因而造成了內(nèi)存的浪費(fèi)款侵。
導(dǎo)致程序運(yùn)行速度減慢甚至系統(tǒng)崩潰等嚴(yán)重后果末荐。
有 __del__() 函數(shù)的對象間的循環(huán)引用是導(dǎo)致內(nèi)存泄漏的主兇。
不使用一個(gè)對象時(shí)使用:del object 來刪除一個(gè)對象的引用計(jì)數(shù)就可以有效防止內(nèi)存泄漏問題.
通過 Python 擴(kuò)展模塊 gc 來查看不能回收的對象的詳細(xì)信息
可以通過 sys.getrefcount(obj) 來獲取對象的引用計(jì)數(shù)新锈,并根據(jù)返回值是否為 0 來判斷是否內(nèi)存泄漏
Python的內(nèi)存管理機(jī)制
1.引用計(jì)數(shù):通過引用計(jì)數(shù)來保持對內(nèi)存中的變量跟蹤甲脏,Python內(nèi)部記錄中所有在使用對象各有多少個(gè)引用。
Python中有個(gè)內(nèi)部跟蹤變量叫做引用計(jì)數(shù)器,每個(gè)變量有多少個(gè)引用剃幌,簡稱引用計(jì)數(shù)聋涨。當(dāng)對象被創(chuàng)建時(shí)就創(chuàng)建了一個(gè)引用計(jì)數(shù)。
當(dāng)某個(gè)對象的引用計(jì)數(shù)為0時(shí)负乡,對象就不在需要牍白,就列入了垃圾回收隊(duì)列。
引用計(jì)數(shù)增加:1.對象被創(chuàng)建:x=4;2.另外的別人被創(chuàng)建:y=x;3.被作為參數(shù)傳遞給函數(shù):foo(x);4.作為容器對象的一個(gè)元素:a=[1,x,'33'];
引用計(jì)數(shù)減少時(shí):1.一個(gè)本地引用離開了它的作用域抖棘。比如上面的foo(x)函數(shù)結(jié)束時(shí)茂腥,x指向的對象引用減1;
? ? ? ? ? ? ? ? 2.對象的別名被顯式的銷毀:del x;或者del y;
? ? ? ? ? ? ? ? 3.對象的一個(gè)別名被賦值給其他對象:x=789
? ? ? ? ? ? ? ? 4.對象從一個(gè)窗口對象中移除:myList.remove(x)
? ? ? ? ? ? ? ? 5.窗口對象本身被銷毀:del myList,或者窗口對象本身離開了作用域。
2.垃圾回收
1.引用計(jì)數(shù): 每個(gè)對象中都有ob-refcnt來做引用計(jì)數(shù)悯周。當(dāng)一個(gè)對象...,ob-refcnt就會(huì)增加沐兰,當(dāng)引用的對象刪除炕贵,那么ob-refcnt就會(huì)減少當(dāng)ob-refcnt為零,就會(huì)釋放該對象的內(nèi)存空間
2.標(biāo)記清除: 解決循環(huán)引用的問題。先按需分配,等到?jīng)]有空閑內(nèi)存的時(shí)候驯用,從寄存器和程序棧上的引用出發(fā),遍歷所有對象和引用把所有能訪問的打標(biāo)記儒老,最后將沒有標(biāo)記的對象釋放掉
3.分代技術(shù): 提高效率蝴乔,提高垃圾回收的效率,按照存活時(shí)間驮樊,分成不同的集合薇正。將內(nèi)存塊按照其存活時(shí)間劃分為不同的集合。每個(gè)集合就稱為一個(gè)“代”囚衔,垃圾回收的頻率隨代的存活時(shí)間增大而減小挖腰。。Python默認(rèn)定義分代對象集合练湿,引用數(shù)越大猴仑,對象的存活時(shí)間越長
3.內(nèi)存池機(jī)制
在Python中,大多數(shù)申請的都是小塊的內(nèi)存鞠鲜,會(huì)執(zhí)行大量的malloc和free操作。Python引入了一個(gè)內(nèi)存池機(jī)制断国,用于管理對小塊內(nèi)存的申請和釋放贤姆,即Pymalloc機(jī)制。
它將不用的內(nèi)存放到內(nèi)存池而不是返回給操作系統(tǒng)稳衬。
1. 當(dāng)申請的內(nèi)存小于256字節(jié)時(shí)霞捡,PyObject_Malloc會(huì)在內(nèi)存池中申請內(nèi)存;當(dāng)申請的內(nèi)存大于256字節(jié)時(shí)薄疚,PyObject_Malloc的行為將蛻化為malloc的行為碧信。當(dāng)然赊琳,通過修改Python源代碼,我們可以改變這個(gè)默認(rèn)值砰碴,從而改變Python的默認(rèn)內(nèi)存管理行為躏筏。
2. 對于Python對象,如整數(shù)呈枉,浮點(diǎn)數(shù)和List趁尼,都有其獨(dú)立的私有內(nèi)存池,對象間不共享他們的內(nèi)存池猖辫。也就是說如果你分配又釋放了大量的整數(shù)酥泞,用于緩存這些整數(shù)的內(nèi)存就不能再分配給浮點(diǎn)數(shù)。
8啃憎、 列舉幾個(gè)常用的dom解析項(xiàng)目芝囤、插件
xml、libxml2辛萍、lxml悯姊、xpath
9、 常見的反爬蟲機(jī)制有哪些叹阔?
通過headers反爬蟲:解決策略挠轴,偽造headers
基于用戶行為反爬蟲:動(dòng)態(tài)變化去爬取數(shù)據(jù),模擬普通用戶的行為
基于動(dòng)態(tài)頁面的反爬蟲:跟蹤服務(wù)器發(fā)送的ajax請求耳幢,模擬ajax請求
10岸晦、如何提高爬取效率?
1. 爬取方面睛藻,利用異步io启上。
2.處理方面,利用消息隊(duì)列做生產(chǎn)者消費(fèi)者模型
11店印、樓梯問題
1.1冈在、給一個(gè)樓梯,從最下面往上走按摘,每次可以走1到n步包券,求總共有多少種走法?
1.2炫贤、給一個(gè)樓梯溅固,從最下面往上走,每次可以走1步或2步兰珍,求總共有多少種走法侍郭?
1.3、給一個(gè)樓梯,從最下面往上走亮元,每次可以走1步或2步或3步猛计,求總共有多少種走法?
# 1爆捞、 給一個(gè)樓梯奉瘤,從最下面往上走,每次可以走1或2步嵌削,求總共有多少種走法毛好?
# 假設(shè)只有一個(gè)臺(tái)階,那么只有一種跳法苛秕,那就是一次跳一級(jí)肌访,f(1)=1;如果有兩個(gè)臺(tái)階艇劫,那么有兩種跳法吼驶,第一種跳法是一次跳一級(jí),第二種跳法是一次跳兩級(jí),f(2)=2店煞。
# 如果有大于2級(jí)的n級(jí)臺(tái)階蟹演,那么假如第一次跳一級(jí)臺(tái)階,剩下還有n-1級(jí)臺(tái)階顷蟀,有f(n-1)種跳法酒请,假如第一次條2級(jí)臺(tái)階,剩下n-2級(jí)臺(tái)階鸣个,有f(n-2)種跳法羞反。這就表示f(n)=f(n-1)+f(n-2)。
def walk_stairs(stairs):
? ? if stairs == 1:
? ? ? ? return 1
? ? if stairs == 2:
? ? ? ? return 2
? ? else:
? ? ? ? return walk_stairs(stairs-1) + walk_stairs(stairs-2)
# 2囤萤、給一個(gè)樓梯昼窗,從最下面往上走,每次可以走1到n步涛舍,求總共有多少種走法澄惊?
#上1個(gè)臺(tái)階1
#上2個(gè)臺(tái)階2
#上3個(gè)臺(tái)階4
#上4個(gè)臺(tái)階8
#上n個(gè)臺(tái)階2^(n-1)
# 3、給一個(gè)樓梯富雅,從最下面往上走掸驱,每次可以走1步或2步或3步,求總共有多少種走法没佑?
#上1個(gè)臺(tái)階2^(1-1)
#上2個(gè)臺(tái)階2^(2-1)
#上3個(gè)臺(tái)階2^(3-1)
# f(n) = f(n-1) + f(n-2) + f(n-3)
12毕贼、 給一個(gè)字符數(shù)組,字符包含a-z图筹、1-9帅刀,比如:a b c 4 b 2 a c 1 1 3,求只出現(xiàn)一次的第一次出現(xiàn)的字符
str_list = ['a', 'b', 'c', 4, 'b', 2, 'a', 'c', 1, 1, 3]
def find_only_one(alist):
? ? for string in alist:
? ? ? ? count = alist.count(string)
? ? ? ? if count == 1:
? ? ? ? ? ? return string
? ? return None
13远剩、 有一個(gè)html文本字符串扣溺,讓我取出sflkj這個(gè)a標(biāo)簽里面的href的鏈接地址?
from bs4 import BeautifulSoup
text = "sflkj"
the_html = BeautifulSoup(text,features='lxml')
print(the_html.find('a').attrs['href'])
14瓜晤、 下面是一個(gè)單線程的代碼锥余,請改寫成多線程的:
start = "http://google.com"
queue = [start]
visited = {start}
while queue:
? ? url = queue.pop(0)
? ? print(url)?
? ? for next_url in extract_url(url):
? ? ? ? if next_url not in visited:
? ? ? ? ? ? queue.append(next_url)
? ? ? ? visited.add(next_url)
from concurrent.futures import ThreadPoolExecutor
start = "http://google.com"
queue = [start]
visited = {start}
pool = ThreadPoolExecutor(10)
def func(url):
? ? for next_url in extract_url(url):
? ? ? ? if next_url not in visited:
? ? ? ? ? ? queue.append(next_url)
? ? ? ? visited.add(next_url)
while queue:
? ? url = queue.pop(0)
? ? pool.submit(func,url)
pool.shutdown(wait=True)
面試題(六)[17]
1、 獲取list的元素個(gè)數(shù)痢掠,向list的末尾追加元素所用的方法分別是( ),( )
count驱犹,append
2、 判斷dict有沒有某個(gè)key用的方法是( )
in
3足画、 L = range(100) 雄驹,取第一到第三個(gè)元素用(),取倒數(shù)第二個(gè)元素()淹辞,取后十個(gè)元素()
L[:3]
L[-2]
L[-10:]
4医舆、 把L復(fù)制給L1用() 注意:非引用傳遞
L1 = L.copy()
5、d = {'a':1,'b':2,'c':3}請打印出key象缀,value對
for k,v in d.items():
? ? print(k,v)
6蔬将、 如何判斷一個(gè)變量是不是字符串
isinstance(a,str)
7、list和tuple有什么不同央星?
8霞怀、xrange和range有什么不同?
9莉给、‘1,2,3’如何變成[‘1’,’2’,’3’] ?? [‘1’,’2’,’3’]如何變成[1,2,3]
s1 = "1,2,3"
s2 = list(s1.split(','))
s3 = list(map(int,s2))
10毙石、請回答以下問題?
def add_end(L= []):
? ? L.append('END')
? ? return L
print(add_end()) #輸出什么禁谦?
print(add_end()) #再次調(diào)用輸出什么胁黑?為什么?
["END"] ["END",""END] 函數(shù)的默認(rèn)參數(shù)在編譯時(shí)州泊,分配內(nèi)存空間丧蘸。沒有給予參數(shù)都是使用默認(rèn)的參數(shù),是同一段內(nèi)存地址的同一對象遥皂。
11力喷、[36,5,12,9,21]怎么排序?
a = [36,5,12,9,21]
a.sort()
12演训、請回答以下問題:
def func(a,b,c=0,*args,**kwargs):
? ? pass
*args,**kwargs的作用是什么弟孟?
當(dāng)函數(shù)的參數(shù)不確定時(shí),可以使用*args 和**kwargs來 傳遞可變參數(shù)样悟。
*args儲(chǔ)存可變的位置參數(shù)拂募,它會(huì)接收任意多個(gè)參數(shù)并把這些參數(shù)作為元組傳遞給函數(shù)庭猩。**kwargs存儲(chǔ)可變的關(guān)鍵字參數(shù),允許你使用沒有事先定義的參數(shù)名陈症,將接收到任意多個(gè)關(guān)鍵字參數(shù)作為字典傳遞給函數(shù)蔼水。
注意函數(shù)的參數(shù)的順序:args必須在kwargs前面,調(diào)用函數(shù)傳遞參數(shù)也必須依照此順序
13录肯、is和==的區(qū)別是趴腋?
Python中的對象包含三要素:id、type论咏、value
其中id用來唯一標(biāo)識(shí)一個(gè)對象优炬,type標(biāo)識(shí)對象的類型,value是對象的值
is判斷的是a對象是否就是b對象厅贪,是通過id來判斷的
==判斷的是a對象的值是否和b對象的值相等蠢护,是通過value來判斷的
14、如何生成[1,4,9,16,25,36,49,64,81,100]养涮?盡量用一行實(shí)現(xiàn)
[x*x for x in range(1,11)]
15糊余、生成器是什么?有什么作用单寂?請寫出一個(gè)生成器
a = ( i for i in range(11))
16贬芥、map(str,[1,2,3,4,5,6,7,8,9])輸出什么?
# 生成的是map對象
print(list(map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9])))
# ['1', '2', '3', '4', '5', '6', '7', '8', '9']
17宣决、請寫出log的實(shí)現(xiàn)(主要功能是打印函數(shù)名)
@log
def now():
? ? print('2013-12-25')
now()
# 輸出:
# call now()
# 2013-12-25
import functools
def log(func):
? ? @functools.wraps(func)
? ? def inner():
? ? ? ? print('call '+ func.__name__ + '()')
? ? ? ? func()
? ? return inner
面試題(七)[13]
一蘸劈、單項(xiàng)選擇
1? 以下敘述正確的是:
A continue語句的作用是結(jié)束整個(gè)循環(huán)的執(zhí)行
B 只能在循環(huán)體內(nèi)和switch語句體中使用break語句
C 在循環(huán)體內(nèi)使用break語句或continue語句的 作用相同
D 從多層循環(huán)嵌套中退出時(shí),只能使用goto語句
# B
2 Python如何定義一個(gè)函數(shù)( 3)
class ( arg1 , arg 2, ... , argN)
function (arg1 ,arg2 ,… , argN)
def (arg1 ,arg2 ,… , argN)
def ( arg1 , arg 2, ... , argN)
3 下面哪個(gè)函數(shù)能夠在Linux環(huán)境下創(chuàng)建一個(gè)子進(jìn)程:
os.popen
os.fork
os.system
os.link?
# 2
4已知x=43尊沸,ch = 'A' ,y = 1威沫,則表達(dá)式(x > y and ch< ‘B’ and y)的值是
0
1
出錯(cuò)
True(“真”)
# 2
5 下面的語句哪個(gè)會(huì)無限循環(huán)下去
啟動(dòng)range函數(shù)原型為range([start],stop[,step])
1、for a in range(10):
? ? ? ? ? ? ? ? ?time.sleep(10)
2洼专、while 1 < 10:
time.sleep(10)
3棒掠、while True:
break;
4、a = [3,-1, 5 , 7]
for I in a[:]
if a > 10:
break;
# 2
6 下列表達(dá)式中返回為True的是:
???????? A. 3 > 2 >2
???????? B. ‘a(chǎn)bc’ > ‘xyz’
???????? C. 0x56 < 56
???????? D. (3,2) < (‘a(chǎn)’,’b’)
# D
7 Python不支持的數(shù)據(jù)類型有
char
int
float
list
# 1
二屁商、不定選項(xiàng)
8?? 下面的函數(shù)烟很,那些會(huì)輸出1,2,3三個(gè)數(shù)字
?for I in range(3)
print i
2.?aList = [0,1,2]
? ? ? ? ? for I in aList:
? ? ? ? ? ? ? ? print i+1
3.?I = 1
while I < 3:
???????? print i
???????? I = I +1
4.for I in range(3):
print I + 1
# 2,4
三、填空題
9? 以下函數(shù)需要調(diào)用在其中引用一個(gè)全局變量k蜡镶,請?zhí)顚懻Z句:
def func():
???????? ___________
???????? k = k +1
global k
10請把以下函數(shù)轉(zhuǎn)化為Python lambda匿名函數(shù)
???????? def add(x,y):
????????????????? return x+y
lambda x,y:x+y
11請簡單解釋Python中static method(靜態(tài)方法)和class method(類方法)
請將以下代碼填寫完整
class A(object):
? ? def foo(self,x):
? ? ? ? print("executing foo(%s,%s)" % (self,x))
? ? @classmethod
? ? def class_foo(cls,x):
? ? ? ? print("executing class_foo(%s,%s)" % (cls,x))
? ? @staticmethod
? ? def static_foo(x):
? ? ? ? print("executing static_foo(%s)" % (x))
a = A()
# 調(diào)用 foo函數(shù)雾袱,參數(shù)傳入1
a.foo(1)
#調(diào)用class_foo函數(shù),參數(shù)傳入1
a.class_foo(1)
A.class_foo(1)
# 調(diào)用靜態(tài)方法官还,傳入?yún)?shù)1
a.static_foo(1)
A.static_foo(1)
四芹橡、程序題
12、 請書寫一個(gè)函數(shù)望伦,用于替換某個(gè)字符串的一個(gè)或某幾個(gè)字串
函數(shù)原型strreplace(str,oldString,newString);
例如:
pstr = “Hello World!”
afterReplaceStr = strreplace(pstr,”World”,”Tom”)
那么afterReplaceStr的值為”Hello Tom”
def strreplace(str,oldString,newString):
? ? return str.replace(oldString,newString)
13林说、 平衡點(diǎn)問題:
假如一個(gè)數(shù)組中的元素煎殷,其前面的部分等于后面的部分,那么這個(gè)點(diǎn)的位序就是平衡點(diǎn)
比如一個(gè)列表numbers = [1,3,20,2,18,6]腿箩,2前面的總和為24蝌数,2后面的總和也是24,那么2就是平衡點(diǎn)
要求編寫程序度秘,尋找并返回任意一個(gè)列表的平衡點(diǎn)
def balance_num(numbers):
? ? for i in range(0,len(numbers)):
? ? ? ? if sum(numbers[:i]) == sum(numbers[i+1:]):
? ? ? ? ? ? return numbers[i]
? ? return None
面試題(八)【11】
1 Python如何實(shí)現(xiàn)單例模式?
2什么是lambda函數(shù)饵撑?
3 請寫出一段Python代碼實(shí)現(xiàn)刪除list里面的重復(fù)元素剑梳?
4 如何用Python刪除一個(gè)文件?
5 Python里面如何生成隨機(jī)數(shù)滑潘?
6 請用Python寫出一個(gè)獲取用戶輸入數(shù)字垢乙,并根據(jù)數(shù)字大小輸出不同信息的腳本?
7 range和xrange區(qū)別
8 解釋生成器(generator)與函數(shù)的不同语卤,并實(shí)現(xiàn)和使用簡單generator
9輸入一個(gè)字符串追逮,返回倒序排列的結(jié)果;如’abcdef’粹舵,返回’fedcba’? str1 = 'abcdefg'
str2 = str1[::-1]
str3 = list(str1)
str3.reverse()
str4 = ''.join(str3)
10 請使用自己的算法钮孵,按升序合并如下兩個(gè)list,并去除重復(fù)的元素:
list1 = [2,3,8,4,9,5,6]
list2 = [5,6,10,17,11,2]
11.Django如何在Model保存前做一定的固定操作眼滤,比如寫一句日志
面試九【4】
1巴席、淺談你對python編碼規(guī)范的認(rèn)識(shí),并寫出你知道的編碼規(guī)范
Python編碼規(guī)范和Python風(fēng)格規(guī)范
一诅需、原因
1漾唉、長期的工作中,發(fā)現(xiàn)大多數(shù)程序員的代碼可讀性差
2堰塌、不同的程序員之間的協(xié)作很重要赵刑,代碼可讀性必須很好
3、版本升級(jí)時(shí)场刑,要基于源碼升級(jí)
4般此、不友好的代碼會(huì)影響python的執(zhí)行效率
二、基于的規(guī)范
1牵现、PEP 8:?Style Guide for Python Code---------Python的編碼風(fēng)格建議
2恤煞、Google Python Style Guide--------------Goole Python編碼風(fēng)格建議
三、Python語言規(guī)范
1. imports 僅僅用做包和模塊的導(dǎo)入施籍,包的導(dǎo)入每個(gè)盡量獨(dú)占一行
2. packages 導(dǎo)入模塊盡量使用模塊的全路徑
3. Exceptions必須小心使用
4. Global variables避免使用全局變量
5. Generator
6. lambda 函數(shù)僅僅適用于一行代碼能實(shí)現(xiàn)的簡單函數(shù)
7. True or False盡量使用[],'',{},0,None來隱式表示False
四居扒、Python風(fēng)格規(guī)范
1、代碼編排
1 縮進(jìn):4個(gè)空格實(shí)現(xiàn)縮進(jìn)丑慎,盡量不使用Tab喜喂,禁止混用Tab和空格
2 行:每行最大長度不超過79瓤摧,換行可以使用反斜杠(\)。最好使用圓括號(hào)將換行內(nèi)容括起來玉吁,不建議使用“;”
3 空行:類和top-level函數(shù)定義之間空兩行照弥;類中的方法定義之間空一行;函數(shù)內(nèi)邏輯無關(guān)段落之間空一行进副;其他地方盡量不要再空行这揣。
4 空格:括號(hào)內(nèi)的第一個(gè)位置,不要空格影斑。緊靠右括號(hào)的位置也不要空格给赞。冒號(hào)(:)、逗號(hào)(,)矫户、分號(hào)(;)之前不要加空格片迅。切片木有參數(shù),不要加空格等
5 括號(hào):對于單元素tuple一定要加,和括號(hào)
2皆辽、命名規(guī)范
module_name
package_name
ClassName
method_name
ExceptionName
function_name
GLOBAL_CONSTANT_NAME
global_var_name
instance_var_name
function_parameter_name
local_var_name
3柑蛇、注釋規(guī)范
1.塊注釋,在一段代碼前增加的注釋驱闷。在‘#’后加一空格耻台。段落之間以只有‘#’的行間隔。比如:
# Description : Module config. # # Input : None # # Output : None
2.?行注釋空另,在一句代碼后加注釋粘我。比如:x = x + 1 # Increment x?但是這種方式盡量少使用。
3.?避免無謂的注釋痹换。
4征字、編程建議
1. 字符串拼接,盡量使用join娇豫。使用str的方法而不是內(nèi)置方法匙姜。使用startswith或endswith拉檢查前綴和后綴
2. 單例對象,盡量使用is 冯痢、is not氮昧,不要使用==
3.使用is not而不是not is
4. 使用def來定義函數(shù),而不是將匿名函數(shù)賦給某個(gè)變量
5. 盡量使代碼整齊浦楣,簡潔
6.使用isinstance()來判斷instance的類型
2袖肥、淺談你對python安全編碼的認(rèn)識(shí),并舉例說明
1振劳、圖書管理系統(tǒng)是對圖書進(jìn)行錄入椎组、借閱的系統(tǒng),請用django框架實(shí)現(xiàn)新增历恐、查看圖書的功能寸癌,分別寫出model.py专筷、urls.py、views.py的邏輯
2蒸苇、設(shè)有一個(gè)背包能承受重量s(s>0)磷蛹,又有n(n>=1)件物品,其質(zhì)量列表為 w = [w1,w2....,wn]溪烤,要從物品中挑選若干件放入背包味咳,使得放入的圖書質(zhì)量之和正好是s。請?jiān)O(shè)計(jì)遞歸函數(shù)f(w,s,n):
當(dāng)有解時(shí)檬嘀,返回True槽驶,并顯示所選物品是那些?無解時(shí)返回False枪眉。提示:[遞歸之處在于f(w,s-wn,n-1) or f(w,s,n-1)]
python面試題(十)【10】
Python中基本數(shù)據(jù)結(jié)構(gòu)的操作
?元組列表字典集合
定義????
新增????
更改????
刪除????
2.請盡可能列舉python列表的成員方法,并給出一下列表操作的答案:
≡俨恪(1)a=[1, 2, 3, 4, 5], a[::2]=贸铜?, a[-2:] =?
(1)1 3 5
(2)4 5
(2) 一行代碼實(shí)現(xiàn)對列表a中的偶數(shù)位置的元素進(jìn)行加3后求和聂受?
sums = sum(map(lambda x: x + 3, a[1::2]))
3.List = [-2, 1, 3, -6]蒿秦,如何實(shí)現(xiàn)以絕對值大小從小到大將List中內(nèi)容排序。
sorted(list1,key = abs)
(1) 列表的sort方法和 sorted的區(qū)別是什么蛋济?
sort是list的方法棍鳖,改變list對象的順序,返回值為None
sorted是Python的內(nèi)置方法碗旅,適用iterable對象渡处,返回值是新列表,不影響原來的iterable的順序
4.有一篇英文文章保存在 a.txt 中祟辟,請用python實(shí)現(xiàn)統(tǒng)計(jì)這篇文章內(nèi)每個(gè)單詞的出現(xiàn)頻率医瘫,并返回出現(xiàn)頻率最高的前10個(gè)單詞及其出現(xiàn)次數(shù)(只考慮空格,標(biāo)點(diǎn)符號(hào)可忽略)
from collections import Counter
? ? c = Counter()
with open('a.txt','r',encoding='utf-8') as f:
? ? for line in f.readlines():
? ? ? ? words = line.split()
? ? ? ? c1 = Counter(words)
? ? ? ? c.update(c1)
(1)追加需求:引號(hào)內(nèi)元素需要算作一個(gè)單詞旧困,如何實(shí)現(xiàn)醇份?
以"分割,轉(zhuǎn)換成列表吼具,取其奇數(shù)分割僚纷,其偶數(shù)不做處理
5.Python函數(shù)中經(jīng)常有 *args,**kwargs 這兩個(gè)參數(shù)拗盒,它們是什么意思怖竭,為什么要使用它們?
太簡單陡蝇,就不寫啦侵状,哈哈哈哈
6.Python中的變量作用域(變量查找順序)赞弥。
LEGB
local局部變量--->enclosed閉包作用域----> Global全局---->built-in變量
7.下面這段代碼的輸出結(jié)果將是什么?請解釋趣兄。
# 1 1 1 繼承自父類的類屬性x绽左,所以都一樣,指向同一塊內(nèi)存地址
# 1 2 1更改Child1艇潭,Child1的x指向了新的內(nèi)存地址
# 3 2 3更改Parent拼窥,Parent的x指向了新的內(nèi)存地址
8.描述Python GIL的概念, 以及它對python多線程的影響蹋凝?編寫一個(gè)多線程抓取網(wǎng)頁的程序鲁纠,并闡明多線程抓取程序是否可比單線程性能有提升,并解釋原因鳍寂。
Guido的聲明:http://www.artima.com/forums/flat.jsp?forum=106&thread=214235
he language doesn't require the GIL -- it's only the CPython virtual machine that has historically been unable to shed it.
Python語言和GIL沒有半毛錢關(guān)系改含。僅僅是由于歷史原因在Cpython虛擬機(jī)(解釋器),難以移除GIL迄汛。
GIL:全局解釋器鎖捍壤。每個(gè)線程在執(zhí)行的過程都需要先獲取GIL,保證同一時(shí)刻只有一個(gè)線程可以執(zhí)行字節(jié)碼鞍爱。
線程釋放GIL鎖的情況:
在IO操作等可能會(huì)引起阻塞的system call之前,可以暫時(shí)釋放GIL,但在執(zhí)行完畢后,必須重新獲取GIL
Python 3.x使用計(jì)時(shí)器(執(zhí)行時(shí)間達(dá)到閾值后鹃觉,當(dāng)前線程釋放GIL)或Python 2.x,tickets計(jì)數(shù)達(dá)到100
Python使用多進(jìn)程是可以利用多核的CPU資源的睹逃。
多線程爬取比單線程性能有提升盗扇,因?yàn)橛龅絀O阻塞會(huì)自動(dòng)釋放GIL鎖
9.Python中如何動(dòng)態(tài)獲取和設(shè)置對象的屬性。
if hasattr(Parent,'x'):
? ? print(getattr(Parent,'x'))
? ? setattr(Parent,'x',3)
? ? print(getattr(Parent,'x'))
10.(前端基礎(chǔ))
(1)用CSS如何隱藏一個(gè)元素
dispaly:none
(2)一行CSS實(shí)現(xiàn)padding上下左右分別為1px沉填,2px疗隶,3px,4px
padding:1 4 2 3
(3)??? JavaScript(或jQuery)如何選擇一個(gè)id為main的容器
$('#main')
(4)??? JavaScript(或jQuery)如何選擇一個(gè)class為menu的容器
$('.menu')?
python面試(十四)【4】?
map(lambda x:x*x,[y for y in range(3)])
[0, 1, 4]
2翼闹、下面代碼會(huì)輸出什么?
def f(x, l = [] )
for i in range(x):
l.append(i*i)
print l
f(2)
f(3,[3,2,1])
f(3)
1抽减、[0, 1]
2、[3, 2, 1, 0, 1, 4]
3橄碾、[0, 1, 0, 1, 4]
?之一卵沉,示例如下:
層級(jí)遍歷:0 1 2 3 4 5 6 7 8 9
先序遍歷:0 1 3 7 8 4 9 2 5 6
中序遍歷:7 3 8 ?1 9 4 0 5 2 6
后序排列:7 8 3 9 4 1 5 6 2 0
class Node(object):
? ? def __init__(self, data, left=None, right=None):
? ? ? ? self.data = data
? ? ? ? self.left = left
? ? ? ? self.right = right
r為Node類型的根節(jié)點(diǎn)
實(shí)現(xiàn)函數(shù)traverse(r)輸出先序遍歷結(jié)果,輸出部分使用print r.data即可
node7 = Node(7)
node8 = Node(8)
node9 = Node(9)
node3 = Node(3,node7,node8)
node4 = Node(4,node9)
node5 = Node(5)
node6 = Node(6)
node1 = Node(1,node3,node4)
node2 = Node(2,node5,node6)
node0 = Node(0,node1,node2)
def traverse(r):
? ? print(r.data)
? ? if r.left:
? ? ? ? traverse(r.left)
? ? if r.right:
? ? ? ? traverse(r.right)
4法牲、有一個(gè)3G大小的文件史汗,文件每行一個(gè)string,內(nèi)容為酒店的id和一個(gè)圖片的名字拒垃,使用“\t”分割
示例:ht_1023134 + "\t" + hidfadsfadsfdfadsf2r234523,jpg
表示的是一個(gè)酒店包含的一張圖片停撞,統(tǒng)計(jì)含有圖片數(shù)量為[20,無窮大]的酒店id,含有圖片數(shù)量為[10,20]的酒店id、含有圖片數(shù)量為[10,5]的酒店id戈毒,含有圖片數(shù)量為[0艰猬,5]的酒店id,并將結(jié)果輸出到文件中
0-5 + “\t” + id1 +??“\t” + id2 + .....
5-10 + “\t” + id1 +??“\t” + id2 + .....
10-20 + “\t” + id1 +??“\t” + id2 + .....
20-無窮大+ “\t” + id1 +??“\t” + id2 + .....
from collections import Counter
count_dict = {}
cou = Counter()
with open('a.txt', encoding='utf-8') as f:
? ? for line in f:
? ? ? ? hotel, image = line.split()
? ? ? ? hotel_id = hotel.split('_')[1]
? ? ? ? cou.update({hotel_id,1})
? ? ? ? if hotel_id in count_dict:
? ? ? ? ? ? count_dict[hotel_id] += 1
? ? ? ? else:
? ? ? ? ? ? count_dict[hotel_id] = 1
del cou[1]
zero_five = ['0-5']
five_ten = ['5-10']
ten_twenty = ['10-20']
twenty_infinite = ['10-去窮大']
for hotel_id,count in count_dict.items():
? ? if count < 5 :
? ? ? ? zero_five.append(hotel_id)
? ? elif count < 10 :
? ? ? ? five_ten.append(hotel_id)
? ? elif count < 20:
? ? ? ? ten_twenty.append(hotel_id)
? ? else:
? ? ? ? twenty_infinite.append(hotel_id)
with open('b.txt','w',encoding='utf-8') as b:
? ? b.write('\t'.join(zero_five))
? ? b.write('\n')
? ? b.write('\t'.join(five_ten))
? ? b.write('\n')
? ? b.write('\t'.join(ten_twenty))
? ? b.write('\n')
? ? b.write('\t'.join(twenty_infinite))
面試題(十五)【13】
1埋市、請簡要描述django-admin.py makemessages的作用
2冠桃、Python如何捕獲異常,如何在程序執(zhí)行過程中拋出異常機(jī)制道宅?
Python中使用try ... except SomeException as e: ...來捕獲異常
raise SomeException("Some Message")來拋出異常
3食听、什么是lambda函數(shù)?它有什么好處污茵?
4樱报、*args和**kwargs的使用方法,請簡述一下泞当?
5迹蛤、簡要介紹下python里面的裝飾器?
6襟士、Http請求中GET和POST有什么區(qū)別盗飒?Cookies和Session有什么區(qū)別?
7敌蜂、a = 1箩兽,b = 2津肛,不用中間變量交換a和b的值章喉?
b, a = a, b
Python支持不使用中間變量交換兩個(gè)變量的值
8、編寫一個(gè)函數(shù)刪除list里的重復(fù)元素身坐,用兩種方式實(shí)現(xiàn)秸脱?
9、請簡要概括django測試工具部蛇?
10摊唇、如何擴(kuò)展auth_user的字段
11、請給出Profile的實(shí)現(xiàn)實(shí)例
12涯鲁、如何替換auth_user
13巷查、django的繼承的方式有哪些?
Python面試題(十六)【8】164?
1抹腿、取出兩個(gè)升序數(shù)組中的最小的一半的元素組成一個(gè)新的升序數(shù)組岛请。
map(lambda x, y: x if x < y else y, a, b)
2、用至少2種不同的方式刪除一個(gè)list里面的重復(fù)元素
a = [1, 2, 2, 4, 34, 3, 4, 56, 65, 456, 5, 6456, 456, 54, 45, 6, 464, 564]
# 方法一
new_list3 = list(set(a))
# 方法二
new_list = []
for num in a:
? ? if num not in new_list:
? ? ? ? new_list.append(num)
# 方法三
dict1 = dict.fromkeys(a)
new_list2 = dict1.keys()
3警绩、利用線程池(10個(gè)線程)實(shí)現(xiàn)一個(gè)并行打印10行信息的程序崇败,打印This is thread xx.(注:xx為線程id)
4、關(guān)系型數(shù)據(jù)庫的事務(wù)隔離級(jí)別有哪些,分別有什么影響后室?
1缩膝、未提交讀(Read Uncommitted)?
? ? 直譯就是"讀未提交",意思就是即使一個(gè)更新語句沒有提交,但是別的事務(wù)可以讀到這個(gè)改變.這是很不安全的。允許任務(wù)讀取數(shù)據(jù)庫中未提交的數(shù)據(jù)更改岸霹,也稱為臟讀疾层。?
2、提交讀(Read Committed)?
?? 直譯就是"讀提交",可防止臟讀松申,意思就是語句提交以后即執(zhí)行了COMMIT以后別的事務(wù)就能讀到這個(gè)改變. 只能讀取到已經(jīng)提交的數(shù)據(jù)云芦。Oracle等多數(shù)數(shù)據(jù)庫默認(rèn)都是該級(jí)別?
3、可重復(fù)讀(Repeatable Read):?
?? 直譯就是"可以重復(fù)讀",這是說在同一個(gè)事務(wù)里面先后執(zhí)行同一個(gè)查詢語句的時(shí)候,得到的結(jié)果是一樣的.在同一個(gè)事務(wù)內(nèi)的查詢都是事務(wù)開始時(shí)刻一致的贸桶,InnoDB默認(rèn)級(jí)別舅逸。在SQL標(biāo)準(zhǔn)中,該隔離級(jí)別消除了不可重復(fù)讀皇筛,但是還存在幻象讀?
4琉历、串行讀(Serializable)?
?? 直譯就是"序列化",意思是說這個(gè)事務(wù)執(zhí)行的時(shí)候不允許別的事務(wù)并發(fā)執(zhí)行. 完全串行化的讀,每次讀都需要獲得表級(jí)共享鎖水醋,讀寫相互都會(huì)阻塞
四谎仲,隔離級(jí)別對事務(wù)并發(fā)的控制?
下表是各隔離級(jí)別對各種異常的控制能力:
丟失更新? ? 臟讀? ? 非重復(fù)讀? ? 二類丟失更新(覆蓋更新)? ? 幻像讀
未提交讀? ? Y? ? Y? ? Y? ? Y? ? Y
提交讀? ? N? ? N? ? Y? ? Y? ? Y
可重復(fù)讀? ? N? ? N? ? N? ? N? ? Y
串行讀? ? N? ? N? ? N? ? N? ? N
5、請用python編寫函數(shù)find_string里伯,從文本中搜索并打印內(nèi)容撵儿,要求支持通配符星號(hào)和問號(hào)。
例子:
>>>find_string('hello\nworld\n','wor')
['wor']
>>>find_string('hello\nworld\n','l*d')
['ld']
>>>find_string('hello\nworld\n','o?')
['or']
6惶桐、請為find_string編寫單元測試
7撮弧、已有一個(gè)字典列表,如下:
li = [
? ? {'id': '1.1', 'content': "14"},
? ? {'id': '1.2', 'content': "15"},
? ? {'id': '1.3', 'content': "16"},
? ? {'id': '1.4', 'content': "17"},
? ? {'id': '1.5', 'content': "18"},
]
請寫一個(gè)類:
abc = x()
>>abc['1.1']
14
class x(UserDict):
? ? def __init__(self):
? ? ? ? super().__init__()
? ? ? ? for dic in li:
? ? ? ? ? ? # print(dic)
? ? ? ? ? ? self.data.update({dic['id']:dic['content']})
abc = x()
print(abc['1.1'])
8姚糊、如何快速對學(xué)生的成績進(jìn)行評(píng)級(jí):(源自Fluent Python)
60分以下評(píng)為F
60-70評(píng)為D
...
90分以上為A
import bisect
import sys
def grade(score, breakpoint=[60, 70, 80, 90], grades = 'FDCBA'):
? ? i = bisect.bisect(breakpoint, score)
? ? return grades[i]
if __name__ == '__main__':
? ? level = grade(64)
? ? print(level)
面試問題總結(jié)【25】
1贿衍、WebSocket相關(guān)問題
?請簡單說明一下WebSocket的握手過程
1、client發(fā)送請求救恨,請求頭攜帶Sec-WebSocket-Key
2贸辈、server收到請求,解析請求頭部信息肠槽,拿到Sec-WebSocket-Key
3擎淤、服務(wù)器端將magic_string(258EAFA5-E914-47DA-95CA-C5AB0DC85B11)和Sec-WebSocket-Key進(jìn)行sha-1加密,將hash結(jié)果進(jìn)行base64編碼
4秸仙、將編碼結(jié)果放在響應(yīng)頭部Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=嘴拢,返回給客戶端,連接完成
?Tornado如何處理WebSocket
1筋栋、Tornado的Controller匹配到響應(yīng)的請求url炊汤,將其轉(zhuǎn)發(fā)給處理的Handler,比如ChatHandler
2、ChatHandler需要繼承tornado.websocket.WebSocketHandler
3抢腐、ChatHandler必須實(shí)現(xiàn)
open方法:客戶端連接成功姑曙,需要執(zhí)行的方法
on_message方法:客戶端向服務(wù)端發(fā)送消息,執(zhí)行的方法
on_close方法:客戶端關(guān)閉時(shí)迈倍,執(zhí)行的方法
2伤靠、能簡單說說線程、進(jìn)程和協(xié)程嗎啼染?
? ?1宴合、線程:最小的調(diào)度單位
2、協(xié)程:用戶自定義的線程切換
3迹鹅、進(jìn)程:
3卦洽、Http和Https的區(qū)別?
4斜棚、對于TCP/IP協(xié)議熟悉嗎阀蒂?三次握手,四次揮手弟蚀?能簡單說一下七層模型嗎蚤霞?
TCP/IP協(xié)議,是網(wǎng)絡(luò)通信協(xié)議义钉,又稱傳輸控制協(xié)議/因特網(wǎng)互聯(lián)協(xié)議昧绣。定義了電子設(shè)備如何連入互聯(lián)網(wǎng),以及數(shù)據(jù)如何在互聯(lián)網(wǎng)相互傳輸?shù)臉?biāo)準(zhǔn)捶闸。
所謂三次握手就是建立TCP連接時(shí)夜畴,需要客戶端和服務(wù)端總共發(fā)送3個(gè)包以確認(rèn)連接的建立。
(1)第一次握手:Client將標(biāo)志位SYN置為1鉴嗤,隨機(jī)產(chǎn)生一個(gè)值seq=J斩启,并將該數(shù)據(jù)包發(fā)送給Server序调,Client進(jìn)入SYN_SENT狀態(tài)醉锅,等待Server確認(rèn)。
? (2)第二次握手:Server收到數(shù)據(jù)包后由標(biāo)志位SYN=1知道Client請求建立連接发绢,Server將標(biāo)志位SYN和ACK都置為1硬耍,ack=J+1,隨機(jī)產(chǎn)生一個(gè)值seq=K边酒,并將該數(shù)據(jù)包發(fā)送給Client以確認(rèn)連接請求经柴,Server進(jìn)入SYN_RCVD狀態(tài)。
? (3)第三次握手:Client收到確認(rèn)后墩朦,檢查ack是否為J+1坯认,ACK是否為1,如果正確則將標(biāo)志位ACK置為1,ack=K+1牛哺,并將該數(shù)據(jù)包發(fā)送給Server陋气,Server檢查ack是否為K+1,ACK是否為1引润,如果正確則連接建立成功巩趁,Client和Server進(jìn)入ESTABLISHED狀態(tài),完成三次握手淳附,隨后Client與Server之間可以開始傳輸數(shù)據(jù)了议慰。
所謂四次揮手,就是指斷開一個(gè)TCP連接時(shí)奴曙,客戶端和服務(wù)器總共發(fā)送4個(gè)包來確認(rèn)連接的斷開别凹。?
由于TCP連接時(shí)全雙工的,因此洽糟,每個(gè)方向都必須要單獨(dú)進(jìn)行關(guān)閉番川,這一原則是當(dāng)一方完成數(shù)據(jù)發(fā)送任務(wù)后,發(fā)送一個(gè)FIN來終止這一方向的連接脊框,收到一個(gè)FIN只是意味著這一方向上沒有數(shù)據(jù)流動(dòng)了颁督,即不會(huì)再收到數(shù)據(jù)了,但是在這個(gè)TCP連接上仍然能夠發(fā)送數(shù)據(jù)浇雹,直到這一方向也發(fā)送了FIN沉御。首先進(jìn)行關(guān)閉的一方將執(zhí)行主動(dòng)關(guān)閉,而另一方則執(zhí)行被動(dòng)關(guān)閉昭灵,上圖描述的即是如此吠裆。
?(1)第一次揮手:Client發(fā)送一個(gè)FIN,用來關(guān)閉Client到Server的數(shù)據(jù)傳送烂完,Client進(jìn)入FIN_WAIT_1狀態(tài)试疙。
? (2)第二次揮手:Server收到FIN后,發(fā)送一個(gè)ACK給Client抠蚣,確認(rèn)序號(hào)為收到序號(hào)+1(與SYN相同祝旷,一個(gè)FIN占用一個(gè)序號(hào)),Server進(jìn)入CLOSE_WAIT狀態(tài)嘶窄。
?(3)第三次揮手:Server發(fā)送一個(gè)FIN怀跛,用來關(guān)閉Server到Client的數(shù)據(jù)傳送,Server進(jìn)入LAST_ACK狀態(tài)柄冲。
? (4)第四次揮手:Client收到FIN后吻谋,Client進(jìn)入TIME_WAIT狀態(tài),接著發(fā)送一個(gè)ACK給Server现横,確認(rèn)序號(hào)為收到序號(hào)+1漓拾,Server進(jìn)入CLOSED狀態(tài)阁最,完成四次揮手。
七層模型骇两,即OSI(Open System Interconnect)闽撤,開放式系統(tǒng)互聯(lián)
5、能簡單說一下你了解的socket嗎脯颜?
6哟旗、Python的GIL(全局解釋器鎖)
7、Python的with語句栋操?優(yōu)點(diǎn)闸餐?如何實(shí)現(xiàn)?
8矾芙、Python的單例模式舍沙?
9、Python垃圾回收機(jī)制剔宪?
10拂铡、Python的生成器和迭代器?
11葱绒、python的裝飾器感帅?
12、Python的with語句的使用地淀?
13失球、Python函數(shù)中經(jīng)常有 *args,**kwargs 這兩個(gè)參數(shù)帮毁,它們是什么意思实苞,為什么要使用它們?
14烈疚、Django的請求生命周期
用戶請求到來 黔牵,通過url進(jìn)行(自上而下)的路由匹配, 匹配成功則映射到對應(yīng)視圖。
通過業(yè)務(wù)邏輯的處理(數(shù)據(jù)庫...), 經(jīng)模板渲染繼而響應(yīng)給用戶內(nèi)容
15爷肝、Django的中間件做什么猾浦?
中間件是用來處理請求和響應(yīng)的插件機(jī)制,全局地處理Django的請求和響應(yīng)阶剑。每個(gè)中間件都有特定功能跃巡。MiddleWare的需要在settings里面進(jìn)行配置危号,按順序配置上對應(yīng)類的在Python中全路徑牧愁。MiddleWare一般都是MiddlewareMixin的子類。通常實(shí)現(xiàn)process_request方法和process_response方法外莲。
process_request是在請求來臨時(shí)猪半,尚未正則匹配前執(zhí)行的函數(shù)兔朦。如果這個(gè)函數(shù)沒有返回值,或者返回為None磨确,會(huì)繼續(xù)執(zhí)行其他中間件的process_request方法沽甥。如果返回HttpResponse,Django將不會(huì)執(zhí)行后序的中間件和views函數(shù)乏奥,直接將response返回摆舟。
process_view函數(shù)是在獲取到要執(zhí)行的view函數(shù)和相應(yīng)參數(shù),在view函數(shù)執(zhí)行之前執(zhí)行的函數(shù)邓了。也是可以返回None或HttpResponse恨诱。
process_response是在執(zhí)行完view函數(shù),并生成response之后骗炉,執(zhí)行的函數(shù)照宝。可以對response做進(jìn)一步的處理句葵。必須返回HttpResponse對象厕鹃。
16、Django的ORM怎么獲取到一個(gè)name字段總數(shù)據(jù)有沒有“abc”乍丈,ORM操作
17剂碴、form驗(yàn)證?
18轻专、說一下線程鎖汗茄,什么時(shí)候用?
19铭若、描述你怎么用的tornado洪碳?
20、Tornado怎么做到異步的叼屠?
21瞳腌、Scrapy了解多少?
22镜雨、爬蟲的數(shù)據(jù)入庫操作嫂侍,線程需要加鎖嗎?
23荚坞、Mysql的優(yōu)化挑宠?
24、了解裝飾器嗎颓影?可以用來做什么各淀?有什么優(yōu)缺點(diǎn)?
25诡挂、使用過epoll碎浇?能聊聊IO多路復(fù)用嗎临谱?