2015-12-07 48 views
-3

編程時總是困擾我的是,我編程的語言不支持靈活的or操作符。如何在IF語句等效項中使用OR

拿這段代碼寫在標準的編碼語法:

if(variable == (value1 or value2 or value3)) { ... } 

這當然,不工作,爲了得到你會做這樣的事情所期望的結果:

if(
    variable = value1 or 
    variable = value2 or 
    variable = value3 
) { ... } 

在我看來,這是低效的(或者只是簡單的醜陋)。

我的問題:是否可以製作一個片段而不會像片段二那樣低效?

(目前這屬於Python)的

+0

這不是「標準編碼語法」,而選項2沒有任何效率問題。 – user2357112

+0

這是我所知道的最常用的語言(PHP,Javascript,C++等)。 – Krii

+2

哦,順便說一下,[Perl 6實際上有你想要的功能](http://doc.perl6.org/type/Junction)。據說Perl 6在聖誕節前後發佈了一個1.0版本,所以這很好。 – user2357112

回答

4

在這裏,您將使用any

if any(variable==value for value in (value1, value2, value3)): 

你也可以使用in這個簡單的例子。

if variable in (value1, value2, value3): 

如果這是一個效率問題,in要快得多,你可以從這個拆卸見。

dis.dis('1 in (2, 3, 4, 1)') 
    1   0 LOAD_CONST    0 (1) 
       3 LOAD_CONST    4 ((2, 3, 4, 1)) 
       6 COMPARE_OP    6 (in) 
       9 RETURN_VALUE 

dis.dis('any(1==x for x in (2, 3, 4, 1))') 
    1   0 LOAD_NAME    0 (any) 
       3 LOAD_CONST    0 (<code object <genexpr> at 0x036C5200, file "<dis>", line 1>) 
       6 LOAD_CONST    1 ('<genexpr>') 
       9 MAKE_FUNCTION   0 
      12 LOAD_CONST    6 ((2, 3, 4, 1)) 
      15 GET_ITER 
      16 CALL_FUNCTION   1 (1 positional, 0 keyword pair) 
      19 CALL_FUNCTION   1 (1 positional, 0 keyword pair) 
      22 RETURN_VALUE 

所以,in是偉大的,如果你只是做一個簡單的比較的變量,但any允許更多的靈活性,對於與any一些可能的例子,這不是可能的in(注:這是一個不好的例子,但週一晚了),看看這個:

if any(0<x<y for y in (1, 3, 5, 6, -1)) 
+0

這不適合我。我的代碼:'如果x [len(x)-1] [ - 1:] in(「。」,「?」,「!」):x [len(x)-1] + =「。」'where 'x'等於用戶輸入字符串。 – Krii

+0

什麼是'x'? 'input()'的結果?如果是這樣,那是一個不同的問題。它也不會工作。 –

+0

是的。 'x'是'input()'的結果。 – Krii