python tips(5)

iteye_21202發表於2013-05-15

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]不可能為假,至少有一個元素
>>> 
first
second
second

>>> 
另外一個例子。
collapse = True # False
processFunc = collapse and (lambda s:" ".join(s.split())) or (lambda s:s)

此處無問題,因為一個lambda函式在一個布林環境下總為真。(這並不意味著lambda函式不能返回假值,函式本身總是為真,它的返回值可以為任何值)。

test = lambda x, y, z = 2:x*y*z
print test(2, 3, 4)
print test(2, 3)
>>> 
24
12
>>> 

注意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 seq

print del_Redundant([1, 2, 3, 4, 1, 5, 2, 6, 1])
>>> 
[3, 4, 5, 2, 6, 1]
>>> 


7. python裡面如何拷貝一個物件:

在python中,無論把物件作為引數傳遞,作為函式返回值,都是引用傳遞的。

標準庫中的copy模組提供了兩個方法來實現拷貝,一個方法是copy,它返回和引數包含內容一樣的物件。

import copy
new_list = copy.copy(existing_list)

以上為淺拷貝,若希望物件中的屬性也被複制,可以使用deepcopy方法。

import copy
new_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 t
True
>>> 

注意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 b
False
>>> a == b
True
>>> id(a)
27047920
>>> id(b)
27080240
>>> a = 1
>>> b = 1
>>> a is b
True
>>> a == b
True
>>> id(a)
27047920
>>> id(b)
27047920
>>> #dictionary
>>> a = {'m':1, 'n':2}
>>> b = dict(a)
>>> a is b
False
>>> a == b
True
>>> #list
>>> a = [1, 2, 3]
>>> b = list(a)
>>> a is b
False
>>> a == b
True
>>> #tuple
>>> a = (1, 2, 3)
>>> b = tuple(a)
>>> a is b
True
>>> a == b
True
>>> 


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 = str

try:
    raise myException("error...")
except myException, e:
    print e.value
finally:
    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) >= 1

Traceback (most recent call last):
  File "<pyshell#52>", line 1, in <module>
    assert len(my_list) >= 1
AssertionError
>>> 


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 x
def b():
    global x
    x = 4
    print x

x = 3
print x
a()
print x
b()
print x
>>> 
3
2
3
4
4
>>> 

1)global variable全域性變數:
在程式檔案中任何地方都可以引用,包括函式和類的內部,但是如果在函式和類中對全域性變數賦值,必須在該函式或者類中宣告該變數為全域性變數,否則經過賦值操作後,變數為本地變數。

2)local variable本地變數:

通常是在函式或者類的方法中直接使用,在該函式或者類方法之外,不能引用該變數。

14. python中生成隨機數:

import random
random.random() #[0.0, 1.0)中一個浮點數
random.randint(start, stop) #[start, stop]中一個整數
random.randrange(start, stop) #[start, stop)中一個整數


15. 正規表示式通常用於在文字中查詢匹配的字串。

使用正規表示式進行匹配的流程:

首先由正規表示式引擎編譯正規表示式文字,生成正規表示式物件(包含應如何進行匹配的資訊),然後將正規表示式物件與需要匹配的文字進行匹配得到匹配結果(包含了這次成功匹配的資訊,如匹配到的字串、分組以及在文字中的索引)。

16. 用python來查詢和替換一個文字字串。

import re
pattern = 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 shoes
haha 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 re
print 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 re
s = 'abc'
print re.match('.*', s).group()
print re.match('.*?', s).group()
print re.match('a.*', s).group()
print re.match('a.*?', s).group()
>>> 
abc

abc
a
>>> 


19. python中如何傳送郵件?

可以使用smtplib標準庫。

編寫的程式碼可在支援SMTP監聽器的伺服器上執行。

20. 有沒有一個工具可以幫助查詢python的bug和進行靜態的程式碼分析?

1)有,PyChecker是一個python程式碼的靜態分析工具,它可以幫助查詢python程式碼的bug,會對程式碼的複雜度和格式提出警告。

2)Pylint是另外一個工具,可以進行coding standard檢查。

21. python是如何進行記憶體管理的?

python的記憶體管理是由python的直譯器負責的,開發人員可以從記憶體管理器事務中解放出來,致力於應用程式的開發,這樣就使得開發的程式錯誤更少,程式更健壯,開發週期更短。