讓python程式設計更加絲滑的一些小技巧

2021-10-09 21:54:30 字數 3467 閱讀 2404

翻譯自10 smooth python tricks for python gods

即使python語法十分簡單以至每個人都可以學習,然而掌握python的程度卻因人而異——python容易學習卻難以精通。在python中,通常可以通過不同方法來完成同一任務,然而犯錯卻十分容易,此外由於你不知道python標準庫已經實現了某些功能而自己造輪子——浪費時間與精力。

令人煩惱的是python標準庫太過龐大,這是因為python的生態巨大到令人生畏。python模組已經超過2^15 位元組,本文將介紹python標準庫的幾個技巧。

直接使用迴圈可能是最基本的方法,但這種方法是笨重而繁瑣的。在python中,直接使用切片操作來達到逆序的效果,示例如下:

a =

"!dlrow olleh"

print

(a)# !dlrow olleh

print

(a[::-

1])# hello world!

在大部分程式語言中,想要將乙個序列的內容賦值給對應的一套變數,通常需要使用迴圈來迭代或者使用索引。然而在python中,我們可以使用更加炫酷和迅速的方式來完成這一操作,只需要將變數設為與序列內容長度相同的一套變數即可:
aarray =[1

,2,3

,4]one, two, three, four = aarray

print

(three)

# 3

如果想要精通python,熟悉itertools模組是十分必要的。itertools模組允許你不斷解決有關迭代的問題。使用該模組不僅能讓你容易的寫出複雜的迴圈,還可以使**簡單明瞭,程式設計過程也將更加愉快。本文將介紹乙個簡單的例子(將可迭代物件序列化為一維列表):
c =[[

1,2]

,[3,

4],[

5,6]

]# let's convert this matrix to a 1 dimensional list.

import itertools as it

newlist =

list

(it.chain.from_iterable(c)

)

迭代式地unpacking費時費力,python有許多十分cool的方式來unpack列表。例如使用*, 這個符號能將未指定的值賦值到乙個新的列表:
a,

*b, c =[1

,2,3

,4,5

,6]print

(a, b, c, sep=

'\n'

)# 1

# [2, 3, 4]

# 5

熟悉enumerate是很有必要的,它能讓你同時使用列表的索引和索引對應值。當使用陣列而非複雜的資料結構時,該函式是非常有用的:
for i,w in enumerate(array):

print(i, w)

alist =[5

,10,15

]for i,w in

enumerate

(alist)

:print

(i,w)

# 0 5

# 1 10

# 2 15

a = [0, 1, 2, 3, 4, 5]

lastthree = slice(-3, none)

slice(-3, none, none)

print(a[lastthree])

a =[0

,1,2

,3,4

,5]lastthree =

slice(-

3,none

)slice(-

3,none

,none

)print

(a[lastthree]

)# [3, 4, 5]

當然可以在for迴圈中容易地對列表的相鄰元素進行分組,尤其是使用zip()時,但這當然不是最好的處理方式。

為了使事情變得更加輕鬆和快捷,我們可以使用zip編寫乙個lambda表示式,該表示式將對我們的相鄰列表進行分組,如下所示:

a =[1

,2,3

,4,5

,6] group_adjacent =

lambda a, k:

zip(*(

[iter

(a)]

* k)

) group_adjacent(a,3)

# [(1, 2, 3), (4, 5, 6)] 的生成器

group_adjacent(a,2)

# [(1, 2), (3, 4), (5, 6)] 的生成器

group_adjacent(a,

1)

g =

(x **

2for x in

range(4

,10))

print

(next

(g))

# 16

print

(next

(g))

# 25

標準庫中另乙個很棒的模組是collections,本文想介紹的是collections中的counter。使用counter,我們可以輕鬆獲得列表的計數。這對於獲取資料中的值總數,獲取資料的空計數以及檢視資料的唯一值很有用。此時你可能會有疑問:

為什麼不直接使用pandas?

使用pandas當然可以完成此類操作,然而你需要額外安裝pandas庫,此外counter包含許多pandas series不具有的功能。

a = collections.counter([1

,1,2

,2,3

,3,3

,3,4

,5,6

,7])

a counter(

) a.most_common(1)

[(3,

4)] a.most_common(3)

[(3,

4),(

1,2)

,(2,

2)]

collection模組中的dequeue具有一些十分有趣的特徵,嘗試下面幾行**來使用這種資料結構:
import collections

q = collections.deque() 1

) 2) q.extend([3

,4])

q.extendleft([5

,6])

q.pop(

)q.popleft(

)q.rotate(3)

q.rotate(-3

)print

(q)

這些是一些十分有用的python技巧,這些技巧往往用途廣泛且有用。python標準庫是十分值得大家探索和學習的!

讓Python更加充分的使用Sqlite3

我最近在涉及大量資料處理的專案中頻繁使用 sqlite3。我最初的嘗試根本不涉及任何資料庫,所有的資料都將儲存在記憶體中,包括字典查詢 迭代和條件等查詢。這很好,但可以放入記憶體的只有那麼多,並且將資料從磁碟重新生成或載入到記憶體是乙個繁瑣又耗時的過程。我決定試一試sqlite3。因為只需開啟與資料...

讓 Python 更加充分的使用 Sqlite3

我最近在涉及大量資料處理的專案中頻繁使用 sqlite3。我最初的嘗試根本不涉及任何資料庫,所有的資料都將儲存在記憶體中,包括字典查詢 迭代和條件等查詢。這很好,但可以放入記憶體的只有那麼多,並且將資料從磁碟重新生成或載入到記憶體是乙個繁瑣又耗時的過程。我決定試一試sqlite3。因為只需開啟與資料...

讓Python更加充分的使用Sqlite3

我最近在涉及大量資料處理的專案中頻繁使用 sqlite3。我最初的嘗試根本不涉及任何資料庫,所有的資料都將儲存在記憶體中,包括字典查詢 迭代和條件等查詢。這很好,但可以放入記憶體的只有那麼多,並且將資料從磁碟重新生成或載入到記憶體是乙個繁瑣程式設計客棧又耗時的過程。我決定試一試sqlite3。因為只...