1. python多線程
(1)python下多線程的限制以及多進(jìn)程中傳遞參數(shù)的方式
python多線程有個全局解釋器鎖(global interpreter lock)涯捻,這個鎖的意思是任一時間只能有一個線程使用解釋器鳄炉,跟單cpu跑多個程序一個意思阐虚,大家都是輪著用的,這叫“并發(fā)”启摄,不是“并行”永脓。
多進(jìn)程間共享數(shù)據(jù),可以使用 multiprocessing.Value 和 multiprocessing.Array
(2)python多線程與多進(jìn)程的區(qū)別
在UNIX平臺上鞋仍,當(dāng)某個進(jìn)程終結(jié)之后常摧,該進(jìn)程需要被其父進(jìn)程調(diào)用wait,否則進(jìn)程成為僵尸進(jìn)程(Zombie)威创。所以落午,有必要對每個Process對象調(diào)用join()方法 (實際上等同于wait)。對于多線程來說肚豺,由于只有一個進(jìn)程溃斋,所以不存在此必要性。
多進(jìn)程應(yīng)該避免共享資源吸申。在多線程中梗劫,我們可以比較容易地共享資源,比如使用全局變量或者傳遞參數(shù)截碴。在多進(jìn)程情況下梳侨,由于每個進(jìn)程有自己獨立的內(nèi)存空間,以上方法并不合適日丹。此時我們可以通過共享內(nèi)存和Manager的方法來共享資源走哺。但這樣做提高了程序的復(fù)雜度,并因為同步的需要而降低了程序的效率哲虾。
2.Python是如何進(jìn)行內(nèi)存管理的丙躏?
Python引用了一個內(nèi)存池(memory pool)機制,即Pymalloc機制(malloc:n.分配內(nèi)存)束凑,用于管理對小塊內(nèi)存的申請和釋放
內(nèi)存池(memory pool)的概念:
當(dāng) 創(chuàng)建大量消耗小內(nèi)存的對象時晒旅,頻繁調(diào)用new/malloc會導(dǎo)致大量的內(nèi)存碎片,致使效率降低汪诉。內(nèi)存池的概念就是預(yù)先在內(nèi)存中申請一定數(shù)量的废恋,大小相等 的內(nèi)存塊留作備用,當(dāng)有新的內(nèi)存需求時摩瞎,就先從內(nèi)存池中分配內(nèi)存給這個需求拴签,不夠了之后再申請新的內(nèi)存。這樣做最顯著的優(yōu)勢就是能夠減少內(nèi)存碎片旗们,提升效率。
內(nèi)存池的實現(xiàn)方式有很多构灸,性能和適用范圍也不一樣上渴。
python中的內(nèi)存管理機制——Pymalloc:
python中的內(nèi)存管理機制都有兩套實現(xiàn)岸梨,一套是針對小對象,就是大小小于256bits時,pymalloc會在內(nèi)存池中申請內(nèi)存空間稠氮;當(dāng)大于256bits曹阔,則會直接執(zhí)行new/malloc的行為來申請內(nèi)存空間。
關(guān)于釋放內(nèi)存方面隔披,當(dāng)一個對象的引用計數(shù)變?yōu)?時赃份,python就會調(diào)用它的析構(gòu)函數(shù)。在析構(gòu)時奢米,也采用了內(nèi)存池機制抓韩,從內(nèi)存池來的內(nèi)存會被歸還到內(nèi)存池中,以避免頻繁地釋放動作鬓长。
3.什么是lambda函數(shù)谒拴?它有什么好處?
lambda 函數(shù)是一個可以接收任意多個參數(shù)(包括可選參數(shù))并且返回單個表達(dá)式值的函數(shù)。lambda 函數(shù)不能包含命令涉波,它們所包含的表達(dá)式不能超過一個英上。不要試圖向lambda 函數(shù)中塞入太多的東西;如果你需要更復(fù)雜的東西啤覆,應(yīng)該定義一個普通函數(shù)苍日,然后想讓它多長就多長。
4.如何用Python輸出一個Fibonacci數(shù)列窗声?
1 a,b = 0, 1
2 while b<100:
3? ? ?print (b),
4? ? ?a, b = b, a+b
5.介紹一下Python中webbrowser的用法易遣?
webbrowser模塊提供了一個高級接口來顯示基于Web的文檔,大部分情況下只需要簡單的調(diào)用open()方法嫌佑。
webbrowser定義了如下的異常:
exception webbrowser.Error, 當(dāng)瀏覽器控件發(fā)生錯誤是會拋出這個異常
webbrowser有以下方法:
webbrowser.open(url[, new=0[, autoraise=1]])
這個方法是在默認(rèn)的瀏覽器中顯示url, 如果new = 0, 那么url會在同一個瀏覽器窗口下打開豆茫,如果new = 1, 會打開一個新的窗口,如果new = 2, 會打開一個新的tab, 如果autoraise = true, 窗口會自動增長屋摇。
webbrowser.open_new(url)
在默認(rèn)瀏覽器中打開一個新的窗口來顯示url, 否則揩魂,在僅有的瀏覽器窗口中打開url
webbrowser.open_new_tab(url)
在默認(rèn)瀏覽器中當(dāng)開一個新的tab來顯示url, 否則跟open_new()一樣
webbrowser.get([name]) 根據(jù)name返回一個瀏覽器對象,如果name為空炮温,則返回默認(rèn)的瀏覽器
webbrowser.register(name, construtor[, instance])
注冊一個名字為name的瀏覽器火脉,如果這個瀏覽器類型被注冊就可以用get()方法來獲取。
6.解釋一下python的and-or語法
http://www.kuqin.com/diveinto_python_document/apihelper_andor.html
與C表達(dá)式 bool ? a : b類似柒啤,但是bool and a or b倦挂,當(dāng) a 為假時,不會象C表達(dá)式 bool ? a : b 一樣工作
應(yīng)該將 and-or 技巧封裝成一個函數(shù):
def choose(bool, a, b):
return (bool and [a] or [b])[0]
因為 [a] 是一個非空列表担巩,它永遠(yuǎn)不會為假方援。甚至 a 是 0 或 '' 或其它假值,列表[a]為真涛癌,因為它有一個元素犯戏。
7.how do I iterate over a sequence in reverse order
for x in reversed(sequence):
… # do something with x..
如果不是list, 最通用但是稍慢的解決方案是:
for i in range(len(sequence)-1, -1, -1):
x = sequence[i]
8.Python是如何進(jìn)行類型轉(zhuǎn)換的送火?
1 函數(shù)? ? ? ? ? ? ? ? ? ? ? 描述
2 int(x [,base ])? ? ? ? ? ?將x轉(zhuǎn)換為一個整數(shù)
3 long(x [,base ])? ? ? ? ?將x轉(zhuǎn)換為一個長整數(shù)
4 float(x )? ? ? ? ? ? ? ? ?將x轉(zhuǎn)換到一個浮點數(shù)
5 complex(real [,imag ])? 創(chuàng)建一個復(fù)數(shù)
6 str(x )? ? ? ? ? ? ? ? ? ?將對象 x 轉(zhuǎn)換為字符串
7 repr(x )? ? ? ? ? ? ? ? ? 將對象 x 轉(zhuǎn)換為表達(dá)式字符串
8 eval(str )? ? ? ? ? ? ? ?用來計算在字符串中的有效Python表達(dá)式,并返回一個對象
9 tuple(s )? ? ? ? ? ? ? ? ?將序列 s 轉(zhuǎn)換為一個元組
10 list(s )? ? ? ? ? ? ? ? ? 將序列 s 轉(zhuǎn)換為一個列表
11 chr(x )? ? ? ? ? ? ? ? ? 將一個整數(shù)轉(zhuǎn)換為一個字符
12 unichr(x )? ? ? ? ? ? ? ?將一個整數(shù)轉(zhuǎn)換為Unicode字符
13 ord(x )? ? ? ? ? ? ? ? ? 將一個字符轉(zhuǎn)換為它的整數(shù)值
14 hex(x )? ? ? ? ? ? ? ? ? 將一個整數(shù)轉(zhuǎn)換為一個十六進(jìn)制字符串
15 oct(x )? ? ? ? ? ? ? ? ? ?將一個整數(shù)轉(zhuǎn)換為一個八進(jìn)制字符串
9.Python里面如何實現(xiàn)tuple和list的轉(zhuǎn)換?
>>> l = tuple(iplist)
>>> print l
('217.169.209.2:6666', '192.227.139.106:7808', '110.4.12.170:83', '69.197.132.80:7808', '205.164.41.101:3128', '63.141.249.37:8089', '27.34.142.47:9090')
>>> t = list(l)
>>> print t
['217.169.209.2:6666', '192.227.139.106:7808', '110.4.12.170:83', '69.197.132.80:7808', '205.164.41.101:3128', '63.141.249.37:8089', '27.34.142.47:9090']
10.請寫出一段Python代碼實現(xiàn)刪除一個list里面的重復(fù)元素
>>> l = [1,1,2,3,4,5,4]
>>> list(set(l))
[1, 2, 3, 4, 5]
或者
d = {}
for x in mylist:
d[x] = 1
mylist = list(d.keys())
11.Python如何實現(xiàn)單例模式先匪?其他23種設(shè)計模式python如何實現(xiàn)种吸?
#使用__metaclass__(元類)的高級python用法
class Singleton2(type):
def __init__(cls, name, bases, dict):
super(Singleton2, cls).__init__(name, bases, dict)
cls._instance = None
def __call__(cls, *args, **kw):
if cls._instance is None:
cls._instance = super(Singleton2, cls).__call__(*args, **kw)
return cls._instance
class MyClass3(object):
__metaclass__ = Singleton2
one = MyClass3()
two = MyClass3()
two.a = 3
print one.a
#3
print id(one)
#31495472
print id(two)
#31495472
print one == two
#True
print one is two
#True
#使用裝飾器(decorator),
#這是一種更pythonic,更elegant的方法,
#單例類本身根本不知道自己是單例的,因為他本身(自己的代碼)并不是單例的
def singleton(cls, *args, **kw):
instances = {}
def _singleton():
if cls not in instances:
instances[cls] = cls(*args, **kw)
return instances[cls]
return _singleton
@singleton
class MyClass4(object):
a = 1
def __init__(self, x=0):
self.x = x
one = MyClass4()
two = MyClass4()
two.a = 3
print one.a
#3
print id(one)
#29660784
print id(two)
#29660784
print one == two
#True
print one is two
#True
one.x = 1
print one.x
#1
print two.x
#1
12.Python里面如何拷貝一個對象?
標(biāo)準(zhǔn)庫中的copy模塊提供了兩個方法來實現(xiàn)拷貝.一個方法是copy,它返回和參數(shù)包含內(nèi)容一樣的對象.
使用deepcopy方法,對象中的屬性也被復(fù)制
13.介紹一下except的用法和作用呀非?
Python的except用來捕獲所有異常坚俗,因為Python里面的每次錯誤都會拋出一個異常,所以每個程序的錯誤都被當(dāng)作一個運行時錯誤岸裙。
14.Python中pass語句的作用是什么猖败?
pass語句什么也不做,一般作為占位符或者創(chuàng)建占位程序哥桥,pass語句不會執(zhí)行任何操作
15.如何知道一個python對象的類型辙浑?
type()
16.介紹一下Python下range()函數(shù)的用法?
http://docs.python.org/library/functions.html#range
range(start, stop[, step])
17.如何用Python來進(jìn)行查詢和替換一個文本字符串拟糕?
可以使用sub()方法來進(jìn)行查詢和替換判呕,sub方法的格式為:sub(replacement, string[, count=0])
replacement是被替換成的文本
string是需要被替換的文本
count是一個可選參數(shù),指最大被替換的數(shù)量
18.Python里面search()和match()的區(qū)別送滞?
match()函數(shù)只檢測RE是不是在string的開始位置匹配侠草,search()會掃描整個string查找匹配, 也就是說match()只有在0位置匹配成功的話才有返回,如果不是開始位置匹配成功的話犁嗅,match()就返回none
19.用Python匹配HTML tag的時候边涕,<.>和<.?>有什么區(qū)別?
前者是貪婪匹配褂微,會從頭到尾匹配 xyz功蜓,而后者是非貪婪匹配,只匹配到第一個 >宠蚂。
20.Python里面如何生成隨機數(shù)式撼?
import random
random.random()
它會返回一個隨機的0和1之間的浮點數(shù)
21.如何用Python來發(fā)送郵件?
python實現(xiàn)發(fā)送和接收郵件功能主要用到poplib和smtplib模塊求厕。
poplib用于接收郵件著隆,而smtplib負(fù)責(zé)發(fā)送郵件。
代碼如下:
#! /usr/bin/env python
#coding=utf-8
import sys
import time
import poplib
import smtplib
#郵件發(fā)送函數(shù)
def send_mail():
try:
handle = smtplib.SMTP('smtp.126.com',25)
handle.login('XXXX@126.com','**********')
msg = 'To:?XXXX@qq.com\r\nFrom:XXXX@126.com\r\nSubject:hello\r\n'
handle.sendmail('XXXX@126.com','XXXX@qq.com',msg)
handle.close()
return 1
except:
return 0
#郵件接收函數(shù)
def accpet_mail():
try:
p=poplib.POP3('pop.126.com')
p.user('pythontab@126.com')
p.pass_('**********')
ret = p.stat() #返回一個元組:(郵件數(shù),郵件尺寸)
#p.retr('郵件號碼')方法返回一個元組:(狀態(tài)信息,郵件,郵件尺寸)
except poplib.error_proto,e:
print "Login failed:",e
sys.exit(1)
#運行當(dāng)前文件時呀癣,執(zhí)行sendmail和accpet_mail函數(shù)
if __name__ == "__main__":
send_mail()
accpet_mail()
22.Python如何定義一個函數(shù)?
定義函數(shù)的格式是: def functionName(arg):
23.有沒有一個工具可以幫助查找python的bug和進(jìn)行靜態(tài)的代碼分析美浦?
pycheck pylint
24.如何在一個function里面設(shè)置一個全局的變量?
global
25.有兩個序列a,b项栏,大小都為n,序列元素的值任意整形數(shù)浦辨,無序;
要求:通過交換a,b中的元素忘嫉,使[序列a元素的和]與[序列b元素的和]之間的差最小荤牍。
分別計算a,b序列的和案腺;
求a序列和與b序列和的差值的一半庆冕,記為half康吵;
在和值大的序列中找出一個與和值小的序列中的元素max的差值最接近half的元素,記為min访递;
將max與min互換即可晦嵌。
26.如何用Python刪除一個文件?
使用os.remove(filename)或者os.unlink(filename);
27.Python如何copy一個文件拷姿?
shutil模塊有一個copyfile函數(shù)可以實現(xiàn)文件拷貝
28.python程序中文輸出問題怎么解決惭载?
方法一:用encode和decode
如:
import os.path
import xlrd,sys
Filename=’/home/tom/Desktop/1234.xls’
if not os.path.isfile(Filename):
raise NameError,”%s is not a valid filename”%Filename
bk=xlrd.open_workbook(Filename)
shxrange=range(bk.nsheets)
print shxrange
for x in shxrange:
p=bk.sheets()[x].name.encode(‘utf-8′)
print p.decode(‘utf-8′)
方法二:
在文件開頭加上
1 reload(sys)
2 sys.setdefaultencoding(‘utf8′)
29.python代碼得到列表list的交集與差集
交集
1 b1=[1,2,3]
2 b2=[2,3,4]
3 b3 = [val for val in b1 if val in b2]
4 print b3
差集
1 b1=[1,2,3]
2 b2=[2,3,4]
3 b3 = [val for val in b1 if val not in b2]
4 print b3
30.寫一個簡單的python socket編程
python 編寫server的步驟:
1.第一步是創(chuàng)建socket對象。調(diào)用socket構(gòu)造函數(shù)响巢。如:
socket = socket.socket( family, type )
family參數(shù)代表地址家族描滔,可為AF_INET或AF_UNIX。AF_INET家族包括Internet地址踪古,AF_UNIX家族用于同一臺機器上的進(jìn)程間通信含长。
type參數(shù)代表套接字類型,可為SOCK_STREAM(流套接字)和SOCK_DGRAM(數(shù)據(jù)報套接字)伏穆。
2.第二步是將socket綁定到指定地址拘泞。這是通過socket對象的bind方法來實現(xiàn)的:
socket.bind( address )
由AF_INET所創(chuàng)建的套接字,address地址必須是一個雙元素元組枕扫,格式是(host,port)陪腌。host代表主機,port代表端口號。如果端口號正在使用伞辛、主機名不正確或端口已被保留弓坞,bind方法將引發(fā)socket.error異常。
3.第三步是使用socket套接字的listen方法接收連接請求强岸。
socket.listen( backlog )
backlog指定最多允許多少個客戶連接到服務(wù)器。它的值至少為1卵洗。收到連接請求后请唱,這些請求需要排隊,如果隊列滿过蹂,就拒絕請求十绑。
4.第四步是服務(wù)器套接字通過socket的accept方法等待客戶請求一個連接。
connection, address = socket.accept()
調(diào)用accept方法時酷勺,socket會進(jìn)入“waiting”狀態(tài)本橙。客戶請求連接時脆诉,方法建立連接并返回服務(wù)器甚亭。accept方法返回一個含有兩個元素的元組(connection,address)贷币。第一個元素connection是新的socket對象,服務(wù)器必須通過它與客戶通信亏狰;第二個元素 address是客戶的Internet地址役纹。
5.第五步是處理階段,服務(wù)器和客戶端通過send和recv方法通信(傳輸 數(shù)據(jù))暇唾。服務(wù)器調(diào)用send促脉,并采用字符串形式向客戶發(fā)送信息。send方法返回已發(fā)送的字符個數(shù)策州。服務(wù)器使用recv方法從客戶接收信息瘸味。調(diào)用recv 時,服務(wù)器必須指定一個整數(shù)够挂,它對應(yīng)于可通過本次方法調(diào)用來接收的最大數(shù)據(jù)量旁仿。recv方法在接收數(shù)據(jù)時會進(jìn)入“blocked”狀態(tài),最后返回一個字符 串孽糖,用它表示收到的數(shù)據(jù)枯冈。如果發(fā)送的數(shù)據(jù)量超過了recv所允許的,數(shù)據(jù)會被截短梭姓。多余的數(shù)據(jù)將緩沖于接收端霜幼。以后調(diào)用recv時,多余的數(shù)據(jù)會從緩沖區(qū) 刪除(以及自上次調(diào)用recv以來誉尖,客戶可能發(fā)送的其它任何數(shù)據(jù))罪既。
6.傳輸結(jié)束,服務(wù)器調(diào)用socket的close方法關(guān)閉連接铡恕。
python編寫client的步驟:
創(chuàng)建一個socket以連接服務(wù)器:socket = socket.socket( family, type )
2.使用socket的connect方法連接服務(wù)器琢感。對于AF_INET家族,連接格式如下:
socket.connect( (host,port) )
host代表服務(wù)器主機名或IP,port代表服務(wù)器進(jìn)程所綁定的端口號探熔。如連接成功驹针,客戶就可通過套接字與服務(wù)器通信,如果連接失敗诀艰,會引發(fā)socket.error異常柬甥。
處理階段,客戶和服務(wù)器將通過send方法和recv方法通信其垄。
傳輸結(jié)束苛蒲,客戶通過調(diào)用socket的close方法關(guān)閉連接。
下面給個簡單的例子:
server.py
#coding:utf-8
import socket
if __name__ == '__main__':
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('localhost', 8001))
sock.listen(5)
while True:
connection,address = sock.accept()
try:
connection.settimeout(5)
buf = connection.recv(1024)
if buf == '1':
connection.send('welcome to server!')
else:
connection.send('please go out!')
except socket.timeout:
print 'time out'
connection.close()
client.py
#coding:utf-8
import socket
import time
if __name__ == '__main__':
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(('localhost', 8001))
time.sleep(2)
sock.send('1')
print sock.recv(1024)
sock.close()
在終端運行server.py绿满,然后運行clien.py臂外,會在終端打印“welcome to server!"。
31.python如何捕獲異常
(1)使用try和except語句來捕獲異常
try:
block
except [exception,[data…]]:
block
try:
block
except [exception,[data...]]:
block
else:
block
捕獲到的IOError錯誤的詳細(xì)原因會被放置在對象e中,然后運行該python 異常處理的except代碼塊捕獲所有的異常
(2)用raise語句手工引發(fā)一個異常:
raise [exception[,data]]
try:
raise MyError #自己拋出一個異常
except MyError:
print 'a error'
raise ValueError,’invalid argument’
(3)采用sys模塊回溯最后的異常
import sys
try:
block
except:
info=sys.exc_info()
print info[0],":",info[1]
32.src = "security/afafsff/?ip=123.4.56.78&id=45",請寫一段代碼用正則匹配出ip
匹配ip地址的python正則表達(dá)式
pattern =
'^([01]?\d\d?|2[0-4]\d|25[0-5]).([01]?\d\d?|2[0-4]\d|25[0-5]).([01]?\d\d?|2[0-4]\d|25[0-5]).([01]?\d\d?|2[0-4]\d|25[0-5])$'
故本題答案
>>> re.findall(r'([01]?\d\d?|2[0-4]\d|25[0-5]).([01]?\d\d?|2[0-4]\d|25[0-5]).([01]?\d\d?|2[0-4]\d|25[0-5]).([01]?\d\d?|2[0-4]\d|25[0-5])', src)
[('123', '4', '56', '78')]
33.寫一段代碼用json數(shù)據(jù)的處理方式獲取{"persons":[{"name":"yu","age":"23"},{"name":"zhang","age":"34"}]}這一段json中第一個人的名字漏健。
json讀取
>>> import json
>>> j = json.loads('{"persons":[{"name":"yu","age":"23"},{"name":"zhang","age":"34"}]}')
>>> print j
{u'persons': [{u'age': u'23', u'name': u'yu'}, {u'age': u'34', u'name': u'zhang'}]}
>>> print j.keys()
[u'persons']
>>> print j.values()
[[{u'age': u'23', u'name': u'yu'}, {u'age': u'34', u'name': u'zhang'}]]
>>> print j.values()[0]
[{u'age': u'23', u'name': u'yu'}, {u'age': u'34', u'name': u'zhang'}]
>>> print j.values()[0][0]
{u'age': u'23', u'name': u'yu'}
>>> print j.values()[0][0]['name']
yu
34.平衡點問題
平衡點:比如int[] numbers = {1,3,5,7,8,25,4,20}; 25前面的總和為24嚎货,25后面的總和也是24,25這個點就是平衡點蔫浆;假如一個數(shù)組中的元素殖属,其前面的部分等于后面的部分,那么這個點的位序就是平衡點
要求:返回任何一個平衡點
使用sum函數(shù)累加所有的數(shù)克懊。
使用一個變量fore來累加序列的前部忱辅。直到滿足條件fore<(total-number)/2;
python代碼如下:
numbers = [1,3,5,7,8,2,4,20]
#find total
total=sum(numbers)
#find num
fore=0
for number in numbers:
if fore<(total-number)/2 :
fore+=number
else:
break
#print answer
if fore == (total-number)/2 :
print number
else :
print r'not found'
算法簡單七蜘,而且是O(n)的谭溉,12行代碼搞定。參考:http://blog.renren.com/share/235087438/3004327956
35.支配點問題:
支配數(shù):數(shù)組中某個元素出現(xiàn)的次數(shù)大于數(shù)組總數(shù)的一半時就成為支配數(shù)橡卤,其所在位序成為支配點扮念;比如int[] a = {3,3,1,2,3};3為支配數(shù),0碧库,1柜与,4分別為支配點;
要求:返回任何一個支配點
li = [3,3,1,2,3]
def main():
mid = len(li)/2
for l in li:
count = 0
i = 0
mark = 0
while True:
if l == li[i]:
count += 1
temp = i
i += 1
if count > mid:
mark = temp
return (mark,li[mark])
if i > len(li) - 1:
break
if __name__ == "__main__":
print? main()
36.什么是PEP 8
參考:http://www.python.org/dev/peps/pep-0008/
37.Python2.x和Python3.x的區(qū)別
從Python2到Python3嵌灰,很多基本的函數(shù)接口變了弄匕,甚至是,有些庫或函數(shù)被去掉了沽瞭,改名了迁匠。