python面試題

用于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ī)范

請點(diǎn)擊?

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ù)用嗎临谱?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市奴璃,隨后出現(xiàn)的幾起案子悉默,更是在濱河造成了極大的恐慌,老刑警劉巖苟穆,帶你破解...
    沈念sama閱讀 222,464評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件抄课,死亡現(xiàn)場離奇詭異,居然都是意外死亡雳旅,警方通過查閱死者的電腦和手機(jī)剖膳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來岭辣,“玉大人吱晒,你說我怎么就攤上這事÷偻” “怎么了仑濒?”我有些...
    開封第一講書人閱讀 169,078評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長偷遗。 經(jīng)常有香客問我墩瞳,道長,這世上最難降的妖魔是什么氏豌? 我笑而不...
    開封第一講書人閱讀 59,979評(píng)論 1 299
  • 正文 為了忘掉前任喉酌,我火速辦了婚禮,結(jié)果婚禮上泵喘,老公的妹妹穿的比我還像新娘泪电。我一直安慰自己,他們只是感情好纪铺,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,001評(píng)論 6 398
  • 文/花漫 我一把揭開白布相速。 她就那樣靜靜地躺著,像睡著了一般鲜锚。 火紅的嫁衣襯著肌膚如雪突诬。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,584評(píng)論 1 312
  • 那天芜繁,我揣著相機(jī)與錄音旺隙,去河邊找鬼。 笑死骏令,一個(gè)胖子當(dāng)著我的面吹牛蔬捷,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播伏社,決...
    沈念sama閱讀 41,085評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼抠刺,長吁一口氣:“原來是場噩夢啊……” “哼塔淤!你這毒婦竟也來了摘昌?” 一聲冷哼從身側(cè)響起速妖,我...
    開封第一講書人閱讀 40,023評(píng)論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎聪黎,沒想到半個(gè)月后罕容,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,555評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡稿饰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,626評(píng)論 3 342
  • 正文 我和宋清朗相戀三年锦秒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片喉镰。...
    茶點(diǎn)故事閱讀 40,769評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡旅择,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出侣姆,到底是詐尸還是另有隱情生真,我是刑警寧澤,帶...
    沈念sama閱讀 36,439評(píng)論 5 351
  • 正文 年R本政府宣布捺宗,位于F島的核電站柱蟀,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏蚜厉。R本人自食惡果不足惜长已,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,115評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望昼牛。 院中可真熱鬧术瓮,春花似錦、人聲如沸贰健。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽霎烙。三九已至撬讽,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間悬垃,已是汗流浹背游昼。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評(píng)論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留尝蠕,地道東北人烘豌。 一個(gè)月前我還...
    沈念sama閱讀 49,191評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像看彼,于是被迫代替她去往敵國和親廊佩。 傳聞我的和親對象是個(gè)殘疾皇子囚聚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,781評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • 狀態(tài)代碼有三位數(shù)字組成,第一個(gè)數(shù)字定義了響應(yīng)的類別标锄,且有五種可能取值: 1xx:指示信息–表示請求已接收顽铸,繼續(xù)處理...
    夢詩酒年華閱讀 1,364評(píng)論 0 0
  • 第一部分 Python基礎(chǔ)篇(80題) 1、為什么學(xué)習(xí)Python料皇? python入門簡單谓松。 Pyth...
    大夢一場空閱讀 641評(píng)論 0 4
  • Python面試題資料集合 (一) 編輯:小賢 目錄 1:Python如何實(shí)現(xiàn)單例模式? 2 2:什么是lambd...
    小賢tx閱讀 800評(píng)論 0 14
  • http://python.jobbole.com/85231/ 關(guān)于專業(yè)技能寫完項(xiàng)目接著寫寫一名3年工作經(jīng)驗(yàn)的J...
    燕京博士閱讀 7,583評(píng)論 1 118
  • 寫在前面的話 代碼中的# > 表示的是輸出結(jié)果 輸入 使用input()函數(shù) 用法 注意input函數(shù)輸出的均是字...
    FlyingLittlePG閱讀 2,771評(píng)論 0 8