2017-08-16 24 views
2

我用C主要研究並花了很多時間來理解它的引擎蓋下實施。但我最近開始學習python。所以有很多怪癖的從C如何進行「的」和「沒有」 Python中陳述工作

這裏不同的是如何將「在」語句工作在Python?

if x in array: 
    #the usage of an in statement produces a boolean 
for x in array: 
    #the usage of an in statement produces an iterable 

另外,作爲一個側問題。 '不'可以放在布爾表達式的前面,類似於'!'在C中,或者它可以放在python中'in'語句的前面。這怎麼可能?

if not x == 5: 
    #makes sense because 'x == 5' evaluates to a boolean 
if x not in array: 
    #the statement 'in array' is not a boolean 
    #shouldn't it be 'if not x in array' 

這兩種可能性如何?它們的評估方式不應該一致嗎?現在,我相信這是因爲Python是一種解釋型語言,解釋者可以根據周圍的語法做不同的事情。

的解釋或鏈接到一個解釋是超級有幫助的,我一直無法找到任何解決該問題。

+2

'在'不具有許多共同之處''比兩種語法使用字母'i'和'N'以相同的順序等。 –

+0

'不在數組中x'也可以工作,但'不在'更具可讀性。 「in」和「not in」都是運營商。正如Martijn Pieters所說,「因爲...... in」是無關的,而「in」不是那裏的運營商;相反,它是'for'語法的一部分。這與Python作爲解釋型語言無關。 – Ryan

+1

如果你已經廣泛地研究了C,你應該對編譯器和詞法分析有所瞭解嗎? 好了,兩種類型的語句是在這個意義上完全不同......他們簡直是在一個完全不同的方式編譯.. – immortal

回答

8

您是令人費解!風馬牛不相及件語法。

一個是聲明,請參閱for statement文檔。該in是固定的語法的一部分:

for_stmt ::= 「for」 target_list 「in」 expression_list 「:」 suite 
       [「else」 「:」 suite] 

您使用for啓動線的那一刻,需要in一部分,就像:是必需的。並且不要將Python的for與C for循環混淆; Python的是For Each construct。因此,它不會產生可迭代的,它需要一個可迭代的輸入。

另一種是membership test operation,和運營商類型表達的:

運營商innot in測試會員資格。

這意味着適用於容器(不只是迭代)。

兩者都是Python的面向對象自然傾向嚴重,一些C不能做的。如果你想找到其他語言的等價物,看看C++,Java或C#,概念不是C.

for <expr> in <iterable>需要一個iterable object,東西,可以產生元素,此起彼伏。 C++有一個equivalent concept,在Java中有iteratorsstreams相似之處。

<expr> [not] in <expr>只需要在右邊的表達式的結果支持會員測試,但Python會回落到迭代,如果沒有明確的掛鉤,可爲成員資格測試。在not in中的not只是將in操作的結果顛倒過來。 C++和Java對此沒有標準抽象,每種不同的容器類型都實現自己的拼寫(在C++中大多數稱爲find,例如,set::findmap::find,而Java通常選擇contains變體,給你Set.contains()Map.containsKey())。

2

for x in array:與在C++ 11中引入的range based for loop沒有多大區別。在C++的語法也很相似:

int a[] = {0, 1, 2, 3, 4, 5}; 
for (int n : a) // the initializer may be an array 
    std::cout << n << ' '; 

的發言if x in a:for x in a:沒有太多的做對方,他們只是擁有同一個詞in,卻有着不同的含義。

你可以很容易地想象一個如何實現C++類似if x in a:功能 - 例如使用std::find。另一種方法是迭代容器並將每個元素與x進行比較。對於某些類型的容器可以有特定的過載,當然這會使這個性能更高,但重要的是它可以實現可以