Python可以這么玩

使用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ù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容