分享9個好用的Python技巧

2022-09-21 16:54:13 字數 3934 閱讀 1416

目錄

本文是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...