自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Pythonic風(fēng)格代碼有什么好處?附12個(gè)代碼實(shí)例

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

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

[[382298]]

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

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

在Java里這樣的:

 

  1. for index in (indexindex < 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,則會(huì)看到下面一首詩:

 

 

 

美勝于丑,簡勝于繁,這就是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)榭赡軙?huì)把內(nèi)存占滿。這時(shí)就要用到生成器表達(dá)式,它返回生成器,基本不占用內(nèi)存。

 

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

3、盡量使用enumerate

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

 

  1. # 任務(wù):打印列表中每個(gè)元素的索引 
  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語句提供一個(gè)有效的機(jī)制,讓代碼更簡練,同時(shí)在異常產(chǎn)生時(shí),清理工作更簡單。

 

  1. # 任務(wù):讀取一個(gè)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)的元素打包成一個(gè)個(gè)元組,然后返回由這些元組組成的可迭代對象。

 

  1. # 任務(wù):對比兩個(gè)列表相同索引位置元素的大小,輸出較大值 
  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)時(shí),應(yīng)該考慮到第一行不應(yīng)該有參數(shù),以及使用縮進(jìn)以區(qū)分自己是續(xù)行。

 

  1. # 非pythonic方法 
  2. # 沒有使用垂直對齊時(shí),禁止把參數(shù)放在第一行 
  3. foo = long_function_name(var_one, var_two, 
  4.     var_three, var_four) 
  5.  
  6. # 當(dāng)縮進(jìn)沒有與其他行區(qū)分時(shí),要增加縮進(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、交換兩個(gè)變量的值

 

  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、判斷一個(gè)值是否為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ù)

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

補(bǔ)充

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

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

PEP8含義:

 

常見規(guī)則:


 

 

責(zé)任編輯:華軒 來源: Python大數(shù)據(jù)分析
相關(guān)推薦

2023-01-11 11:35:40

重構(gòu)PythonPythonic

2023-09-26 12:04:15

重構(gòu)技巧Pythonic

2023-02-06 12:00:00

重構(gòu)PythonPythonic

2024-11-12 12:52:39

Python代碼函數(shù)

2020-10-25 19:58:04

Pythonic代碼語言

2017-07-10 14:58:23

JavaScript代碼風(fēng)格寫作準(zhǔn)則

2013-06-06 10:10:59

項(xiàng)目項(xiàng)目代碼代碼風(fēng)格

2025-01-26 08:30:00

Python代碼編程

2025-01-06 08:00:00

Python代碼編程

2018-01-02 16:30:27

Python爬蟲微博移動(dòng)端

2021-08-24 13:05:25

TypeScript代碼前端

2017-09-08 12:15:54

Python代碼Pythonic

2024-10-08 05:00:00

PEP 8編碼Python

2013-03-19 09:40:44

CookiesCookies跟蹤個(gè)人隱私

2019-04-29 08:31:25

PythonPandas數(shù)據(jù)

2012-07-27 10:30:12

重構(gòu)

2010-07-28 15:42:44

Flex

2022-03-10 08:01:06

CSS技巧選擇器

2025-01-14 00:01:01

2015-11-02 09:25:07

jQuery代碼片段
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號