分享9個(gè)好用的Python技巧
1.引言
本文是Python生態(tài)系統(tǒng)中一些有用技巧的分享。大多數(shù)技巧只是使用標(biāo)準(zhǔn)庫中的包,但其他一些技巧會(huì)涉及一些第三方包。
在開始閱讀本文內(nèi)容之前,我們首先來回顧一下Python中的Iterables的概念。
根據(jù)Python標(biāo)準(zhǔn)文檔,Iterable的概念如下:
一種能夠一次返回一個(gè)成員的對(duì)象。
iterables的示例包括:
所有序列類型(如list、str和tuple)一些非序列類型,如dict、文件對(duì)象以及類的實(shí)現(xiàn)中定義了__iter__()方法
Iterables是一個(gè)需要我們牢記的概念,因?yàn)榻酉聛砦覀冋故镜脑S多技巧都使用itertools包。
itertools模塊提供了一些函數(shù),用于接收Iterable對(duì)象,而不僅僅是打印逐個(gè)對(duì)象。
2.Trick 1
在工作學(xué)習(xí)中,我們經(jīng)常會(huì)需要使用一個(gè)簡(jiǎn)單的函數(shù)來實(shí)現(xiàn)從一個(gè)list來生成新的list,set或dict.此時(shí)我們就會(huì)用到iterables概念。
舉例來說:
生成List:
names = ['John', 'Bard', 'Jessica' 'Andres'] lower_names = [name.lower() for name in names]
生成Set:
names = ['John', 'Bard', 'Jessica' 'Andres'] lower_names = {name.lower() for name in names}
生成Dict:
names = ['John', 'Bard', 'Jessica' 'Andres'] lower_names = {name:name.lower() for name in names}
個(gè)人建議:
僅當(dāng)for語句、函數(shù)調(diào)用和方法調(diào)用的數(shù)量較少時(shí)使用。
3.Trick 2
有時(shí),我們需要獲得兩個(gè)列表對(duì)象之間的所有可能組合。
我們首先想到的實(shí)現(xiàn)可能如下:
l1 = [1, 2, 3] l2 = [4, 5, 6] combinations = [] for e1 in l1: for e2 in l2: combinations.append((e1, e2))
或者簡(jiǎn)化一下,如下:
combinations = [(e1, e2) for e1 in l1 for e2 in l1]
上述實(shí)現(xiàn)已經(jīng)很簡(jiǎn)潔了,但標(biāo)準(zhǔn)庫itertools提供product函數(shù),從而提供了相同的結(jié)果。如下所示:
from itertools import product l1 = [1, 2, 3] l2 = [4, 5, 6] combinatios = product(l1, l2)
4.Trick3
假設(shè)有一個(gè)元素列表,我們需要在每對(duì)相鄰元素之間比較或應(yīng)用一些操作,這有時(shí)稱為2個(gè)元素的滑動(dòng)窗口。我們可以采用以下方式:
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)
運(yùn)行結(jié)果如下:
(1, 2) (2, 3) (3, 4) (4, 5) (5, 6)
5.Trick4
有時(shí),我們會(huì)需要一個(gè)類來存儲(chǔ)信息,但是如果我們覺得創(chuàng)建一個(gè)類并定義其__init__()函數(shù)太麻煩時(shí),我們不妨選擇使用dataclass。如下所示:
from dataclasses import dataclass @dataclass class Person: name: str age: int address: str
上述代碼創(chuàng)建了一個(gè)具有默認(rèn)構(gòu)造函數(shù)的類,該類以與聲明相同的順序接收相應(yīng)字段的賦值。
person = Person(name='John', age=12, address='nanjing street')
dataclass的另一個(gè)優(yōu)點(diǎn)是,默認(rèn)情況下,會(huì)生成特殊方法,如__str__、repr、__eq__等。關(guān)于dataclass的更多用法,可以參考官網(wǎng)。
值得一提的是我們?cè)陬愔新暶鞯某蓡T變量的類型注釋(str、int等)并不強(qiáng)制在構(gòu)造函數(shù)中傳遞的值屬于這種類型。也就是說dataclasses構(gòu)造對(duì)象時(shí)并不執(zhí)行數(shù)據(jù)類型的檢查。
6.Trick5
我們有時(shí)希望將一個(gè)對(duì)象上的操作視為tuple上的操作,一種選擇是使用collections.namedtuple,但也存在更類似于dataclass的實(shí)現(xiàn)。如下:
from typing import NamedTuple class Coordinate(NamedTuple): x: int y: int
上述定義了一個(gè)標(biāo)準(zhǔn)的類可以被當(dāng)做tuple來使用,如下:
coordinate = Coordinate(10, 15) coordinate.x == coordinate[0] // True coordinate.y == coordinate[1] // True
7.Trick6
假如我們有一個(gè)dataclass,需要驗(yàn)證輸入數(shù)據(jù)是否符合類型注釋。在這種情況下,安裝第三方軟件包pydantic并將
from dataclasses import dataclass 替換為 from pydantic.dataclasses import dataclass 即可,如下:
from pydantic.dataclasses import dataclass @dataclass class Person: name: str age: int address: str
這將生成一個(gè)類,該類具有根據(jù)成員變量聲明的類型進(jìn)行輸入數(shù)據(jù)的解析和類型驗(yàn)證。Pydantic在運(yùn)行時(shí)強(qiáng)制執(zhí)行類型提示,并在數(shù)據(jù)無效時(shí)提供友好的錯(cuò)誤提醒。
8.Trick7
在某些情況下,我們需要生成一些容器中元素頻率的基本統(tǒng)計(jì)信息。在這種情況下,您可以使用標(biāo)準(zhǔn)結(jié)構(gòu)Counter來接收iterable并根據(jù)元素的頻率生成相應(yīng)的統(tǒng)計(jì)信息。
from 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,用于檢索最常見的元素。
9.Trick8
如果我們相對(duì)兩個(gè)list中的元素對(duì)做相應(yīng)的函數(shù)處理,我們最容易想到的方法如下:
l1 = [1, 2, 3] l2 = [4, 5, 6] for (e1, e2) in zip(l1, l2): f(e1, e2)
但是使用函數(shù)map可以讓代碼更加簡(jiǎn)潔一些。
l1 = [1, 2, 3] l2 = [4, 5, 6] map(f, l1, l2)
10.Trick9
有時(shí)候我們需要從一個(gè)list中隨機(jī)選擇一個(gè)元素,此時(shí)我們使用random.choice.如下所示:
from random import choice l = [1, 2, 3] random = choice(l)
如果我們需要隨機(jī)選擇多個(gè)元素呢?當(dāng)然是使用random.choices.
from random import choices l = [1, 2, 3, 4, 5] random_elements = choices(l, k=3)
上述代碼中的參數(shù)k為我們隨機(jī)選擇元素的個(gè)數(shù)。
11.總結(jié)
本文重點(diǎn)介紹了在python中9個(gè)和迭代相關(guān)的使用技巧,可以方便提升大家的工作效率。
到此這篇關(guān)于分享9個(gè)好用的Python技巧的文章就介紹到這了,更多相關(guān)Python技巧內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python庫textract提取各種文檔類型中文本數(shù)據(jù)
Python的textract庫是一個(gè)強(qiáng)大的工具,它可以從各種文檔類型中提取文本數(shù)據(jù),無論是PDF、Word文檔、圖片還是其他格式的文件,textract都可以輕松地將文本提取出來,本文將詳細(xì)介紹textract的功能和用法,并提供豐富的示例代碼來幫助大家深入了解2024-01-01詳解Python中的偏函數(shù)(Partial Functions)
Python中的偏函數(shù)是來自函數(shù)式編程的一個(gè)強(qiáng)大工具,它的主要目標(biāo)是減少函數(shù)調(diào)用的復(fù)雜性這個(gè)概念可能起初看起來有點(diǎn)困難理解,但一旦你明白了它的工作方式,它可能會(huì)成為你的編程工具箱中的重要組成部分,文中有相關(guān)的代碼介紹,需要的朋友可以參考下2023-06-06把vgg-face.mat權(quán)重遷移到pytorch模型示例
今天小編就為大家分享一篇把vgg-face.mat權(quán)重遷移到pytorch模型示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-12-12python3 解決requests出錯(cuò)重試的問題
這篇文章主要介紹了python3 解決requests出錯(cuò)重試的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-04-04Python信息處理庫Talon自動(dòng)抽取簽名信息
這篇文章主要為大家介紹了Python信息處理庫Talon自動(dòng)抽取簽名信息實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01pytorch讀取圖像數(shù)據(jù)轉(zhuǎn)成opencv格式實(shí)例
這篇文章主要介紹了pytorch讀取圖像數(shù)據(jù)轉(zhuǎn)成opencv格式實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-06-06