2014-10-27 34 views
0

有人能解釋爲什麼一個搜索如下範圍內搜索VS列表iterables

2,2,2,2(20)

得到的結果爲(2,2,2,真)

和範圍5,4,3,19(20)

產生一個結果作爲(5,4,3,真)

像 「蝙蝠俠」 「標籤」 的搜索給出假,而「蝙蝠俠」中的「蝙蝠」是真實的。同樣,爲什麼在上述搜索中沒有保留這個訂單。另外我想解釋一下它給出的結果。

回答

4

當你這樣做:

2,2,2,2 in range(20) 

Python看到這樣說:

2,2,2,(2 in range(20)) 

你希望它是用這種方法處理:

(2,2,2,2) in range(20) 

但由於Python是不是面向矢量的,它不能像那樣工作。如果你喜歡用向量來編程,NumPy更合適,但對於基本的Python比較,它不會像你想象的那樣工作。

至於這樣的:

"tab" in "batman" 

當然它返回false,因爲字符串"tab"是不是字符串"batman"英寸這是一個字符串搜索,而不是搜索字符(即不尋找字符)。

+0

的當然'在'[True,True,False]'中。 – 2014-10-27 05:18:38

1

2,2,2,2 in range(20) 構造一個元組具有四個元件,前三個是2,而最後是布爾表達式2 in range(20)計算結果爲True

在Python中,逗號創建一個元組。 這有點令人困惑。

所以,2,將創建一個新的單值元組
雖然,(2)將返回一個整數。

1

in是一個布爾表達式。所以當你輸入2,2,2,2 in range(20)你正在做什麼創建一個三個2的元組和布爾表達式2 in range(20)的結果是True

1

in調用對象的方法__contains__,所以

2,2,2,2 in range(20) 

裝置

2,2,2,(range(20).__contains__(2)) 

5,4,3,19 in range(20) 

裝置

5,4,3,(range(20).__contains__(19)) 

因此返回的對象range*決定in的行爲方式。

字符串對於__contains__有不同的行爲。它用作子字符串搜索。

2,2,2,2 in range(20)是一個不尋常的表達。這是可能的,你的意思是這樣

all(x in range(20) for x in (2,2,2,2)) 

*在Python2 range [在「標籤」下,在「蝙蝠俠」對於C]`結果返回list和Python3它返回一個range對象

+0

優秀的解釋 – 2014-10-27 15:09:13