溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

好用Python技巧有哪些

發(fā)布時間:2021-12-13 13:32:30 來源:億速云 閱讀:102 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹“好用Python技巧有哪些”,在日常操作中,相信很多人在好用Python技巧有哪些問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”好用Python技巧有哪些”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

1.引言

本文是Python生態(tài)系統(tǒng)中一些有用技巧的分享。大多數(shù)技巧只是使用標準庫中的包,但其他一些技巧會涉及一些第三方包。
在開始閱讀本文內(nèi)容之前,我們首先來回顧一下Python中的Iterables的概念。

根據(jù)Python標準文檔,Iterable的概念如下:

一種能夠一次返回一個成員的對象。

iterables的示例包括:

所有序列類型(如list、str和tuple)一些非序列類型,如dict、文件對象以及類的實現(xiàn)中定義了__iter__()方法

Iterables是一個需要我們牢記的概念,因為接下來我們展示的許多技巧都使用itertools包。

itertools模塊提供了一些函數(shù),用于接收Iterable對象,而不僅僅是打印逐個對象。

2.Trick 1

在工作學習中,我們經(jīng)常會需要使用一個簡單的函數(shù)來實現(xiàn)從一個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 = {name.lower() for name in names}

生成Dict:

names = ['John', 'Bard', 'Jessica' 'Andres']
lower_names = {name:name.lower() for name in names}

個人建議:

僅當for語句、函數(shù)調(diào)用和方法調(diào)用的數(shù)量較少時使用。

3.Trick 2

有時,我們需要獲得兩個列表對象之間的所有可能組合。
我們首先想到的實現(xiàn)可能如下:

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]

上述實現(xiàn)已經(jīng)很簡潔了,但標準庫itertools提供product函數(shù),從而提供了相同的結(jié)果。如下所示:

from itertools import product
l1 = [1, 2, 3]
l2 = [4, 5, 6]
combinatios = product(l1, l2)

4.Trick3

假設(shè)有一個元素列表,我們需要在每對相鄰元素之間比較或應(yīng)用一些操作,這有時稱為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)

運行結(jié)果如下:

(1, 2)
(2, 3)
(3, 4)
(4, 5)
(5, 6)

5.Trick4

有時,我們會需要一個類來存儲信息,但是如果我們覺得創(chuàng)建一個類并定義其__init__()函數(shù)太麻煩時,我們不妨選擇使用dataclass。如下所示:

from dataclasses import dataclass
@dataclass
class Person:
  name: str
  age: int
  address: str

上述代碼創(chuàng)建了一個具有默認構(gòu)造函數(shù)的類,該類以與聲明相同的順序接收相應(yīng)字段的賦值。

person = Person(name='John', age=12, address='nanjing street')

dataclass的另一個優(yōu)點是,默認情況下,會生成特殊方法,如__str__、repr、__eq__等。關(guān)于dataclass的更多用法,可以參考官網(wǎng)。

值得一提的是我們在類中聲明的成員變量的類型注釋(str、int等)并不強制在構(gòu)造函數(shù)中傳遞的值屬于這種類型。也就是說dataclasses構(gòu)造對象時并不執(zhí)行數(shù)據(jù)類型的檢查。

6.Trick5

我們有時希望將一個對象上的操作視為tuple上的操作,一種選擇是使用collections.namedtuple,但也存在更類似于dataclass的實現(xiàn)。如下:

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

7.Trick6

假如我們有一個dataclass,需要驗證輸入數(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

這將生成一個類,該類具有根據(jù)成員變量聲明的類型進行輸入數(shù)據(jù)的解析和類型驗證。Pydantic在運行時強制執(zhí)行類型提示,并在數(shù)據(jù)無效時提供友好的錯誤提醒。

8.Trick7

在某些情況下,我們需要生成一些容器中元素頻率的基本統(tǒng)計信息。在這種情況下,您可以使用標準結(jié)構(gòu)Counter來接收iterable并根據(jù)元素的頻率生成相應(yīng)的統(tǒng)計信息。

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

如果我們相對兩個list中的元素對做相應(yīng)的函數(shù)處理,我們最容易想到的方法如下:

l1 = [1, 2, 3]
l2 = [4, 5, 6]
for (e1, e2) in zip(l1, l2):
  f(e1, e2)

但是使用函數(shù)map可以讓代碼更加簡潔一些。

l1 = [1, 2, 3]
l2 = [4, 5, 6]
map(f, l1, l2)

10.Trick9

有時候我們需要從一個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)

上述代碼中的參數(shù)k為我們隨機選擇元素的個數(shù)。

到此,關(guān)于“好用Python技巧有哪些”的學習就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI