當前位置:首頁 » 編程語言 » pythonrose

pythonrose

發布時間: 2025-02-05 21:31:46

A. python 開發中有哪些高級技巧

我列出來幾個,不知道算不算高級技巧,但是我個人覺得非常有用。

1. 善用迭代器

迭代器在很多語言裡面都有,而在 Python里適當的場景用迭代器會非常的「爽」。一來因為迭代器每次產生一個對象,適當使用能有效節省內存;二來它能達到部分「延遲計算」的效果。除此以外,因為 Generator (yield 關鍵字)和 Generator Expression 的存在,有時候使用迭代器能提升代碼可讀性。

舉例,itertools.islice((calculate_for_value(v) for v in values), 0, 12) 能夠只在
[0, 12) 范圍內計算,而且是延遲計算的,即迭代到了那個對象才去計算。又如 any(i % 3 == 0 for i in
numbers) 能夠找出 numbers 里第一個能被 3 整除的值,因為裡面是個 Generator
Expression(迭代器的一種),所以找出以後 any 函數就會立即返回,並不需要對整個 numbers 列表計算 i % 3。

順帶推薦下這個庫 erikrose/more-itertools ,裡麵包含了很多實用的迭代器函數,是對標准庫 itertools 的一個很不錯的補充。

2. 善用描述符(Descriptor)

Python 的描述符是對「屬性」的抽象,一個描述符定義成類屬性以後,能夠控制這個類的實例上同名實例屬性的 get、set、delete 行為,比 __getattr__ 這樣的實例級 magic method 有更細的粒度,並且更容易復用。這個文檔有簡單的描述 Descriptor HowTo Guide ,可見 Python 的「實例方法」、@property 全由它實現,一些第三方庫也有用到(例如 SQLAlchemy 的 Column、WTForms 的 Field 乃至 Python 3.4 新增的 enum.Enum 類型)。

利用描述符特性,可以在業務代碼中實現一些非常方便的定製,例如可以自己實現一個能緩存返回值的 cached_property(也可以不用自己實現,直接用 Werkzeug 的)。

3. 盡量不要用反射技巧去 fight with language

我個人的一個觀點:用一門編程語言就應該入鄉隨俗,fight with language 的事情不要做太多為好。因為閉門造的輪子很難造圓,更何況站在語言使用者的層面去和語言的設計搏擊實在很不自量力。

問題問的是「高級技巧」,那麼對於一個動態語言,反射當然算高級技巧的。可是我見過一些利用 Python 的反射來掃描出一些包中所有 .py 文件然後自動 import 包下的所有模塊的。且不說這個做法破壞了 Python 「模塊即是命名空間」 和 lazy import 的設定,光是從「正確性」來說就有一堆問題。這個做法僅僅考慮到了模塊文件系統中的場景,沒考慮到可能模塊在一個 zip 中的情況。就算再增強一下實現,考慮上 zip 的 import,那 Python 還有 PEP 302 定義的 Import Hook 用法呢,被這樣一 hack 就完全沒法用了。這種 fight with language 的做法很難去做到真正的「正確」。

所以我覺得還有一個 Python 的技巧就是想使用「高級技巧」的時候謹慎地考慮使用。靜下來想想自己是不是在 fight with language 了,如果是的話,建議停手。要不就入鄉隨俗,要不就認真考慮一下 Python 是不是真的有值得去改進的地方。後者是需要經過很多深思熟慮的,不是 10 分鍾的想法就夠。如果後者的回答真的是「是」,我想可能正確的做法是寫一個 PEP 然後和社區討論,看能否將改進直接施於 Python 未來的版本之上,而不是在自己的代碼里用一個看似高級技巧實是醜陋的 hack 的實現來對抗語言本身。

-------------------------------------------------------------------------------

其他的一些 Python 特色的技巧,例如 decorator、contextmanager 等,因為各路 Python 開發者基本都很熟悉,我就沒列出來了。

-------------------------------------------------------------------------------

B. 用python對10個數進行排序

sort_values(by,axis=0,ascending=True,inplace=False,kind='quicksort',na_position='last')

by:可以填入字元串或者字元串組成的列表。也就是說,如果axis=0,那麼by="列名";如果axis=1,那麼by="行名"。

axis:{0 or 『index』, 1 or 『columns』}, default 0,意思就是如果axis=0,就按照索引排序,即縱向排序;如果axis=1,則按列排序,即橫向排序。默認是axis=0。

ascending:輸入布爾型,True是升序,False是降序,也可以可以是[True,False],即第一個欄位升序,第二個欄位降序 。

inplace: 輸入布爾型,是否用排序後的數據框替換現有的數據框(這個在之前的文章寫過很多次了~)

kind:排序的方法,{『quicksort』, 『mergesort』, 『heapsort』},默認是使用『quicksort』。這個參數用的比較少,大家可以試一試。

na_position :{『first』, 『last』},缺失值的排序,也就說決定將缺失值放在數據的最前面還是最後面。first是排在前面,last是排在後面,默認是用last。

創建數據表:

scores=pd.DataFrame([[87,56,85],[46,87,97],[34,65,86]],
columns=['jack','rose','mike'])
scores

『rose』這一列進行降序排序:

df_sc=scores.sort_values(by='rose',ascending=False)
df_sc

『mike』這一列進行升序排序:

df_sc=scores.sort_values(by='mike',ascending=True)
df_sc

對第0行進行升序排序:

scores.sort_values(by=0,axis=1,ascending=True)

我們再嘗試對第1行進行升序,第0行進行降序:

scores.sort_values(by=[1,0],axis=1,ascending=[True,False]
熱點內容
如何配置2檸檬酸 發布:2025-02-06 00:57:26 瀏覽:434
積木源碼 發布:2025-02-06 00:55:26 瀏覽:545
變分的運演算法則 發布:2025-02-06 00:55:21 瀏覽:775
x2哪個配置性價比高 發布:2025-02-06 00:40:12 瀏覽:109
豬哥亮訪問張菲 發布:2025-02-06 00:37:52 瀏覽:570
期貨賬戶怎麼改密碼 發布:2025-02-06 00:32:35 瀏覽:279
qq自動上傳群文件 發布:2025-02-06 00:26:25 瀏覽:111
安卓照片放在什麼地方 發布:2025-02-06 00:26:24 瀏覽:988
linux系統鏡像iso 發布:2025-02-06 00:15:39 瀏覽:188
存儲上料模塊的意義 發布:2025-02-06 00:14:14 瀏覽:125