2013-04-09 26 views
2

我正在翻譯Python代碼到C,以便利用HPC系統上可用的並行(這是一個痛苦的過程),我遇到了Python中的條件原始程序員使我困惑如果len(列表)在Python

if rnum <> current_res: 
     alim = 0 
     if len(f): alim = f[-1] 

如果len(f)滿足怎麼辦?我無法在網上找到這種使用這種方式的慣例。我想這是一個糟糕的編程習慣。

任何幫助將不勝感激!

+9

'<>'早已棄用。改用'!='。 – 2013-04-09 14:53:58

回答

12

在Python中,被視爲'空'的值(例如數字0)在布爾上下文中被視爲False,否則爲True。

因此,如果f有長度,則len(f)爲真,否則爲空。如果f是一個標準的Python序列類型則代碼可以被簡化爲:

if f: alim = f[-1] 

因爲這同樣適用於子序列;空是假的,具有非零長度意味着它是真的。

有關所有重要細節,請參閱Python文檔中的Truth Value Testing

請注意,<>已被棄用;你應該真的使用!=來代替。

+0

謝謝你的幫助! – mjswartz 2013-04-09 15:03:58

+0

假設'len(f)'與f具有相同的真值是否安全?當然這取決於'f' – Awalias 2013-04-09 15:04:39

+0

@Awalias:**如果**是自定義序列類型,那麼做出這樣的假設是不安全的。 – 2013-04-09 15:05:53

7

在大多數情況下if len(f):將是同樣的事情if f: ......

的原因是因爲如果f沒有長度,它將返回0這是一個falsy值。其實,真理實際測試檢查對象的長度(__len__under some circumstances.

4

if len(f) 

將轉化:

if len(f) != 0 

或在這種情況下,由於len(f)從不爲負,

if len(f) > 0 
+0

嚴格地說,只有'!= 0',但由於不能有負長度序列,所以它在功能上並不相關。 – 2013-04-09 14:58:40

+0

@ sr2222,我已經澄清了答案。它們在這裏是等價的,因爲這個例子是'len',並且我把它包含了,因爲'len> 0'更具可讀性。 – askewchan 2013-04-09 15:01:37

+0

@ sr2222 - 但是否可以有一個負長度的其他對象?文檔說結果*應該是一個'integer> = 0',但我不知道這意味着它被強制執行或者只是預期... – mgilson 2013-04-09 15:01:39

相關問題