使用Python若干年,雖然沒有研究過源碼,但也總結(jié)了不少實(shí)用技巧,在這里分享給大家。玩蛇是個(gè)愉快的過程。
Python可以這么玩
/^\/^\
_|__| O|
\/ /~ \_/ \
\____|__________/ \
\_______ \
`\ \ \
| | \
/ / \
/ / \\
/ / \ \
/ / \ \
/ / _----_ \ \
/ / _-~ ~-_ | |
( ( _-~ _--_ ~-_ _/ |
\ ~-____-~ _-~ ~-_ ~-_-~ /
~-_ _-~ ~-_ _-~
~--______-~ ~-___-~
1. 調(diào)用外部程序
os.startfile(filename)
系統(tǒng)會(huì)使用默認(rèn)的程序打開filename指定的文件
2.去掉csv寫文件時(shí)多余的空行
You need to open the file in binary b mode to take care of blank lines in Python 2. This isn't required in Python 3.
So, change open('test.csv', 'w') to open('test.csv', 'wb')
3.使用正則表達(dá)式:用多種分隔符分割字符串
import re
DATA = "Hey, you - what are you doing here!?"
print re.findall(r"[\w']+", DATA)
# Prints ['Hey', 'you', 'what', 'are', 'you', 'doing', 'here']
4.字符串轉(zhuǎn)datetime
方法a:
>>> import datetime,time
>>> stringDate = "2006-05-18 19:35:00"
>>> dt = datetime.datetime.fromtimestamp(time.mktime(time.strptime(stringDate,"%Y-%m-%d %H:%M:%S")))
>>> print dt
2006-05-18 19:35:00
>>> print type(dt)
<type 'datetime.datetime'>
>>>
#該代碼片段來自于: http://www.sharejs.com/codes/python/835
方法b:
也可以直接調(diào)用datetime.strptime()
datetime.strptime(sj, "%Y-%m-%d %H:%M:%S")
5.安裝pip
執(zhí)行g(shù)et-pip.py就可以!
點(diǎn)擊這里下載
python get-pip.py
6.測試程序的性能
執(zhí)行
python -m cProfile xxx.py
或者
import cProfile
cProfile.run('foo()')
7.列表解析(List Comprehension)
List Comprehension是在Python2.0版本中加進(jìn)入的,是一種更高效、簡潔的for結(jié)構(gòu)替代品,作為新手寫上幾個(gè)后就對(duì)它愛不釋手,驚呼太好用了。
例子:將原始列表中的所有元素進(jìn)行某種操作后賦值給新的列表。
如果用for循環(huán),代碼如下:
oldlist = []
for item in oldlist:
newlist.append(func(item))
如果使用List Comprehension,代碼如下:
newlist = [func(item) for item in oldlist]
我們明顯看到差別,3行變一行,代碼可讀性增強(qiáng),而且性能也提升很多,據(jù)說基本可以達(dá)到C語言的速度。
List Comprehension還支持過濾功能,在列表生成過程中套用for if字句,非常好用。示例如下:
evens = [even for even in range(10) if even % 2 == 0]
只需要一行,就將得到0到9的數(shù)字中的所有偶數(shù),過濾掉了奇數(shù)。
8.生成器表達(dá)式(Generator Expression)
Python2.4中引入了Generator Expression。它功能上類似于List Comprehension,這你就要問了,為什么要加入這個(gè)呢。因?yàn)镚enerator Expression更加高效,避免了生成整個(gè)列表,改善性能及內(nèi)存占用,取而代之的是返回一個(gè)generator object,通過它迭代的返回列表中的每一個(gè)值。
而且Generator Expression的使用方法也很簡單,就是將List Comprehension中的中括號(hào)[]改成小括號(hào)(),示例如下:
newlist = (func(item) for item in oldlist)
這個(gè)返回的newlist其實(shí)并不是一個(gè)list,而是前面提到的generator object,可以理解為列表的一個(gè)迭代器,類似于C++中的iter。 可以通過newlist.next()迭代獲得列表中的每一項(xiàng)。
List Comprehension和Generator Expression實(shí)在是Python中的亮點(diǎn),簡潔高效,一定要經(jīng)常用、時(shí)時(shí)用、秒秒用。
9.字符串拼接
使用’’.join進(jìn)行字符串拼接,而不是a += b這種形式。因?yàn)閖oin將保證這個(gè)過程的時(shí)間復(fù)雜度為線性的,效率更高。道理很多人都知道,但是大多數(shù)人還是喜歡用“+”,因?yàn)檫@個(gè)實(shí)在太簡潔了。其實(shí)很多語言都提供了拼接字符串的方法或者相應(yīng)的類,良好編程習(xí)慣從拼接字符串開始。
10.None判斷
判斷一個(gè)實(shí)例變量是否為空的時(shí)候,應(yīng)該總是用’is’或者’is not’,而不要使用相等操作符。
11.對(duì)象類型判斷
對(duì)象類型的比較應(yīng)該始終用isinstance()代替直接比較類型。例如:
使用
if isinstance(obj, int):
而不是
if type(obj) is type(1):
12.字符串前后綴判斷
在檢查前綴或后綴時(shí)避免對(duì)字符串進(jìn)行切片。用startswith()和endswith()代替,因?yàn)樗鼈兪敲鞔_的并且錯(cuò)誤更少。例如:
使用
if foo.startswith('bar'):
替代
if foo[:3] == 'bar':
13.變量值交換
在其他語言中,我們經(jīng)常這樣交換兩個(gè)變量的值。
t=a; a=b; b=t;
但是在Python中,我們還有一個(gè)簡單的辦法:
a, b = b, a
并且這種方法更快,更酷。
14.異常類型
基于類的異常總是好過基于字符串的異常。我們最好構(gòu)造一個(gè)基于Exception的子類。
當(dāng)拋出一個(gè)異常的時(shí)候,使用”raise ValueError(‘message’)”替代”raise ValueError, ’message’”的形式。
15.如何判斷一個(gè)字符串只包含數(shù)字字符
Q:如何判斷一個(gè)字符串只包含數(shù)字字符
A:一種方法是 a.isdigit()。但這種方法對(duì)于包含正負(fù)號(hào)的數(shù)字字符串無效,因此更為準(zhǔn)確的為:
try:
x = int(aPossibleInt)
… do something with x …
except ValueError:
… do something else …
這樣更準(zhǔn)確一些,適用性也更廣。但如果你已經(jīng)確信沒有正負(fù)號(hào),使用字符串的isdigit()方法則更為方便。
還可以用正則表達(dá)式:
re.match(r’[+-]?\d+$’, ‘-1234′)
在數(shù)字很大時(shí),可能比用int類型轉(zhuǎn)換速度更快。
16.判斷一個(gè)數(shù)值是否是NaN
math.isnan()
17.數(shù)值列表轉(zhuǎn)字符串
比如:a=[1,2.3,4]
不能直接' '.join(a),因?yàn)閍里面不是字符串
要把a(bǔ)的每項(xiàng)都轉(zhuǎn)成字符串,然后在join
18.快速去除字符串中的空格
"".join(s.split())
19.各進(jìn)制之間的轉(zhuǎn)換
#十進(jìn)制轉(zhuǎn)換二進(jìn)制
>>> bin(10)
'0b1010'
#十進(jìn)制轉(zhuǎn)換十六進(jìn)制
>>> hex(10)
'0xa'
#二進(jìn)制轉(zhuǎn)換十進(jìn)制
>>> int('1010',2)
10
#十六進(jìn)制轉(zhuǎn)換十進(jìn)制
>>> int('0xa',16)
10
#十六進(jìn)制轉(zhuǎn)換二進(jìn)制
>>> bin(0xa)
'0b1010'
#二進(jìn)制轉(zhuǎn)換十六進(jìn)制
>>> hex(0b1010)
'0xa'
20.查看模塊的地址
import a_module
print a_module.__file__
上述代碼將范圍 .pyc 文件被加載的路徑,如果需要跨平臺(tái)解決方案,可用下面代碼:
import os
path = os.path.dirname(amodule.__file__)
21.判斷ajax請(qǐng)求
I am using exactly this base on the 'is_ajax' method in Django:
def is_ajax(self):
return "X-Requested-With" in self.request.headers and \
self.request.headers['X-Requested-With'] == "XMLHttpRequest"
22.執(zhí)行shell命令
用os.system(cmd) 不過取不了返回值
-
用os.popen(cmd) 要得到命令的輸出內(nèi)容,只需再調(diào)用下read()或readlines()等 如
a=os.popen(cmd).read() -
用 commands 模塊。其實(shí)也是對(duì)popen的封裝。此模塊主要有如下方法:
commands.getstatusoutput(cmd) 返回(status, output). commands.getoutput(cmd) 只返回輸出結(jié)果 commands.getstatus(file) 返回ls -ld file的執(zhí)行結(jié)果字符串,調(diào)用了getoutput,不建議使用此方法.
23.有序字典
http://www.python.org/dev/peps/pep-0372/
24.讀寫同一個(gè)文件
If you don't want to close and reopen the file, to avoid race conditions, you could truncate it:
f = open(filename, 'r+')
text = f.read()
text = re.sub('foobar', 'bar', text)
f.seek(0)
f.write(text)
f.truncate()
f.close()
25.下載文件到本地
f = urllib2.urlopen(url)
with open("code2.zip", "wb") as code:
code.write(f.read())
26.寫入utf-8編碼的文件
import codecs
f = codecs.open("pru_uni.txt", "w", "utf-8")
txt = unicode("campeón\n", "utf-8")
f.write(txt)
f.write(u'中文\n’)f.close()
27.獲取文件大小
使用os.path.getsize()函數(shù)