這些鮮爲人知的Python功能,你值得擁有!

雲棲號資訊:【點擊查看更多行業資訊
在這裏您可以找到不同行業的第一手的上雲資訊,還在等什麼,快來!

image

發現Python中的新功能是筆者的一大愛好,每當遇到一些其他人沒有注意到的某個功能時,我都會興致勃勃地把它記錄下來。

這不,過去幾周我又瞭解到一些有趣的功能,例如StackOverflow上一些我不知道的功能。這些被低估和埋沒的實用功能,你真的值得擁有!

divmod

這個函數非常有用,它能對兩個數執行模除%運算,然後返回商和餘數。例如:

divmod(5, 2)
[Out]: (2, 1)

這只是在找到可以將2擬合爲5的次數,我們不需要拆分這個數,就可以得出商爲2,1爲餘數。對於計算返回進程運行所需的時間(以小時、分鐘和秒爲單位)特別有用,就像這樣:

start =datetime.datetime.now()    ...  # process code goes hereend =datetime.datetime.now()# we get the total runtime in seconds
runtime = (end - start).seconds  # wewill assume 30000# how many hours are in these secs, what are the remainingsecs?
hours, remainder = divmod(runtime, 3600)# now how many minutes and seconds arein our remainder?
mins, secs = divmod(remainder,60)print("{:02d}:{:02d}:{:02d}".format(hours, mins, secs))
[Out]: "08:00:08"

casefold

這是一個特別有趣的字符串方法,它的功能類似於lower。,但casefold試圖更積極地標準化更廣泛的字符。在大多數情況下,lower和casefold的行爲相同,但有時它們不相同:

"ς".casefold()  # both ς and σ are the Greek letter sigma[Out]:"σ"

相比之下,使用lower:

"ς".lower()  # however, lower recognizes them as different[Out]:"ς"
[Out]: False

在這裏,兩個sigma已經都是小寫。根據使用情況,它可能會按預期運行。但是,如果打算比較兩個等效的希臘語單詞,一個使用σ,另一個使用ς。儘管相同,但只有casefold才能讓我們準確地比較它們:

"ἑρμῆσ" == "ἑρμῆς"
[Out]:False
"ἑρμῆσ".lower() == "ἑρμῆς".lower()
[Out]:False
"ἑρμῆσ".casefold() == "ἑρμῆς".casefold()
[Out]:True

args, *kwargs

有時你可能會看到函數定義包含這兩個參數,例如 def func(x,y, args,* kwargs)。

它們都非常簡單,兩者都允許我們將多個值傳遞給一個函數,然後將其打包到一個生成器中。關於是否將列表/生成器傳遞給標準參數,其結果是這樣的:

def func(values):
    for x in values:
        print(x, end=" ")func([1,2, 3])
[Out]:  1 2 3  

使用* args 時,我們應該將每個值作爲新參數傳遞,而不是將它們全部包含在列表中。

def func(*values):
    for x in values:
        print(x, end=" ")func(1,2, 3)
[Out]: 1 2 3

注意,不需要輸入 args,只需輸入 values。由於單個星號,它被定義爲 args,這和使用的變量名稱無關。 args只是根據傳遞給函數的參數創建一個生成器對象。* kwargs創建字典。

因此,可以這樣使用名稱、關鍵字參數:

def func(**values):
    for x in values:
        print(f"{x}:{values[x]}")func(x=1, y=2, z=3)[Out]: x: 1
       y: 2
       z: 3

同樣,可以隨意調用變量,在這種情況下,使用 values。通過使用雙引號將其定義爲kwargs。

image

列表理解

理解表達式是必不可少的,這絕對是Python最有用的功能之一。最常見的是列表理解,絕大多數人都看過以下內容:

vals = [1, 2, 3, 4, 5][i**2 fori in vals]
[Out]: [1, 4, 9, 16, 25]

但不僅可以用方括號,你還能用幾乎完全相同的語法定義生成器表達式:

(i**2 for i in vals)
[Out]: <generator object<genexpr> at 0x7f0281730fc0>

當然,生成器中的每個元素僅在被調用時才輸出,我們可以使用list()來做到這一點:

list((i**2 for i in vals))
[Out]: [1, 4, 9, 16, 25]

只需對語法進行一點小的更改,甚至可以使用字典理解來構建字典:

{i: i**2 for i in vals}[Out]:{1: 1,
        2: 4,
        3: 9,
        4: 16,
        5: 25}

以上都是非常有趣的功能,特別是divmod和casefold,我最近才體驗過,你也一定要去試試呀。

【雲棲號在線課堂】每天都有產品技術專家分享!
課程地址:https://yqh.aliyun.com/live

立即加入社羣,與專家面對面,及時瞭解課程最新動態!
【雲棲號在線課堂 社羣】https://c.tb.cn/F3.Z8gvnK

原文發佈時間:2020-06-15
本文作者:讀芯術
本文來自:“讀芯術公衆號”,瞭解相關信息可以關注“讀芯術

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章