pythonic 簡潔、靈活、可讀性強
#交換兩個變量值
a,b = b,a
#去掉list中的重複元素
old_list = [1,1,1,3,4]
new_list = list(set(old_list))
#翻轉一個字元串
s = 'abcde'
ss = s[::-1]
#用兩個元素之間有對應關系的list構造一個dict
names = ['jianpx', 'yue']
ages = [23, 40]
m = dict(zip(names,ages))
#将數量較多的字元串相連,如何效率較高,為什麼
fruits = ['apple', 'banana']
result = ''.join(fruits)
#python字元串效率問題之一就是在連接配接字元串的時候使用‘+’号,例如 s = ‘s1’ + ‘s2’ + ‘s3’ + ...+’sN’,總共将N個字元串連接配接起來, 但是使用+号的話,python需要申請N-1次記憶體空間, 然後進行字元串拷貝。原因是字元串對象PyStringObject在python當中是不可變 對象,是以每當需要合并兩個字元串的時候,就要重新申請一個新的記憶體空間 (大小為兩個字元串長度之和)來給這個合并之後的新字元串,然後進行拷貝。 是以用+号效率非常低。建議在連接配接字元串的時候使用字元串本身的方法 join(list),這個方法能提高效率,原因是它隻是申請了一次記憶體空間, 因為它可以周遊list中的元素計算出總共需要申請的記憶體空間的大小,一次申請完。
python調試工具
PyChecker是一個python代碼的靜态分析工具,它可以幫助查找python代碼的bug, 會對代碼的複雜度和格式提出警告
Pylint 是另外一個工具可以進行coding standard檢查。
GIL
什麼是GIL(Global Interpreter Lock)全局解釋器鎖? 簡單地說就是:
每一個interpreter程序,隻能同時僅有一個線程來執行, 獲得相關的鎖, 存取相關的資源.
那麼很容易就會發現,如果一個interpreter程序隻能有一個線程來執行,
多線程的并發則成為不可能, 即使這幾個線程之間不存在資源的競争.
從理論上講,我們要盡可能地使程式更加并行, 能夠充分利用多核的功能.
dict中的items和iteritems
>>> D = {'a':1,'b':2,'c':3,'d':4}
>>> D.items() #一次性取出所有
[('a', 1), ('c', 3), ('b', 2), ('d', 4)]
>>> D.iteritems() #疊代對象,每次取出一個。用for循環周遊出來;
>>> for i in D.iteritems():
print i,
('a', 1) ('c', 3) ('b', 2) ('d', 4)
>>> for k,v in D.iteritems():
print k,
a c b d
總結:
1.一般iteritems()疊代的辦法比items()要快,特别是資料庫比較大時。
2.在Python3中一般取消前者函數
with statements
>>> with open('text.txt') as myfile:
while True:
line = myfile.readline()
if not line:
break
print line,
with語句使用所謂的上下文管理器對代碼塊進行包裝,允許上下文管理器實作一些設定和清理操作。
例如:檔案可以作為上下文管理器使用,它們可以關閉自身作為清理的一部分。
NOTE:在PYTHON2.5中,需要使用from __future__ import with_statement進行with語句的導入
python生成制定長度的斐波那契數列
def fibs(x):
result = [0, 1]
for index in range(x-2):
result.append(result[-2]+result[-1])
return result
if __name__=='__main__':
num = input('Enter one number: ')
print fibs(num)
python生成随機數
>>> import random
>>> random.random()
0.29495314937268713
>>> random.randint(1,11)
8
>>> random.choice(range(11))
3
反序疊代一個序列
如果是一個list, 最快的解決方案是:
list.reverse()
try:
for x in list:
“do something with x”
finally:
list.reverse()
如果不是list, 最通用但是稍慢的解決方案是:
for i in range(len(sequence)-1, -1, -1):
x = sequence[i]
如何定義一個函數
def func(arg, *args, **kwagrs): #普通函數
func_body
return
lambda x: x **2 #匿名函數
<.*?> 和<.*>在正則比對中的含義
import re
s = ‘
Title’
print(re.match(‘<.*>’, s).group())
會傳回一個比對
Title而不是
而
import re
s = ‘
Title’
print(re.match(‘<.*?>’, s).group())
則會傳回
<.*>這種比對稱作貪心比對 <.*?>稱作非貪心比對
search與match的差別
>>> import re
>>> re.match(r'python','Programing Python, should be pythonic')
>>> obj1 = re.match(r'python','Programing Python, should be pythonic') #傳回None
>>> obj2 = re.search(r'python','Programing Python, should be pythonic') #找到pythonic
>>> obj2.group()
'python'
#re.match隻比對字元串的開始,如果字元串開始不符合正規表達式,則比對失敗,函數傳回None;
#re.search比對整個字元串,直到找到一個比對。
中文亂碼問題
在Python3中,對中文進行了全面的支援,但在Python2.x中需要進行相關的設定才能使用中文。否則會出現亂碼。
Python預設采取的ASCII編碼,字母、标點和其他字元隻使用一個位元組來表示,但對于中文字元來說,一個位元組滿足不了需求。
為了能在計算機中表示所有的中文字元,中文編碼采用兩個位元組表示。如果中文編碼和ASCII混合使用的話,就會導緻解碼錯誤,進而才生亂碼。
解決辦法:
互動式指令中:一般不會出現亂碼,無需做處理
py腳本檔案中:跨字元集必須做設定,否則亂碼
首先在開頭一句添加:
# coding = utf-8
# 或
# coding = UTF-8
# 或
# -*- coding: utf-8 -*-
其次需将檔案儲存為UTF-8的格式!
最後: s.decode('utf-8').encode('gbk')
lambda函數,本執行個體實作了求素數
函數使用:
代碼塊重複,這時候必須考慮到函數,降低程式的備援度
代碼塊複雜,這時候必須考慮到函數,降低程式的複雜度
Python有兩種函數,一種是def定義,一種是lambda函數()
當程式代碼很短,且該函數隻使用一次,為了程式的簡潔,及節省變量記憶體占用空間,引入了匿名函數這個概念
>>> nums = range(2,20)
>>> for i in nums:
nums = filter(lambda x:x==i or x % i,nums)
>>> nums
[2, 3, 5, 7, 11, 13, 17, 19]
list和tuple之間的轉換
#From list to Tuple
tuple(a_list)
#From Tuple to List
def to_list(t):
return [i if not isinstance(i,tuple) else to_list(i) for i in t]
删除list中的重複元素
>>> L1 = [4,1,3,2,3,5,1]
>>> L2 = []
>>> [L2.append(i) for i in L1 if i not in L2]
>>> print L2
[4, 1, 3, 2, 5]
python中的類型轉換
>>> int('1234') # 将數字型字元串轉為整形
1234
>>> float(12) # 将整形或數字字元轉為浮點型
12.0
>>> str(98) # 将其他類型轉為字元串型
'98'
>>> list('abcd') # 将其他類型轉為清單類型
['a', 'b', 'c', 'd']
>>> dict.fromkeys(['name','age']) # 将其他類型轉為字典類型
{'age': None, 'name': None}
>>> tuple([1, 2, 3, 4]) # 将其他類型轉為元祖類型
(1, 2, 3, 4)
詳細類型轉換
函數 描述
int(x [,base]) 将x轉換為一個整數
long(x [,base] ) 将x轉換為一個長整數
float(x) 将x轉換到一個浮點數
complex(real [,imag]) 建立一個複數
str(x) 将對象 x 轉換為字元串
repr(x) 将對象 x 轉換為表達式字元串
eval(str) 用來計算在字元串中的有效Python表達式,并傳回一個對象
tuple(s) 将序列 s 轉換為一個元組
list(s) 将序列 s 轉換為一個清單
set(s) 轉換為可變集合
dict(d) 建立一個字典。d 必須是一個序列 (key,value)元組。
frozenset(s) 轉換為不可變集合
chr(x) 将一個整數轉換為一個字元
unichr(x) 将一個整數轉換為Unicode字元
ord(x) 将一個字元轉換為它的整數值
hex(x) 将一個整數轉換為一個十六進制字元串
oct(x) 将一個整數轉換為一個八進制字元串
擷取python對象類型
>>> type([]);type('');type(0);type({});type(0.0);type((1,))
copy一個對象
切片S[:] # 注不能應用于字典
深淺寶貝 # 能應用于所有序列和字典
淺拷貝D.copy()方法
深拷貝deepcopy(D)方法
python如何實作記憶體管理
python内部使用引用計數,來保持追蹤記憶體中的對象,Python内部記錄了對象有多少個引用,即引用計數,當對象被建立時就建立了一個引用計數,當對象不再需要時,這個對象的引用計數為0時,它被垃圾回收。所有這些都是自動完成,不需要像C一樣,人工幹預,進而提高了程式員的效率和程式的健壯性。
range函數的用法
>>> range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> range(1, 10)
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> range(0, 9, 2)
[0, 2, 4, 6, 8]
>>> range(99,0,-10)
[99, 89, 79, 69, 59, 49, 39, 29, 19, 9]
相差別的是xrange(),每次隻取出一個疊代對象,如果是資料量比較大時,效率較高
在Python3中,沒有xrange()函數,其功能放在了range()函數上
異常處理的作用
程式中出現異常情況時就需要異常處理。比如當你打開一個不存在的檔案時。當你的程式中有
一些無效的語句時,Python會提示你有錯誤存在。下面是一個拼寫錯誤的例子,print寫成了Print
下面是異常最常見的幾種角色
錯誤處理
>>>可以在程式代碼中捕捉和相應錯誤,或者忽略已發生的異常。
>>>如果忽略錯誤,PYTHON預設的異常處理行為将啟動:停止程式,列印錯誤資訊。
>>>如果不想啟動這種預設行為,就用try語句來捕捉異常并從異常中恢複。
事件通知
>>>異常也可用于發出有效狀态的信号,而不需在程式間傳遞結果标志位。或者刻意對其進行測試
特殊情況處理
>>>有時,發生了某種很罕見的情況,很難調整代碼區處理。通常會在異常進行中處理,進而省去應對特殊情況的代碼
終止行為
>>>try/finally語句可確定一定會進行需要的結束運算,無論程式是否有異常
非正常控制流程