日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Pythonic風(fēng)格代碼有什么好處?附12個代碼實(shí)例

 pythonic是開發(fā)者們在寫python代碼過程中總結(jié)的編程習(xí)慣,崇尚優(yōu)雅、明確、簡單。就好比中文筆畫,有先后順序,最符合文字書寫的習(xí)慣。

成都創(chuàng)新互聯(lián)自2013年起,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目做網(wǎng)站、網(wǎng)站制作網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元瀾滄做網(wǎng)站,已為上家服務(wù),為瀾滄各地企業(yè)和個人服務(wù),聯(lián)系電話:13518219792

因?yàn)槭橇?xí)慣,不是江湖規(guī)則,所以你大可不必遵守pythonic,但如果你想成為python高手,最好是養(yǎng)成這個習(xí)慣。

對比其他語言我們能直觀看出pythonic風(fēng)格的特點(diǎn),比如寫一個簡單循環(huán)。

在Java里這樣的:

 
 
 
 
  1. for index in (index; index < items.length ; index++) 
  2.  { 
  3.   item = items[index]; 
  4.  ... now do something 
  5.  } 

嘗試用python來寫循環(huán),則非常簡潔易懂:

 
 
 
 
  1. for item in items: 
  2.   item.perform_action() 

想要更加pythonic,用生成器表達(dá)式來寫循環(huán):

 
 
 
 
  1. (item.some_attribute for item in items) 

這樣的寫法其實(shí)已經(jīng)接近自然語言,一眼能看出代碼意思。

如果你在Python IDE中輸入import python,則會看到下面一首詩:

美勝于丑,簡勝于繁,這就是Python哲學(xué)。

有一本書《effctive python》里面講到蠻多pythonic的寫法,下面列出一些常見的代碼。

1、用列表推導(dǎo)式來取代map、filter

map、filter需要編寫額外的lambda函數(shù),用起來比較復(fù)雜,而且效率也不高。

列表推導(dǎo)式則非常簡潔,通過循環(huán)創(chuàng)建列表。

 
 
 
 
  1. # 任務(wù):找到列表中可以被2整除的數(shù),并作二次方運(yùn)算。 
  2.  
  3. # 非pythonic方法 
  4. a = [1,2,3,4,5,6,7,8,9,10] 
  5. result = map(lambda x: x**2 ,filter(lambda x: x%2==0,a)) 
  6.  
  7. # pythonic方法 
  8. a = [1,2,3,4,5,6,7,8,9,10] 
  9. result = [x**2 for x in a if x%2==0] 

2、用生成器表達(dá)式來代替數(shù)據(jù)量較大的列表推導(dǎo)

列表推導(dǎo)式雖然簡潔,但是不適合大數(shù)據(jù)量的生成,因?yàn)榭赡軙褍?nèi)存占滿。這時就要用到生成器表達(dá)式,它返回生成器,基本不占用內(nèi)存。

 
 
 
 
  1. # 任務(wù):對十億條數(shù)據(jù)進(jìn)行求平方根操作 
  2.  
  3. # 非pythonic方法 
  4. a = [1,2,3,4,5,6,7,8,9,10] # 假裝這里有十億個數(shù)字 
  5. result = [x**0.5 for x in a] 
  6.  
  7. # pythonic方法 
  8. a = [1,2,3,4,5,6,7,8,9,10]# 假裝這里有十億個數(shù)字 
  9. result = (x**0.5 for x in a) 

3、盡量使用enumerate

enumerate可以把迭代器包裝成生成器,每次遍歷時,會同時列出數(shù)據(jù)和數(shù)據(jù)下標(biāo)。

 
 
 
 
  1. # 任務(wù):打印列表中每個元素的索引 
  2.  
  3. # 非pythonic方法 
  4. a = ['apple','banana','orange'] 
  5. for i in range(len(a)): 
  6.     print(a[i],':',i) 
  7.  
  8. # pythonic方法 
  9. a = ['apple','banana','orange'] 
  10. for i,j in enumerate(a): 
  11.     print(i,':',j) 

4、使用with方法處理文件

with語句提供一個有效的機(jī)制,讓代碼更簡練,同時在異常產(chǎn)生時,清理工作更簡單。

 
 
 
 
  1. # 任務(wù):讀取一個txt文件 
  2.  
  3. # 非pythonic方法 
  4. f = open("some_file.txt") 
  5. try: 
  6.   data = f.read() 
  7.   # 其他文件操作.. 
  8. finally: 
  9.   f.close() 
  10.  
  11. # pythonic方法 
  12. with open("some_file.txt") as f: 
  13.   data = f.read() 
  14.   # 其他文件操作... 

5、使用map函數(shù)

zip() 函數(shù)用于將可迭代的對象作為參數(shù),將對象中對應(yīng)的元素打包成一個個元組,然后返回由這些元組組成的可迭代對象。

 
 
 
 
  1. # 任務(wù):對比兩個列表相同索引位置元素的大小,輸出較大值 
  2.  
  3. # 非pythonic方法 
  4. a = [1,5,7] 
  5. b = [2,4,6] 
  6. for i in range(len(a)): 
  7.     if a[i] > b[i]: 
  8.         print(a[i]) 
  9.     else: 
  10.         print(b[i]) 
  11.  
  12. # pythonic方法 
  13. a = [1,5,7] 
  14. b = [2,4,6] 
  15. for i,j in zip(a,b): 
  16.     if i > j: 
  17.         print(i) 
  18.     else: 
  19.         print(j) 

6、每行只寫一段語句

 
 
 
 
  1. # 非pythonic方法 
  2. print ('one'); print ('two') 
  3.  
  4. if x == 1: print ('one') 
  5.  
  6. # pythonic方法 
  7. print ('one'); 
  8. print ('two') 
  9.  
  10. if x == 1: 
  11.     print ('one') 

7、縮進(jìn)

續(xù)行應(yīng)該與其包裹元素對齊,要么使用圓括號、方括號和花括號內(nèi)的隱式行連接來垂直對齊,要么使用掛行縮進(jìn)對齊3。

當(dāng)使用掛行縮進(jìn)時,應(yīng)該考慮到第一行不應(yīng)該有參數(shù),以及使用縮進(jìn)以區(qū)分自己是續(xù)行。

 
 
 
 
  1. # 非pythonic方法 
  2. # 沒有使用垂直對齊時,禁止把參數(shù)放在第一行 
  3. foo = long_function_name(var_one, var_two, 
  4.     var_three, var_four) 
  5.  
  6. # 當(dāng)縮進(jìn)沒有與其他行區(qū)分時,要增加縮進(jìn) 
  7. def long_function_name( 
  8.     var_one, var_two, var_three, 
  9.     var_four): 
  10.     print(var_one) 
  11.  
  12. # pythonic方法 
  13. # 與左括號對齊 
  14. foo = long_function_name(var_one, var_two, 
  15.                          var_three, var_four) 
  16.  
  17. # 用更多的縮進(jìn)來與其他行區(qū)分 
  18. def long_function_name( 
  19.         var_one, var_two, var_three, 
  20.         var_four): 
  21.     print(var_one) 
  22.  
  23. # 掛行縮進(jìn)應(yīng)該再換一行 
  24. foo = long_function_name( 
  25.     var_one, var_two, 
  26.     var_three, var_four) 

8、 import 導(dǎo)入要分行

 
 
 
 
  1. # 非pythonic方法 
  2. import sys, os 
  3.  
  4. # pythonic方法 
  5. import os 
  6. import sys 
  7. from subprocess import Popen, PIPE 

9、交換兩個變量的值

 
 
 
 
  1. # 非pythonic方法 
  2. a = 'hello' 
  3. b = 'world' 
  4. temp = a 
  5. a = b 
  6. b = temp 
  7. print(a, b) 
  8.  
  9.  
  10. # pythonic方法 
  11. a = 'hello' 
  12. b = 'world' 
  13. a, b = b, a 
  14. print(a, b) 

10、使用join方法拼接字符串

 
 
 
 
  1. # 非pythonic方法 
  2. a = ['w','o','r','l','d'] 
  3. b = '' 
  4. for i in a: 
  5.     b+=i 
  6. print(b) 
  7.  
  8.  
  9. # pythonic方法 
  10. a = ['w','o','r','l','d'] 
  11. b = ''.join(a) 
  12. print(b) 

11、判斷一個值是否為True、空列表、None

 
 
 
 
  1. # 非pythonic方法 
  2. if x == True: 
  3.     pass 
  4. if len(y) == 0: 
  5.     pass 
  6. if z == None: 
  7.     pass 
  8.  
  9.  
  10. # pythonic方法 
  11. if x: 
  12.     pass 
  13. if not y: 
  14.     pass 
  15. if z is None: 
  16.     pass 

12、pythonic風(fēng)格函數(shù)

  • 命名合理
  • 具有單一功能
  • 包含文檔注釋
  • 返回一個值
  • 函數(shù)和類應(yīng)該用兩個空行隔開
  • 盡量使用內(nèi)置函數(shù)

補(bǔ)充

最后說下PEP8規(guī)范,PEP8是Python的編碼規(guī)范,其目的在于提高代碼的可讀性。

寫python代碼時,在保證準(zhǔn)確的前提下,要盡可能遵守PEP8。

PEP8含義:

常見規(guī)則:


網(wǎng)頁名稱:Pythonic風(fēng)格代碼有什么好處?附12個代碼實(shí)例
路徑分享:http://www.dlmjj.cn/article/ccooijp.html