1. list 序列,sample_list = [1, 2, 3, 'abc']
dictionary 字典,sample_dic = {"key" = value, 2:3}
tuple 唯讀序列,sample_tuple = (1, 3, "ab")
序表:序表由一系列值用逗號分隔而成,序表與字串一樣是不可變的,不允許對序表的某一項賦值。
字典:關聯陣列。
與字串不同的是列表是可變的,可以修改列表的每個元素。可以建立嵌套列表(表的元素也是列表)。
2. 內建函數:
filter(),filter(函數,序列)返回一個序列(儘可能與原來同類型),序列元素時原序列中由指定的函數篩選出來的那些,篩選規則是“函數(序列元素)=true”,filter()可以用來取出滿足條件的子集。
map(),map(函數,序列)對指定序列的每一項調用指定的函數,結果為傳回值組成的列表,map()可以對序列進行隱式迴圈。
reduce(),reduce(函數,序列)用來進行類似累加這樣的操作,這裡的函數式一個兩個子變數的函數,reduce()先對序列的前兩項調用函數得到一個結果,然後對結果和序列的下一項調用函數得到一個新結果,如此進行到序列尾部。
3. python中的and從左至右計算運算式,若所有值均為真,則返回最後一個值,若存在假,返回第一個假值。
or也是從左至右計算運算式,返回第一個為真的值。
>>> 'a' and 'b''b'>>> '' and 'b'''>>> 'a' or 'b''a'>>> '' or 'b''b'
另外有類似三目運算式的用法:bool?a:b
a = 'first'b = 'second'print 1 and a or b #等價於bool = true時的情況print 0 and a or b #等價於bool = false時的情況a = ''print 1 and a or b #a為假時,出現問題print (1 and [a] or [b])[0] #安全用法,因為[a]不可能為假,至少有一個元素>>> firstsecondsecond>>>
另外一個例子。
collapse = True # FalseprocessFunc = collapse and (lambda s:" ".join(s.split())) or (lambda s:s)
此處無問題,因為一個lambda函數在一個布爾環境下總為真。(這並不意味著lambda函數不能返回假值,函數本身總是為真,它的傳回值可以為任何值)。
test = lambda x, y, z = 2:x*y*zprint test(2, 3, 4)print test(2, 3)>>> 2412>>>
注意lambda選擇性參數,lambda函數只是一個內嵌函式。
4. 序列逆序可以使用reverse()。
5. python中如何?tuple和list的轉換?
1)函數tuple(seq)可以把所有可迭代的(iterable)序列轉換成一個tuple,元素不變,排序也不變。
e.g. tuple([1, 2, 3])返回(1, 2, 3)
tuple('abc')返回('a', 'b', 'c')
如果參數已經是一個tuple的話,函數不做任何拷貝而直接返回原來的對象,所以在不確定對象是不是tuple的時候來調用tuple()函數也不是很耗費的。
2)函數list(seq)可以把所有的序列和可迭代的對象轉換成一個list,元素不變,排序也不變。
例如list([1, 2, 3])返回(1, 2, 3),list('abc')返回['a', 'b', 'c'],如果參數是一個list,它會像set[:]一樣做一個拷貝。
6. 請寫出一段python代碼實現刪除一個List裡面的重複元素。
def del_Redundant(seq): for item in seq: if seq.count(item) > 1: del seq[seq.index(item)] return seqprint del_Redundant([1, 2, 3, 4, 1, 5, 2, 6, 1])>>> [3, 4, 5, 2, 6, 1]>>>
7. python裡面如何拷貝一個對象:
在python中,無論把對象作為參數傳遞,作為函數傳回值,都是引用傳遞的。
標準庫中的copy模組提供了兩個方法來實現拷貝,一個方法是copy,它返回和參數包含內容一樣的對象。
import copynew_list = copy.copy(existing_list)
以上為淺拷貝,若希望對象中的屬性也被複製,可以使用deepcopy方法。
import copynew_list_of_dics = copy.deepcopy(existing_list_of_dicts)
copy.copy可以進行shallow copy,對於對象中的元素,依然使用引用。
淺複製,有時不能獲得一個和原來對象完全一致的副本,如果你想修改對象中的元素,不僅僅是對象本身的話。
>>> [3, 4, 5, 2, 6, 1]>>> import copy>>> list_of_lists = [['a'], [1, 2], ['z', 23]]>>> copy_lol = copy.copy(list_of_lists)>>> copy_lol[1].append('boo')>>> print list_of_lists, copy_lol[['a'], [1, 2, 'boo'], ['z', 23]] [['a'], [1, 2, 'boo'], ['z', 23]]>>> a = [1, 2, 3]>>> b = a>>> b.append(5)>>> print a, b[1, 2, 3, 5] [1, 2, 3, 5]>>> s = 'cat'>>> t = copy.copy(s)>>> s is tTrue>>>
注意t = copy.copy(s)這一句不可修改對象(string,數字,元組),用複製依然會得到原來的。
is操作符用於判斷兩個對象是否完全一致,而且是同一個對象。
python中的對象包含三要素:id, type, value。
其中id用來唯一標識一個對象,type標識對象的類型,value是對象的值。
is判斷的是a對象是否就是b對象,是通過id判斷的。
==判斷的是a對象的值是否和b對象的值相等,是通過value來判斷的,參照如下代碼。
>>> a = 1>>> b = 1.0>>> a is bFalse>>> a == bTrue>>> id(a)27047920>>> id(b)27080240>>> a = 1>>> b = 1>>> a is bTrue>>> a == bTrue>>> id(a)27047920>>> id(b)27047920>>> #dictionary>>> a = {'m':1, 'n':2}>>> b = dict(a)>>> a is bFalse>>> a == bTrue>>> #list>>> a = [1, 2, 3]>>> b = list(a)>>> a is bFalse>>> a == bTrue>>> #tuple>>> a = (1, 2, 3)>>> b = tuple(a)>>> a is bTrue>>> a == bTrue>>>
8. python中pass語句的作用:
1)pass語句什麼也不做,一般作為預留位置或者建立佔位程式,pass語句不會執行任何操作。
while False: pass
2)pass語句通常用來建立一個最簡單的類。
class MyEmptyClass: pass
3)pass在軟體設計階段也經常用來作為TODO,提醒實現相應的功能。
def initlog(): pass # please implement this
9. python異常處理。
class myException(Exception): def __init__(self, str): Exception.__init__(self, str) self.value = strtry: raise myException("error...")except myException, e: print e.valuefinally: print "pass">>> error...pass>>>
try: raise Exception, "hello world"except Exception, e: print e>>> hello world>>>
10. python assert用法:
1)assert語句用來聲明某個條件是真的
2)如果非常確信某個使用的列表中至少有一個元素,且想要檢驗這一點,並且在它非真的時候引發一個錯誤,則較適合用assert語句。
3)當assert語句失敗的時候,會引發一個Assertion Error。
>>> my_list = ['item']>>> assert len(my_list) >= 1>>> my_list.pop()'item'>>> assert len(my_list) >= 1Traceback (most recent call last): File "<pyshell#52>", line 1, in <module> assert len(my_list) >= 1AssertionError>>>
11. 知道一個python對象的類型用type(x)。
12. python中range的用法。
1)range(stop)
2)range(start, stop[, step])
>>> range(10)[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]>>> range(1, 11)[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]>>> range(0, 30, 5)[0, 5, 10, 15, 20, 25]>>> range(0, 10, 3)[0, 3, 6, 9]>>> range(0, -10, -1)[0, -1, -2, -3, -4, -5, -6, -7, -8, -9]>>> range(0)[]>>> range(1, 0)[]>>>
13. python全域變數:
def a(): x = 2 print xdef b(): global x x = 4 print xx = 3print xa()print xb()print x>>> 32344>>>
1)global variable全域變數:
在程式檔案中任何地方都可以引用,包括函數和類的內部,但是如果在函數和類中對全域變數賦值,必須在該函數或者類中聲明該變數為全域變數,否則經過賦值操作後,變數為本地變數。
2)local variable本地變數:
通常是在函數或者類的方法中直接使用,在該函數或者類方法之外,不能引用該變數。
14. python中產生隨機數:
import randomrandom.random() #[0.0, 1.0)中一個浮點數random.randint(start, stop) #[start, stop]中一個整數random.randrange(start, stop) #[start, stop)中一個整數
15. Regex通常用於在文本中尋找匹配的字串。
使用Regex進行匹配的流程:
首先由Regex引擎編譯Regex文本,產生Regex對象(包含應如何進行匹配的資訊),然後將Regex對象與需要匹配的文本進行匹配得到匹配結果(包含了這次成功匹配的資訊,如匹配到的字串、分組以及在文本中的索引)。
16. 用python來查詢和替換一個文本字串。
import repattern = re.compile('blue|white|red')print pattern.sub('haha', 'blue socks and red shoes')print pattern.sub('haha', 'blue socks and red shoes', 1)print pattern.subn('haha', 'blue socks and red shoes')print pattern.subn('haha', 'blue socks and red shoes', 1)>>> haha socks and haha shoeshaha socks and red shoes('haha socks and haha shoes', 2)('haha socks and red shoes', 1)>>>
17. python裡search()和match()的區別。
1)match()函數只檢測Re是不是在string的開始位置匹配,search()會掃描整個string尋找匹配,也就是說match()只有在0位置匹配成功的話才有返回,如果不是開始位置匹配成功的話,match()就返回None。
2)search()會掃描整個字串並返回第一個成功的匹配。
import reprint re.match('super', 'superstition').span()print re.match('super', 'superstition')print re.match('super', 'insuperable')print re.search('super', 'superstition').span()print re.search('super', 'superstition')print re.search('super', 'insuperable').span()print re.search('super', 'insuperable')>>> (0, 5)<_sre.SRE_Match object at 0x015E1D40>None(0, 5)<_sre.SRE_Match object at 0x015E1D40>(2, 7)<_sre.SRE_Match object at 0x015E1D40>>>>
18. python匹配HTML Tag時,<.*>和<.*?>有什麼區別?
1)<.*>為貪心匹配
2)<.*?>為非貪心匹配
import res = 'abc'print re.match('.*', s).group()print re.match('.*?', s).group()print re.match('a.*', s).group()print re.match('a.*?', s).group()>>> abcabca>>>
19. python中如何發送郵件?
可以使用smtplib標準庫。
編寫的代碼可在支援SMTP監聽器的伺服器上執行。
20. 有沒有一個工具可以協助尋找python的bug和進行靜態程式碼分析?
1)有,PyChecker是一個python代碼的靜態分析工具,它可以協助尋找python代碼的bug,會對代碼的複雜度和格式提出警告。
2)Pylint是另外一個工具,可以進行coding standard檢查。
21. python是如何進行記憶體管理的?
python的記憶體管理是由python的解譯器負責的,開發人員可以從記憶體管理器事務中解放出來,致力於應用程式的開發,這樣就使得開發的程式錯誤更少,程式更健壯,開發週期更短。