2011-06-03 133 views
2

我正在查看一些Web2py代碼。Python - 減少函數和|運算符

變量tokens是某種類型的字符串列表。更確切地說,它被定義爲tokens = form.vars.name.split(),其中form.vars.name是一個字符串。

下面的指令我的問題涉及:

query = reduce(lambda a,b:a&b,[User.first_name.contains(k)|User.last_name.contains(k) for k in tokens]) 

這裏是我的問題:

  1. 我知道lambda a,b:a&b定義的ab功能。什麼是a&b

  2. User.first_nameUser.first_name方法特定於Web2py?還是它存在於標準的Python?

  3. 這是什麼|運營商在?

  4. reduce函數做什麼?

+2

您有沒有機會檢查文檔? – 2011-06-03 16:56:50

+0

如果'contains(k)'返回一個布爾值,它可以被重寫爲'query = all(User.first_name.contains(k)或User.last_name.contains(k)for k in token)'。 – 2011-06-03 17:05:28

+0

無視我之前的評論,因爲'contains()'不會返回一個布爾值,並且按位運算符已被重新加載用於其他目的。查看Jochen Ritzel的更多答案。 – 2011-06-03 18:27:26

回答

7
  1. 在web2py中&|不按位和/或在這裏,但用於構建代表一個數據庫查詢的特殊對象!它們對應於ANDOR在SQL語句中
  2. containsWeb2Pys DAL
  3. 部分見1
  4. 減少是fold,一個非常基本的高階功能,基本上減少了列表的結果,使用給出的函數。
+0

非常感謝。 – 2011-06-03 17:24:14

+2

我很擔心這是否很好地利用了操作符重載。一方面它可以讓用戶簡潔地陳述他們想要做什麼。另一方面,沒有經驗的讀者會完全困惑,因爲操作符重載的意義如此不同以至於操作符的意義不同(至少我相信這是不常見的)。 – 2011-06-03 19:28:32

0
  1. Bitwise and
  2. 我相信包含,在這種情況下,或多或少映射到__contains__,但它確實出現在Py3k docs
  3. Bitwise or
  4. reduce遍歷一個可迭代的對象(參數2)並在所有元素上調用傳遞的函數(參數1)。它返回總值。
+0

非常感謝。 – 2011-06-03 17:26:46

0
  1. &是按位與操作。編寫代碼的人幾乎肯定意味着and,但對於布爾值,結果是相同的。

  2. .contains()是由web2py提供的方法。 a.contains(b)更爲Python編寫爲b in a

  3. |是按位或運算符。再次,他們可能意味着or

  4. reduce將第一個參數作爲第一個參數給第二個參數中的第一個參數,從左到右,首先是前兩個元素,然後是計算結果和第三個元素等。

+0

非常感謝。 – 2011-06-03 17:27:01