- 利用切片操作,實(shí)現(xiàn)一個(gè)trim()函數(shù),去除字符串首尾的空格,注意不要調(diào)用str的strip()方法.
正解1:
def trim(s):
while s[:1] == ' ':
s = s[1:]
while s[-1:] == ' ':
s = s[:-1]
return s
正解2:
def trim(s):
if s[:1] == ' ':
s = trim(s[1:])
if s[-1:] == ' ':
s = trim(s[:-1])
return s
容易寫錯(cuò)的方法:
def trim(s):
while s[0] == ' ':
s = s[1:]
while s[-1] == ' ':
s = s[:-1]
return s
解釋:當(dāng)s=''時(shí),s[0]和s[-1]會(huì)報(bào)IndexError: string index out of range,但是s[:1])和s[-1:]不會(huì)。
- 請(qǐng)?jiān)O(shè)計(jì)一個(gè)decorator,它可作用于任何函數(shù)上,并打印該函數(shù)的執(zhí)行時(shí)間.
# -*- coding: utf-8 -*-
import time, functools
def metric(fn):
@functools.wraps(fn)
def wrapper(*args, **kw):
time0 = time.time()
ret = fn(*args, **kw)
time1 = time.time()
print('%s executed in %s ms' % (fn.__name__, time1-time0))
return ret
return wrapper
-
裝飾器的實(shí)質(zhì)是什么?或者說為什么裝飾器要寫2層嵌套函數(shù),里層函數(shù)完全就已經(jīng)實(shí)現(xiàn)了裝飾的功能為什么不直接用里層函數(shù)名作為裝飾器名稱?
答:裝飾器是要把原來的函數(shù)裝飾成新的函數(shù),并且返回這個(gè)函數(shù)本身的高階函數(shù)
-
python下多線程的限制以及多進(jìn)程中傳遞參數(shù)的方式
python多線程有個(gè)全局解釋器鎖(global interpreter lock),這個(gè)鎖的意思是任一時(shí)間只能有一個(gè)線程使用解釋器,跟單cpu跑多個(gè)程序一個(gè)意思,大家都是輪著用的,這叫“并發(fā)”,不是“并行”。
多進(jìn)程間共享數(shù)據(jù),可以使用 multiprocessing.Value 和 multiprocessing.Array
-
python多線程與多進(jìn)程的區(qū)別:
在UNIX平臺(tái)上,當(dāng)某個(gè)進(jìn)程終結(jié)之后,該進(jìn)程需要被其父進(jìn)程調(diào)用wait,否則進(jìn)程成為僵尸進(jìn)程(Zombie)。所以,有必要對(duì)每個(gè)Process對(duì)象調(diào)用join()方法 (實(shí)際上等同于wait)。對(duì)于多線程來說,由于只有一個(gè)進(jìn)程,所以不存在此必要性。
多進(jìn)程應(yīng)該避免共享資源。在多線程中,我們可以比較容易地共享資源,比如使用全局變量或者傳遞參數(shù)。在多進(jìn)程情況下,由于每個(gè)進(jìn)程有自己獨(dú)立的內(nèi)存空間,以上方法并不合適。此時(shí)我們可以通過共享內(nèi)存和Manager的方法來共享資源。但這樣做提高了程序的復(fù)雜度,并因?yàn)橥降男枰档土顺绦虻男省?/p>
請(qǐng)寫出一段Python代碼實(shí)現(xiàn)刪除一個(gè)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())
- 利用map()函數(shù),把用戶輸入的不規(guī)范的英文名字,變?yōu)槭鬃帜复髮?,其他小寫的?guī)范名字。輸入:['adam', 'LISA', 'barT'],輸出:['Adam', 'Lisa', 'Bart']:
def normalize(name):
return name[0].upper()+name[1:].lower()
def normalizeList(inputlist):
return list(map(normalize, inputlist))
Python是如何進(jìn)行內(nèi)存管理的?
http://developer.51cto.com/art/201007/213585.htm
Python引用了一個(gè)內(nèi)存池(memory pool)機(jī)制,即Pymalloc機(jī)制(malloc:n.分配內(nèi)存),用于管理對(duì)小塊內(nèi)存的申請(qǐng)和釋放
內(nèi)存池(memory pool)的概念:
當(dāng) 創(chuàng)建大量消耗小內(nèi)存的對(duì)象時(shí),頻繁調(diào)用new/malloc會(huì)導(dǎo)致大量的內(nèi)存碎片,致使效率降低。內(nèi)存池的概念就是預(yù)先在內(nèi)存中申請(qǐng)一定數(shù)量的,大小相等 的內(nèi)存塊留作備用,當(dāng)有新的內(nèi)存需求時(shí),就先從內(nèi)存池中分配內(nèi)存給這個(gè)需求,不夠了之后再申請(qǐng)新的內(nèi)存。這樣做最顯著的優(yōu)勢(shì)就是能夠減少內(nèi)存碎片,提升效率。
內(nèi)存池的實(shí)現(xiàn)方式有很多,性能和適用范圍也不一樣。
python中的內(nèi)存管理機(jī)制——Pymalloc:
python中的內(nèi)存管理機(jī)制都有兩套實(shí)現(xiàn),一套是針對(duì)小對(duì)象,就是大小小于256bits時(shí),pymalloc會(huì)在內(nèi)存池中申請(qǐng)內(nèi)存空間;當(dāng)大于256bits,則會(huì)直接執(zhí)行new/malloc的行為來申請(qǐng)內(nèi)存空間。
關(guān)于釋放內(nèi)存方面,當(dāng)一個(gè)對(duì)象的引用計(jì)數(shù)變?yōu)?時(shí),python就會(huì)調(diào)用它的析構(gòu)函數(shù)。在析構(gòu)時(shí),也采用了內(nèi)存池機(jī)制,從內(nèi)存池來的內(nèi)存會(huì)被歸還到內(nèi)存池中,以避免頻繁地釋放動(dòng)作。解釋一下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 為假時(shí),不會(huì)象C表達(dá)式 bool ? a : b 一樣工作
應(yīng)該將 and-or 技巧封裝成一個(gè)函數(shù):
def choose(bool, a, b):
return (bool and [a] or [b])[0]
因?yàn)?[a] 是一個(gè)非空列表,它永遠(yuǎn)不會(huì)為假。甚至 a 是 0 或 '' 或其它假值,列表[a]為真,因?yàn)樗幸粋€(gè)元素。
- 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]
<do something with x>
Python如何實(shí)現(xiàn)單例模式?其他23種設(shè)計(jì)模式python如何實(shí)現(xiàn)?
Python里面如何拷貝一個(gè)對(duì)象?
http://blog.csdn.net/sharkw/article/details/1934090
標(biāo)準(zhǔn)庫中的copy模塊提供了兩個(gè)方法來實(shí)現(xiàn)拷貝.一個(gè)方法是copy,它返回和參數(shù)包含內(nèi)容一樣的對(duì)象.
使用deepcopy方法,對(duì)象中的屬性也被復(fù)制Python里面search()和match()的區(qū)別?
match()函數(shù)只檢測(cè)RE是不是在string的開始位置匹配,search()會(huì)掃描整個(gè)string查找匹配, 也就是說match()只有在0位置匹配成功的話才有返回,如果不是開始位置匹配成功的話,match()就返回none-
有兩個(gè)序列a,b,大小都為n,序列元素的值任意整形數(shù),無序;
要求:通過交換a,b中的元素,使[序列a元素的和]與[序列b元素的和]之間的差最小。- 分別計(jì)算a,b序列的和;
- 求a序列和與b序列和的差值的一半,記為half;
- 在和值大的序列中找出一個(gè)與和值小的序列中的元素max的差值最接近half的元素,記為min;
- 將max與min互換即可。
描述元類的概念。Python有沒有接口?元類和Java的接口有什么異同?
python里無接口類型,定義接口類(抽象類)只是一個(gè)人為規(guī)定,在編程過程自我約束。
元類是類的模板,重在幫助創(chuàng)建類。接口是重在提供思路,后續(xù)進(jìn)行實(shí)現(xiàn)。