2012-04-23 30 views
0

本地小學有以下形式的圖書證ID:ID以「s」開頭(對於「學生」),長度只有6個字符,包括「s」;或者他們以「t」開頭(對於「老師」)並且沒有長度要求。下面的函數應該得到一個有效的ID,但它缺少它的條件。python:雖然有多個布爾檢驗的陳述

def get_valid_id(): 
    '''Prompt the user for and return a valid library card ID.''' 

    s = raw_input("Enter ID: ") 
    while ?????: 
     s = raw_input("Try again: ") 
    return s 

以下是while循環的一些可能條件。對於每一個,請指出它是否會使該功能正常工作。

  1. 這種情況會使功能正常工作嗎? (s[0] != "s") and (len(s) != 6) and (s[0] != "t")

  2. 這種情況會使功能正常工作嗎? not((s[0] == "s" and len(s) == 6) or (s[0] == "t"))

我不知道爲什麼對1的答案是否定的和2個是肯定的。我認爲第一個問題會起作用,因爲它是全部「和」,第二個問題我認爲「或」不會使它工作..有人可以向我解釋這個嗎?

+4

德摩根定律。 – 2012-04-23 04:50:59

+0

我們沒有在課堂上學習。我在python的初級班級。作業是否是 – alicew 2012-04-23 05:02:15

+1

?這很好,如果是這樣,我們應該這樣標記它。 – Shep 2012-04-23 05:07:31

回答

4

正如有人評論說,DeMorgan's law

不是(A或B或C)=(非A)和(非B)和(不是C)

它也更容易去思考關於您何時考慮not not A = A,以便您需要的聲明是while not X其中X是對好的 ID的測試。

所以第一種情況下會轉化爲

not ((s[0] != "s") or (len(s) != 6) or (s[0] != "t")) 

上述子報表的任何的ID通行證是真實的,所以只是s[0] != "s"就足夠了。

在第二種情況下,

not((s[0] == "s" and len(s) == 6) or (s[0] == "t")) 

裝置的ID傳遞如果(s[0] == "s" and len(s) == 6)(學生條件)s[0] == "t"(教師標準)。

+1

感謝Shep的徹底解釋。 – alicew 2012-04-23 05:20:44

+0

@alicew沒問題,即使是有經驗的程序員也會遇到布爾邏輯,重要的是你花一些時間抓你的頭並且現在看它。 – Shep 2012-04-23 05:26:25

2

這是因爲將接受長度< 6.學生證的根據你的問題,學生證的必須是6個字符,包括S。另請注意,如果您嘗試輸入空字符串,則這兩個選項都會中斷。 s[0]將籌集IndexError

+0

感謝您的幫助! – alicew 2012-04-23 05:20:29