目錄
本文是python生態系統中一些有用技巧的分享。大多數技巧只是使用標準庫中的包,但其他一些技巧會涉及一些第三方包。
在開始閱讀本文內容之前,我們首先來回顧一下python中的iterables的概念。
根據python標準文件,iterable的概念如下:
一種能夠一次返回乙個成員的物件。
iterables的示例包括:
所有序列型別(如list、str和tuple)一些非序列型別,如dict、檔案物件以及類的實現中定義了__iter__()方法
iterables是乙個需要我們牢記的概念,因為接下來我們展示的許多技巧都使用itertools包。
itertools模組提供了一些函式,用於接收iterable物件,而不僅僅是列印逐個物件。
在工作學習中,我們經常會需要使用乙個簡單的函式來實現從乙個list來生成新的list,set或dict.此時我們就會用到iterables概念。
舉例來說:
生成list:
names = ['john', 'bard', 'jessica' 'andres']
lower_names = [name.lower() for name程式設計客棧 in names]
生成set:
names = ['john', 'bard', 'jessica' 'andres']
lower_names =
生成dict:
names = ['john', 'bard', 'jessica' 'andres']
lower_names =
個人建議:
僅當for語句、函式呼叫和方法呼叫的數量較少時使用。
有時,我們需要獲得兩個列表物件之間的所有可能組合。
我們首先想到的實現可能如下:
l1 = [1, 2, 3]
l2 = [4, 5, 6]
combinations =
for e1 in l1:
for e2 in l2:
combinations.append((e1, e2))
或者簡化一下,如下:
combinations = [(e1, e2) for e1 in l1 for e2 in l1]
上述實現已經很簡潔了,但標準庫itertools提供product函式,從而提供了相同的結果。如下所示:
from itertools import product
l1 = [1, 2, 3]
l2 = [4, 5, 6]
combinatios = product(l1, l2)
假設有乙個元素列表,我們需要在每對相鄰元素之間比較或應用一些操作,這有時稱為2個元素的滑動視窗。我們可以採用以下方式:
from itertools import tee
from typing import iterable
def window2(iterable: iterable):
it, offset = tee(iter(iterable))
next(offset)
return zip(it, offset)
l = [1, 2, 3, 4, 5, 6]
dd = window2(l)
for a in dd:
print(a)
執行結果如下:
(1, 2)
(2, 3)
(3, 4)
(4, 5)
(5, 6)
有時,我們會需要乙個類來儲存資訊,但是如果我們覺得建立乙個類並定義其__init__()函式太麻煩時,我們不妨選擇使用dataclass。如下所示:
from dataclasses import dataclass
@dataclass
class person:
name: str
age: int
address: str
上述**建立了乙個具有預設建構函式的類,該類以與宣告相同的順序接收相應欄位的賦值。
person = person(name='john', age=12, address='nanjing street')
dataclass的另乙個優點是,預設情況下,會www.cppcns.com生成特殊方法,如__str__、repr、__eq__等。關於dataclass的更多用法,可以參考官網。
值得一提的是我們在類中宣告的成員變數的型別注釋(str、int等)並不強制在建構函式中傳遞的值屬於這種型別。也就是說dataclasses構造物件時並不執行資料型別的檢查。
我們有時希望將乙個物件上的操作視為tuple上的操作,一種選擇是使用collections.namedtuple,但也存在更類似於dataclass的實現。如下:
from typing import namedtuple
class coordinate(namedtuple):
x: int
y: int
上述定義了乙個標準的類可以被當做tuple來使用,如下:
coordinate = coordinate(10, 15)
coordinate.x == coordinate[0] // true
coordinate.y == coordinate[1] // true
假如我們有乙個dataclass,需要驗證輸入資料是否符合型別注釋。在這種情況下,安裝第三方軟體包pydantic並將
from dataclasses import dataclass 替換為 from pydantic.dataclasses import dataclass 即可,如下:
from pydantic.dataclasses import dataclass
@dataclass
class person:
name: str
age: int
address: str
這將生成乙個類,該類具有根據成員變數宣告的型別進行輸入資料的解析和型別驗證。pydantic在執行時強制執行型別提示,並在資料無效時提供友好的錯誤提醒。
在某些情況下,我們需要生成一些容器中元素頻率的基本統計資訊。在這種情況下,您可以使用標準結構counter來接收iterabl並根據元素的頻率生成相應的統計資訊。
fwww.cppcns.comrom collections import counter
l = [1, 1, 2, 3, 4, 4]
frequencys = counter(l)
print(frequencys[1]) // ouput: 2
print(frequencys[2]) // ouput: 1
print(frequencys[2323]) // ouput: 0
counter也提供了一些其他方法,比如如most_common,用於檢索最常見的元素。
如果我們相對兩個list中的元素對做相應的函式處理,我們最容易想到的方法如下:
l1 = [1, 2, 3]
l2 = [4, 5, 6]
for (e1, e2) in zip(l1, l2):
f(e1, e2)
但是使用函式map可以讓**更加簡潔一些。
l1 = [1, 2, 3]
l2 = [4, 5, 6]
map(f, l1, l2)
有時候我們需要從乙個list中隨機選擇乙個元素,此時我們使用random.choice.如下所示:
from random import choice
l = [1, 2, 3]
random = choice(l)
如果我們需要隨機選擇多個元素呢?當然是使用random.choices.
from random import choices
l = [1, 2, 3, 4, 5]
random_elements = choices(l, k=3)
上述**中的引數k為我們隨機選擇元素的個數。
Python 分享10個PyCharm技巧
0.pycharm 常用快捷鍵 1.檢視使用庫原始碼 pycharm 主程式設計師在 stackoverflow 上答道 經常聽人說,多看原始碼。原始碼不僅能幫我們搞清楚執行機制,還能學習優秀的庫或者框架的最佳實踐。呼叫庫時,你可以在你好奇的幾乎任何地方點選 command b,就可以很方便的跳轉到...
python技巧分享(十一)
這是乙個系列文章,主要分享python的使用建議和技巧,每次分享3點,希望你能有所收穫。my iter iter my list for e in my iter print e,next my iter 1 banana 2 grape 3 pear 借助iter函式,傳入list生成乙個迭代器,...
整體優化的9個技巧
內容策略 網頁細節的優化和完善 制訂增加反向鏈結計畫以前的工作都做好了,最重要的就是要制訂乙個合理的增加反向鏈結計畫,然後選擇幾種合理的增加反向鏈結手段,然後按照計畫需序漸進的去做,獲得好排名就只是時間問題了。切記 不可短時間內迅速增加非常多的高質量的反向鏈結,比如短短兩三天,增加幾百個pr值都是4...