Python一些不為人知的基礎技巧

來源:互聯網
上載者:User

標籤:開始   檔案   htm   err   except   cost   ted   input   if語句   

1.startswith()和endswith()參數可以是元組

當檢測字串開頭或結尾時,如果有多個檢測值,可以用元組作為startswith()endswith()參數:

 1 # bad 2 if image.endswith(‘.jpg‘) or image.endswith(‘.png‘) or image.endswith(‘.gif‘): 3     pass 4 # good 5 if image.endswith((‘.jpg‘, ‘.png‘, ‘.gif‘)): 6     pass 7 # bad 8 if url.startswith(‘http:‘) or url.startswith(‘https:‘) or url.startswith(‘ftp:‘): 9     pass10 # good11 if url.startswith((‘http:‘, ‘https:‘, ‘ftp:‘)):12     pass
2.enumerate()設定start參數做為索引起始值 

當用enumerate()迭代同時要得到索引時,可以設定start參數作為索引起始值:

 

1 # bad2 for index, v in enumerate(data):3     print(index+1, v)4 # good5 for index, v in enumerate(data, start=1):6     print(index, v)

 

3.對切片命名 

當代碼中到處都是硬式編碼切片索引時,我們的代碼將變得無法閱讀。可以對切片命名解決此問題:

1 record = ‘....................100.................513.25......‘2 # bad3 cost = int(record[20:23]) * float(record[40:46])4 # good5 SHARES = slice(20, 23)6 PRICE = slice(40, 46)7 cost = int(record[SHARES]) * float(record[PRICE])

 

作為一條基本準則,代碼中如果有很多硬式編碼索引值,將導致可讀性合可維護性都不佳。一般來說,內建的slice()函數會建立一個切片對象,可以用在任何允許進行切片操作的地方。例如:

 1 >>> items = [0, 1, 2, 3, 4, 5, 6] 2 >>> a = slice(2, 4) 3 >>> items[2:4] 4 [2, 3] 5 >>> items[a] 6 [2, 3] 7 >>> items[a] = [-2, -3] 8 >>> items 9 [0, 1, -2, -3, 4, 5, 6]10 >>> del items[a]11 >>> items12 [0, 1, 4, 5, 6]13 >>>

python學習交流群:125240963

4.上下文管理器可以同時管理多個資源 

假設你要讀取一個檔案的內容,經過處理以後,寫入到另一個檔案。你能寫出pythonic的代碼,所以你使用了上下文管理器,滿意地的寫出了下面這樣的代碼:

1 with open(‘input.txt‘, ‘r‘) as source:2     with open(‘output.txt‘, ‘w‘) as target:3         target.write(source.read())

你已經做的很好了,但是上下文管理器可以同時管理多個資源,上面這段代碼還可以這樣寫: 

1 with open(‘input.txt‘, ‘r‘) as source, open(‘output.txt‘, ‘w‘) as target:2     target.write(source.read())
5.else子句 

Python中的else子句不僅能在if語句中使用,還能在for、while、和try語句中使用。
在for迴圈或是while迴圈正常運行完畢時(而不是通過break語句或是return語句或是異常退出迴圈),才會運行else塊。
舉個例子:

 1 >>> for i in range(3): 2 ...     print(i) 3 ... else: 4 ...     print(‘Iterated over everything‘) 5 ...  6 0 7 1 8 2 9 Iterated over everything10 >>>

如上,for迴圈正常結束,所以運行了後面的else塊。 

 1 >>> for i in range(3): 2 ...     if i == 2: 3 ...         break 4 ...     print(i) 5 ... else: 6 ...     print(‘Iterated over everything‘) 7 ...  8 0 9 110 >>>

 

由此可以看出,for迴圈如果沒有正常運行完畢(如上面是break結束迴圈的),是不會運行後面的else塊。 

僅當try塊中沒有異常拋出時才運行else塊。一開始,你可能覺得沒必要在try/except塊中使用else子句。畢竟,在下述程式碼片段中,只有dangerous_call()不拋出異常,after_call()才會執行,對吧?

1 try:2     dangerous_call()3     after_call()4 except OSError:5     log(‘OSError...‘)

然而,after_call()不應該放在try塊中。為了清晰明確,try塊中應該只包括拋出預期異常的語句。因此,向下面這樣寫更好: 

1 try:2     dangerous_call()3 except OSError:4     log(‘OSError...‘)5 else:6     after_call()

現在很明確,try塊防守的是dangerous_call()可能出現的錯誤,而不是after_call()。而且很明顯,只有try塊不拋出異常,才會執行after_call()。但要注意一點,else子句拋出的異常不會由前面的except子句處理,也就是說此時after_call()如果拋出異常,將不會被捕獲到。 

python學習交流群:125240963

轉載至:http://www.revotu.com/python-some-common-tricks.html#more

Python一些不為人知的基礎技巧

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.