簡體   English   中英

如何在編碼時編寫更多“pythonic”?

[英]How can I write more “pythonic” when coding like the following?

res = sum((i+j)%k == 0 for x, i in enumerate(a) for j in a[x+1:])

其中a是一個數組。

我無法理解這段代碼在做什么.. i in enumerate(a) for j in a[x+1:]基本上是為了節省空間而在該行內的for循環?

另外我怎么寫這樣的代碼? 我正在努力學習python。

這是對sum函數調用內的生成器表達式。 sum只是添加了東西,所以讓我們看一下生成器表達式:

(i+j)%k == 0 for x, i in enumerate(a) for j in a[x+1:]

(i+j)%k == 0部分是布爾表達式。 如果i+j在被k潛水時具有0的余數,則為真,否則為假。 作為一個巧妙的小技巧, True值在python中的數值為1 ,而False的數值為0 所以這基本上只算數。

for x, i in enumerate(a) for j in a[x+1:]

這本質上是一個嵌套的for循環。

for x, i in enumerate(a):
    for j in a[x+1:]:

enumerate是一個從迭代與其索引配對產生項的函數,因此[a, b, c]變為[(0, a), (1, b), (2, c)]

將它們全部粘在一起,並且此代碼計算列表中元素對的數量,使得它們的總和可被k整除

您可以按如下方式“展開”代碼:

counter=0   # emulates `sum`
for x, i in enumerate(a):
    for j in a[x+1:]:
       counter += (i+j)%k == 0

所以計算(i+j)出現可以被k整除,避免計算相同的一半和相同的元素(只計算上面的矩陣三角形)

當您從另一個可迭代或可迭代迭代中創建列表時,列表/生成器理解更好/更快,更簡潔,如下所示:您創建了一個布爾值列表(0或1),您可以將它們sum加以計算True的出現次數。

但是不要濫用它們: 正確使用列表推導 - python

有時一個簡單的循環調用n次函數會更好(當需要副作用時)。

如果使用不明智,他們可能會成為一個理解的噩夢(特別是其中有副作用的單行)

這些被稱為理解。 enumerate遍歷可迭代對象並返回元組(a, b) ,其中a是可迭代中的索引, b是該索引處的對象。

這是一個很好的pythonic代碼。 至於學習如何理解/寫這樣的東西,練習和閱讀python文檔將是一個很好的起點。 請記住,這只是語法糖,你可以在多行中做同樣的事情,它幾乎完全相同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM