轉(zhuǎn)自http://blog.csdn.net/jerry_1126/article/details/44023949
- pythonic 簡潔乘客、靈活炸茧、可讀性強(qiáng)
#交換兩個變量值
a,b = b,a
#去掉list中的重復(fù)元素
old_list = [1,1,1,3,4]
new_list = list(set(old_list))
#翻轉(zhuǎn)一個字符串
s = 'abcde'
ss = s[::-1]
#用兩個元素之間有對應(yīng)關(guān)系的list構(gòu)造一個dict
names = ['jianpx', 'yue']
ages = [23, 40]
m = dict(zip(names,ages))
#將數(shù)量較多的字符串相連镇眷,如何效率較高羞反,為什么
fruits = ['apple', 'banana']
result = ''.join(fruits)
#python字符串效率問題之一就是在連接字符串的時(shí)候使用‘+’號观游,例如 s = ‘s1’ + ‘s2’ + ‘s3’ + ...+’sN’稽屏,總共將N個字符串連接起來, 但是使用+號的話抛虫,python需要申請N-1次內(nèi)存空間松靡, 然后進(jìn)行字符串拷貝。原因是字符串對象PyStringObject在python當(dāng)中是不可變 對象建椰,所以每當(dāng)需要合并兩個字符串的時(shí)候雕欺,就要重新申請一個新的內(nèi)存空間 (大小為兩個字符串長度之和)來給這個合并之后的新字符串,然后進(jìn)行拷貝棉姐。 所以用+號效率非常低屠列。建議在連接字符串的時(shí)候使用字符串本身的方法 join(list),這個方法能提高效率伞矩,原因是它只是申請了一次內(nèi)存空間笛洛, 因?yàn)樗梢员闅vlist中的元素計(jì)算出總共需要申請的內(nèi)存空間的大小,一次申請完乃坤。
- python調(diào)試工具
PyChecker是一個python代碼的靜態(tài)分析工具苛让,它可以幫助查找python代碼的bug, 會對代碼的復(fù)雜度和格式提出警告
Pylint 是另外一個工具可以進(jìn)行coding standard檢查。
- GIL
什么是GIL(Global Interpreter Lock)全局解釋器鎖? 簡單地說就是:
每一個interpreter進(jìn)程,只能同時(shí)僅有一個線程來執(zhí)行, 獲得相關(guān)的鎖, 存取相關(guān)的資源.
那么很容易就會發(fā)現(xiàn),如果一個interpreter進(jìn)程只能有一個線程來執(zhí)行,
多線程的并發(fā)則成為不可能, 即使這幾個線程之間不存在資源的競爭.
從理論上講,我們要盡可能地使程序更加并行, 能夠充分利用多核的功能.
- 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循環(huán)遍歷出來;
<dictionary-itemiterator object at 0x00000000026243B8>
>>> 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
總結(jié):
1.一般iteritems()迭代的辦法比items()要快枫吧,特別是數(shù)據(jù)庫比較大時(shí)浦旱。
2.在Python3中一般取消前者函數(shù)
- with statements
>>> with open('text.txt') as myfile:
while True:
line = myfile.readline()
if not line:
break
print line,
with語句使用所謂的上下文管理器對代碼塊進(jìn)行包裝宇色,允許上下文管理器實(shí)現(xiàn)一些設(shè)置和清理操作九杂。
例如:文件可以作為上下文管理器使用,它們可以關(guān)閉自身作為清理的一部分宣蠕。
NOTE:在PYTHON2.5中例隆,需要使用from __future__ import with_statement進(jìn)行with語句的導(dǎo)入
- python生成制定長度的斐波那契數(shù)列
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生成隨機(jī)數(shù)
>>> 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]
- 如何定義一個函數(shù)
def func(arg, *args, **kwagrs): #普通函數(shù)
func_body
return
lambda x: x **2 #匿名函數(shù)
- <.*?> 和<.*>在正則匹配中的含義
import re
s = ‘<html><head><title>Title</title>’
print(re.match(‘<.*>’, s).group())
會返回一個匹配<html><head><title>Title</title>而不是<html>
而
import re
s = ‘<html><head><title>Title</title>’
print(re.match(‘<.*?>’, s).group())
則會返回<html>
<.*>這種匹配稱作貪心匹配 <.*?>稱作非貪心匹配
- search與match的區(qū)別
>>> 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只匹配字符串的開始,如果字符串開始不符合正則表達(dá)式抢蚀,則匹配失敗镀层,函數(shù)返回None;
#re.search匹配整個字符串,直到找到一個匹配唱逢。
- 中文亂碼問題
在Python3中吴侦,對中文進(jìn)行了全面的支持,但在Python2.x中需要進(jìn)行相關(guān)的設(shè)置才能使用中文坞古。否則會出現(xiàn)亂碼备韧。
Python默認(rèn)采取的ASCII編碼,字母痪枫、標(biāo)點(diǎn)和其他字符只使用一個字節(jié)來表示织堂,但對于中文字符來說,一個字節(jié)滿足不了需求奶陈。
為了能在計(jì)算機(jī)中表示所有的中文字符易阳,中文編碼采用兩個字節(jié)表示。如果中文編碼和ASCII混合使用的話吃粒,就會導(dǎo)致解碼錯誤潦俺,從而才生亂碼。
解決辦法:
交互式命令中:一般不會出現(xiàn)亂碼徐勃,無需做處理
py腳本文件中:跨字符集必須做設(shè)置黑竞,否則亂碼
首先在開頭一句添加:
# coding = utf-8
# 或
# coding = UTF-8
# 或
# -*- coding: utf-8 -*-
其次需將文件保存為UTF-8的格式!
最后: s.decode('utf-8').encode('gbk')
- lambda函數(shù)疏旨,本實(shí)例實(shí)現(xiàn)了求素?cái)?shù)
函數(shù)使用:
代碼塊重復(fù)很魂,這時(shí)候必須考慮到函數(shù),降低程序的冗余度
代碼塊復(fù)雜檐涝,這時(shí)候必須考慮到函數(shù)遏匆,降低程序的復(fù)雜度
Python有兩種函數(shù),一種是def定義,一種是lambda函數(shù)()
當(dāng)程序代碼很短谁榜,且該函數(shù)只使用一次幅聘,為了程序的簡潔,及節(jié)省變量內(nèi)存占用空間窃植,引入了匿名函數(shù)這個概念
>>> 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之間的轉(zhuǎn)換
#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中的重復(fù)元素
>>> 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中的類型轉(zhuǎn)換
>>> int('1234') # 將數(shù)字型字符串轉(zhuǎn)為整形
1234
>>> float(12) # 將整形或數(shù)字字符轉(zhuǎn)為浮點(diǎn)型
12.0
>>> str(98) # 將其他類型轉(zhuǎn)為字符串型
'98'
>>> list('abcd') # 將其他類型轉(zhuǎn)為列表類型
['a', 'b', 'c', 'd']
>>> dict.fromkeys(['name','age']) # 將其他類型轉(zhuǎn)為字典類型
{'age': None, 'name': None}
>>> tuple([1, 2, 3, 4]) # 將其他類型轉(zhuǎn)為元祖類型
(1, 2, 3, 4)
詳細(xì)類型轉(zhuǎn)換
函數(shù) 描述
int(x [,base]) 將x轉(zhuǎn)換為一個整數(shù)
long(x [,base] ) 將x轉(zhuǎn)換為一個長整數(shù)
float(x) 將x轉(zhuǎn)換到一個浮點(diǎn)數(shù)
complex(real [,imag]) 創(chuàng)建一個復(fù)數(shù)
str(x) 將對象 x 轉(zhuǎn)換為字符串
repr(x) 將對象 x 轉(zhuǎn)換為表達(dá)式字符串
eval(str) 用來計(jì)算在字符串中的有效Python表達(dá)式,并返回一個對象
tuple(s) 將序列 s 轉(zhuǎn)換為一個元組
list(s) 將序列 s 轉(zhuǎn)換為一個列表
set(s) 轉(zhuǎn)換為可變集合
dict(d) 創(chuàng)建一個字典帝蒿。d 必須是一個序列 (key,value)元組。
frozenset(s) 轉(zhuǎn)換為不可變集合
chr(x) 將一個整數(shù)轉(zhuǎn)換為一個字符
unichr(x) 將一個整數(shù)轉(zhuǎn)換為Unicode字符
ord(x) 將一個字符轉(zhuǎn)換為它的整數(shù)值
hex(x) 將一個整數(shù)轉(zhuǎn)換為一個十六進(jìn)制字符串
oct(x) 將一個整數(shù)轉(zhuǎn)換為一個八進(jìn)制字符串
- 獲取python對象類型
>>> type([]);type('');type(0);type({});type(0.0);type((1,))
<type 'list'>
<type 'str'>
<type 'int'>
<type 'dict'>
<type 'float'>
<type 'tuple'>
- copy一個對象
切片S[:] # 注不能應(yīng)用于字典
深淺寶貝 # 能應(yīng)用于所有序列和字典
淺拷貝D.copy()方法
深拷貝deepcopy(D)方法
- python如何實(shí)現(xiàn)內(nèi)存管理
python內(nèi)部使用引用計(jì)數(shù)巷怜,來保持追蹤內(nèi)存中的對象葛超,Python內(nèi)部記錄了對象有多少個引用,即引用計(jì)數(shù)延塑,當(dāng)對象被創(chuàng)建時(shí)就創(chuàng)建了一個引用計(jì)數(shù)绣张,當(dāng)對象不再需要時(shí),這個對象的引用計(jì)數(shù)為0時(shí)关带,它被垃圾回收侥涵。所有這些都是自動完成,不需要像C一樣,人工干預(yù)芜飘,從而提高了程序員的效率和程序的健壯性务豺。
- range函數(shù)的用法
>>> 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]
相區(qū)別的是xrange(),每次只取出一個迭代對象,如果是數(shù)據(jù)量比較大時(shí)嗦明,效率較高
在Python3中冲呢,沒有xrange()函數(shù),其功能放在了range()函數(shù)上
- 異常處理的作用
程序中出現(xiàn)異常情況時(shí)就需要異常處理招狸。比如當(dāng)你打開一個不存在的文件時(shí)敬拓。當(dāng)你的程序中有
一些無效的語句時(shí),Python會提示你有錯誤存在裙戏。下面是一個拼寫錯誤的例子乘凸,print寫成了Print
下面是異常最常見的幾種角色
錯誤處理
>>>可以在程序代碼中捕捉和相應(yīng)錯誤,或者忽略已發(fā)生的異常累榜。
>>>如果忽略錯誤营勤,PYTHON默認(rèn)的異常處理行為將啟動:停止程序,打印錯誤信息壹罚。
>>>如果不想啟動這種默認(rèn)行為葛作,就用try語句來捕捉異常并從異常中恢復(fù)。
事件通知
>>>異常也可用于發(fā)出有效狀態(tài)的信號猖凛,而不需在程序間傳遞結(jié)果標(biāo)志位赂蠢。或者刻意對其進(jìn)行測試
特殊情況處理
>>>有時(shí)辨泳,發(fā)生了某種很罕見的情況虱岂,很難調(diào)整代碼區(qū)處理。通常會在異常處理中處理菠红,從而省去應(yīng)對特殊情況的代碼
終止行為
>>>try/finally語句可確保一定會進(jìn)行需要的結(jié)束運(yùn)算第岖,無論程序是否有異常
非常規(guī)控制流程