1.現有字典 d={‘a’:24,’g’:52,’l’:12,’k’:33}請按字典
中的 value 值進行排序?
sorted(d.items(),key = lambda x:x[1])
2. Redis 因爲存儲的指紋過多怎麼辦?
設置生存時間
定時清理
持久化
主從
3. Phontomjs 相關?
主程序退出後,selenium 不保證 phantomJS 也成功退出,最好手動關閉
phantomJS 進程。(有可能會致使多個 phantomJS 進程運行,佔用內存)
WebDriverWait 雖然可能會減小延時,可是目前存在 bug(各類報錯),這
種狀況能夠採用 sleep。
phantomJS 爬數據比較慢,能夠選擇多線程。若是運行的時候發現有的能夠
運行,有的不能,能夠嘗試將 phantomJS 改爲 Chrome。
4. 什麼是函數?
函數是組織好的,可重複使用的,用來實現單一,或相關聯功能的代碼段。
函數能提升應用的模塊性,和代碼的重複利用率。Python 提供了許多內建函
數,但也能夠本身建立函數,這被叫作用戶自定義函數
5. scrapy-redis 去重原理?
可見 scrapy_redis 是利用 set 數據結構來去重的,去重的對象是 request
的 fingerprint(其實就是用 hashlib.sha1()對 request 對象的某些字段信息進
行壓縮)。其實 fp 就是 request 對象加密壓縮後的一個字符串(40 個字符,0~f)
6. map 函數和 reduce 函數?
①從參數方面來說:
map()包含兩個參數,第一個是參數是一個函數,第二個是序列(列表或元
組)。其中,函數(即 map 的第一個參數位置的函數)能夠接收一個或多個參數。
reduce() 第一個參數是函數,第二個是 序列(列表或元組)。可是,其函
數必須接收兩個參數。
黑 馬 程 序 員
②從對傳進去的數值做用來說:
map()是將傳入的函數依次做用到序列的每一個元素,每一個元素都是獨自被函
數「做用」一次;(請看下面的栗子)
reduce()是將傳人的函數做用在序列的第一個元素獲得結果後,把這個結果
繼續與下一個元素做用(累積計算)。
7. Python 的引用類型有哪些?
對象自己能夠修改,好比列表,字典等
8. self 和 cls 區別?
約定俗成,通常用到 staticmethod,classmethod 或者後期綁定就用 cls,否
則就用 self,屬於*args 的範疇的
9. 怎麼設置深度爬取?
經過在 settings.py 中設置 DEPTH_LIMIT 的值能夠限制爬取深度,這個深度
是與 start_urls 中定義 url 的相對值。也就是相對 url 的深度。若定義 url 爲
http://www.domz.com/game/,DEPTH_LIMIT=1 那麼限制爬取的只能是此 url 下一
級的網頁。深度大於設置值的將被忽視。
10. 怎麼儲存圖片和視頻? 通常存儲的是 URL
保存在雲服務器
11. a=1,b=2,不用中間變量交換 a 和 b 的值?
a=a+b
b=a-b
a=a-b
12. 代理 IP 裏的「透明」「匿名」「高匿」分別是指?
透明代理的意思是客戶端根本不須要知道有代理服務器的存在,可是它傳送
的仍然是真實的 IP。你要想隱藏的話,不要用這個。
普通匿名代理能隱藏客戶機的真實 IP,但會改變咱們的請求信息,服務器端
有可能會認爲咱們使用了代理。不過使用此種代理時,雖然被訪問的網站不能知
道你的 ip 地址,但仍然能夠知道你在使用代理,固然某些可以偵測 ip 的網頁仍
然能夠查到你的 ip。
黑 馬 程 序 員
高匿名代理不改變客戶機的請求,這樣在服務器看來就像有個真正的客戶瀏
覽器在訪問它,這時客戶的真實 IP 是隱藏的,服務器端不會認爲咱們使用了代
理
13. 請分別求出今天是本年、本月、本週的第幾天?
# -*- coding:utf-8 -*-
import datetime
nowtime1 = datetime.datetime.now().strftime('%Y-%m-%d').split('-')
today = nowtime1[2]
d=datetime.datetime.now()
weekday = d.weekday()+1
dt = datetime.datetime(int(nowtime1[0]), int(nowtime1[1]),
int(nowtime1[2]))
print("是第"+dt.strftime("%j")+"天")
print '是本月第%s 天'%today
print '是本週第%s 天'%weekday
14. MD5
MD5 功能:
輸入任意長度的信息,通過處理,輸出爲 128 位的信息(數字指紋);
不一樣的輸入獲得的不一樣的結果(惟一性);
根據 128 位的輸出結果不可能反推出輸入的信息(不可逆);
MD5 用途:
防止被篡改
防止直接看到明文
防止抵賴(數字簽名)
MD5 算法過程:
對 MD5 算法簡要的敘述能夠爲:MD5 以 512 位分組來處理輸入的信息,且每
一分組又被劃分爲 16 個 32 位子分組,通過了一系列的處理後,算法的輸出由四
個 32 位分組組成,將這四個 32 位分組級聯後將生成一個 128 位散列值。
15. 哈希表
哈希表就是一種以 鍵-值(key-indexed) 存儲數據的結構,咱們只要輸入待
查找的值即 key,便可查找到其對應的值。
黑 馬 程 序 員
哈希的思路很簡單,若是全部的鍵都是整數,那麼就可使用一個簡單的無
序數組來實現:將鍵做爲索引,值即爲其對應的值,這樣就能夠快速訪問任意鍵
的值。這是對於簡單的鍵的狀況,咱們將其擴展到能夠處理更加複雜的類型的鍵。
使用哈希查找有兩個步驟:
1. 使用哈希函數將被查找的鍵轉換爲數組的索引。在理想的狀況下,不一樣
的鍵會被轉換爲不一樣的索引值,可是在有些狀況下咱們須要處理多個鍵被哈希到
同一個索引值的狀況。因此哈希查找的第二個步驟就是處理衝突
2. 處理哈希碰撞衝突。哈希表是一個在時間和空間上作出權衡的經典例
子。若是沒有內存限制,那麼能夠直接將鍵做爲數組的索引。那麼全部的查找時
間複雜度爲 O(1);若是沒有時間限制,那麼咱們可使用無序數組並進行順序
查找,這樣只須要不多的內存。哈希表使用了適度的時間和空間來在這兩個極端
之間找到了平衡。只須要調整哈希函數算法便可在時間和空間上作出取捨。
16. python 的魔法方法
魔法方法就是能夠給你的類增長魔力的特殊方法,若是你的對象實現(重載)
了這些方法中的某一個,那麼這個方法就會在特殊的狀況下被 Python 所調用,
你能夠定義本身想要的行爲,而這一切都是自動發生的。它們常常是兩個下劃線
包圍來命名的(好比 __init__,__lt__),Python 的魔法方法是很是強大的,
因此瞭解其使用方法也變得尤其重要!
__init__ 構造器,當一個實例被建立的時候初始化的方法。可是它並非
實例化調用的第一個方法。
__new__纔是實例化對象調用的第一個方法,它只取下 cls 參數,並把其餘
參數傳給 __init__。 __new__不多使用,可是也有它適合的場景,尤爲是當類
繼承自一個像元組或者字符串這樣不常常改變的類型的時候。
__call__ 容許一個類的實例像函數同樣被調用
__getitem__ 定義獲取容器中指定元素的行爲,至關於 self[key]
__getattr__ 定義當用戶試圖訪問一個不存在屬性的時候的行爲
__setattr__ 定義當一個屬性被設置的時候的行爲
__getattribute__ 定義當一個屬性被訪問的時候的行爲
17. 字符集和字符編碼
字符是各類文字和符號的總稱,包括各個國家文字、標點符號、圖形符號、
數字等。字符集是多個字符的集合,字符集種類較多,每一個字符集包含的字符個
黑 馬 程 序 員
數不一樣,常見字符集有:ASCII 字符集、ISO 8859 字符集、GB2312 字符集、BIG5
字符集、GB18030 字符集、Unicode 字符集等。
字符編碼就是以二進制的數字來對應字符集的字符。
常見的編碼字符集(簡稱字符集)
Unicode:也叫統一字符集,它包含了幾乎世界上全部的已經發現且須要使
用的字符(如中文、日文、英文、德文等)。
ASCII:ASCII 既是編碼字符集,又是字符編碼。早期的計算機系統只能處理
英文,因此 ASCII 也就成爲了計算機的缺省字符集,包含了英文所須要的全部字
符。
GB2312:中文字符集,包含 ASCII 字符集。ASCII 部分用單字節表示,剩餘
部分用雙字節表示。
GBK:GB2312 的擴展,但完整包含了 GB2312 的全部內容。
GB18030:GBK 字符集的超集,常叫大漢字字符集,也叫 CJK(Chinese,
Japanese,Korea)字符集,包含了中、日、韓三國語
注意:Unicode 字符集有多種編碼方式,如 UTF-八、UTF-16 等;ASCII 只有
一種;大多數 MBCS(包括 GB2312)也只有一種。
18. 去列表裏面最大值
import numpy
list=[1,3,5,7]
list.remove(numpy.max(list))
19. 怎樣寫有序字典
from collections import OrderedDict
dic=OrderedDict() #聲明有序字典
dic.clear() #清空有序字典
dic['233']=233 #加入鍵值對
dir(OrderedDict) #列出全部的成員函數
20. with 語句
with 語句適用於對資源進行訪問的場合,確保無論使用過程當中是否發生異
常都會執行必要的「清理」操做,釋放資源,好比文件使用後自動關閉、線程中
鎖的自動獲取和釋放等。
21. requests 返回的 content 和 text 的區別?
黑 馬 程 序 員
resp.text 返回的是 Unicode 型的數據。
resp.content 返回的是 bytes 型也就是二進制的數據
若是想取文本,能夠經過 r.text。
若是想取圖片,文件,則能夠經過 r.content。
22. MySQLdb.connect 中
cursorclass=MySQLdb.cursors.DictCursor 參數用途?
cursorclass 是建立 cursor 對象的參數,執行查詢後每條記錄的結果以列表
形式表示。cursors 參數爲 MySQLdb.cursors.DictCursor 表示按字典形式返回
查詢記錄。
23. 用 conn.execute()執行 sql 返回什麼?
返回執行 SQL 語句後受影響的行數。
24. cursor.execute 查詢出結果後,有哪些方法能夠得到結果?
fetchone
fetchall
fetchmany 可指定返回個數 fetchmany(3)
25. 有一個已經排好序的數組 l = [0,10,20,30,40,50]。現輸入
一個數,要求按原來的規律將它插入數組中
l = [0,10,20,30,40,50]
cnt = len(l)
n = int(raw_input('Input a number:'))
l.append(n)
for i in range(cnt):
if n<l[i]:
for j in range(cnt,i,-1):
print cnt,i
l[j] = l[j-1]
l[i] = n
break
print 'The new sorted list is:',l
黑 馬 程 序 員
26. a=1,b=2,不用中間變量交換 a 和 b 的值?
a=a+b
b=a-b
a=a-b
27. 求輸出結果
def num():
return [lambda x:i*x for i in range(4)]
print [m(2) for m in num()]
[6, 6, 6, 6]
列表推導式保存了 4 個函數對象,調用函數的時候纔會對 i 賦值。i 保存的值
是 3
28. 去列表裏面最大值
import numpy
list=[1,3,5,7]
list.remove(numpy.max(list))
29. 什麼是隊列,什麼是棧
棧是一種特殊的線性表。其特殊性在於限定插入和刪除數據元素的操做只能在線
性表的一端進行。
特色:後進先出(Last In First Out),簡稱爲 LIFO 線性表。
棧的基本運算有六種:
構造空棧:InitStack(S)、
判棧空: StackEmpty(S)、
判棧滿: StackFull(S)、
進棧: Push(S,x)、可形象地理解爲壓入,這時棧中會多一個元素
退棧: Pop(S) 、 可形象地理解爲彈出,彈出後棧中就無此元素了。
取棧頂元素:StackTop(S),不一樣與彈出,只是使用棧頂元素的值,該元素仍在棧
頂不會改變。
隊列(Queue)也是一種運算受限的線性表,它的運算限制與棧不一樣,是兩頭都有
限制,插入只能在表的一端進行(只進不出),而刪除只能在表的另外一端進行(只
出不進),容許刪除的一端稱爲隊尾(rear),容許插入的一端稱爲隊頭 (Front)
,隊列的操做原則是先進先出的,因此隊列又稱做 FIFO 表(First In First Out)
黑 馬 程 序 員
隊列的基本運算也有六種:
置空隊 :InitQueue(Q)
判隊空: QueueEmpty(Q)
判隊滿: QueueFull(Q)
入隊 : EnQueue(Q,x)
出隊 : DeQueue(Q)
取隊頭元素: QueueFront(Q),不一樣與出隊,隊頭元素仍然保留。
30. 用兩個隊列如何實現一個棧,用兩個棧如何實現一個隊列
兩個棧實現一個隊列
棧的特性是先進後出(FILO),隊列的特性是先進先出(FIFO),在實現 delete
時,將一個棧中的數據依次拿出來壓入到另外一個爲空的棧,另外一個棧中數據的順
序剛好是先壓入棧 1 的元素此時在棧 2 的上面,爲了實現效率的提高,在 delete
時,判斷棧 2 是否有數據,若是有的話,直接刪除棧頂元素,在棧 2 爲空時纔將
棧 1 的數據壓入到棧 2 中,從而提升程序的運行效率,實現過程能夠分爲下面幾
個步驟:
一、push 操做時,一直將數據壓入到棧 2 中
二、delete 操做時,首先判斷棧 2 是否爲空,不爲空的狀況直接刪除棧 2 棧頂元
素,爲空的話將棧 1 的數據壓入到棧 2 中,再將棧 2 棧頂元素刪除。
兩個隊列實現一個棧
由於隊列是先進先出,因此要拿到隊列中最後壓入的數據,只能每次將隊列中數
據 pop 到只剩一個,此時這個數據爲最後壓入隊列的數據,在每次 pop 時,將數
據壓入到另外一個隊列中。每次執行 delete 操做時,循環往復。(感受效率低)
每次刪除時間複雜度 O(N)
31. Dir()方法
用 dir()函數能夠查看對像內全部屬性及方法python