2012-02-04 78 views
1

我正在寫一個使用Tkinter的相對簡單的程序,它是二進制,十進制和十六進制的轉換器。我沒有使用數學函數中構建的任何Python,因爲我認爲這是一種很好的方法,不僅可以使用類和對象,還可以使用Tkinter。Python中的列表成員檢查3

我有一個方法,通過檢查它是否包含任何數字2-9,這將使其無效,檢查以確保二進制字符串是有效的。

要做到這一點,我使用嵌入for循環

bits = '011101' #self.input_str.get() 
bit_list = [i for i in bits] 
ill_bits = ['2', '3', '4', '5', '6', '7', '8', '9'] 

for bit in bit_list: 

    if bit in ill_bits: 
     print('yes') 
     #self.output_disp.delete(0.0, END) 
     #self.output_disp.insert(0.0, "That bit string is invalid") 
    else: 
     print('no') 
     #self.from_binary(self.dec_bttn, self.hex_bttn)` 

兩個print()函數實際上不是計劃的一部分內的if聲明,他們在那裏爲我保留測試不同的事情。註釋掉的部分是我想在Tkinter應用程序的測試區域運行的代碼,作爲有效性測試的結果。

這裏發生的事情是,如果在測試的最後位兩個列表中找到了

self.output_disp.delete(0.0, END) 
self.output_disp.insert(0.0, "That bit string is invalid") 

只運行。例如,一個位串:111019將在文本區域中顯示That bit string is invalid,但111911不會。雖然當9迭代通過兩個位串會在控制檯打印yes,僅在最後的點一個與9將運行代碼的兩行開始self.output_disp ....

回答

1

你的流量是一點點關閉。您需要在第一次故障後中斷,並將else塊與for關聯,而不是if

+0

我實際上並不確定你的意思,請你介意一點。一個else語句可以與for循環分開,一個人怎麼做? – Icsilk 2012-02-04 03:12:28

+0

將它縮進與'for'塊相同的級別。在Python中,'if'不是唯一可以擁有'else'塊的語句。 – 2012-02-04 03:13:33

+0

我試着將else塊(有和沒有其他塊)與'for'聯繫起來,它似乎沒有捕獲任何共享的成員資格。我想我沒有做到你想要完成你的評論。 – Icsilk 2012-02-04 03:37:18

2

你說你是Python的新手,所以我希望你不介意一些提示。

真的沒有理由去做[i for i in bits]。這沒有錯,但它不是Pythonic。如果你想要一個列表,這是什麼,你可以將字符串傳遞給list函數。如果你想要一個字符串的副本,你可以使用slice操作符。

bit_list = list(bits) # Convert to list 
bit_list = bits[:] # Shallow copy of a string 

雖然好東西,你是不需要一個副本。


一個非常有用的功能叫做any。你可以用它一次檢查一切。而且,整數比字符串更容易使用。將這些位轉換爲整數意味着您不需要該字符串列表。

bits = '011101' 
ill_bits = range(2, 9+1) 
if any(int(bit) in ill_bits for bit in bits): 
    print('Bad') 
else: 
    print('Good') 

基本上它說,如果有位在兩個bitsill_bits數量是壞的。否則,這很好。

+0

乾草,謝謝。這很瞭解。我不知道「任何」命令。我會玩弄它來熟悉自己。再次感謝 – Icsilk 2012-02-04 03:48:28

+0

'any'是**功能**。爲了將來的參考,當你談論編程時,「命令」實際上幾乎從不是正確的詞 – 2012-02-04 06:34:42

+1

你可以使用'ill_bits =「23456789」'並且擺脫int調用。或者甚至「如果不是全部(比特位爲」01「):' – WolframH 2012-02-04 09:17:38

-1

只是提供一個替代的解決方案,要做到這一點的最簡單的辦法是使用正則表達式:

import re 
if re.search('[2-9]', bits): 
    print('yes') 
else: 
    print('no') 
+0

是的,謝謝,夥計。我花了很多時間來發布這個問題。我很感激。希望有一天我能幫助你們中的一員。 – Icsilk 2012-02-04 03:49:35

0

取而代之的是循環的,我會做:

if [bit for bit in bit_list if bit in ill_bits]: 
    raise YourException("illegal bits present") 

# now that all bits are legal, fill in the result 

下面是它如何工作的:當所有比特都好時,if bit in ill_bitsFalse,對於每個bit和所產生的[...]是空的; bool([]) is False,因此if [...]:只有在你有壞位時才被觸發。

如果你有非常大的bit_list,可以優化這一點有:

if [b for b in set(bit_list) if b in ill_bits]: 
    raise .... 

如果您ill_bits可能非常大,說如果你實習基地,999999運算,然後ill_bits應該是一組,而不是一個列表。