2016-07-10 198 views
1

我有一個程序用於在Windows上枚舉具有管理權限的用戶。我還想顯示存儲在名爲num_administrator的變量中的已找到的帳戶數。 我有以下的代碼:Python中的條件顯示字符串

if num_administrators > 1: 
    print("[*] {} accounts with administrative privileges found:\n".format(num_administrators)) 
    show_admins() 
elif num_administrators == 1: 
    print("[*] {} account with administrative privileges found:\n".format(num_administrators)) 
    show_admins() 
else: 
    print("[*] No accounts with administrative privileges found.\n") 

如果沒有管理員我想打印[*] No accounts with administrative privileges found. 如果有1名或多個管理員要顯示的消息幾乎是相同的,唯一的區別是根據編號顯示accountaccounts。這只是一個字母(s)的問題。 我是否可以通過使用唯一語句或以更簡單的方式實現條件打印? 是否可以打印出類似這樣:

print("[*] {} account".format(num_administrators) + if num_administrators > 1 "s" + "with administrative privileges found:\n") 

不要介意我上面的代碼,我不知道語法,如果我在做什麼是有意義的,它只是給你一個什麼樣的想法,我我在想,你可以告訴我它是否可行。

除了我打電話功能show_admins() 3次(用於打印管理員帳戶),但實際上我可以只在最後調用它一次,我猜。

+1

只需將縮進4個空格落後 - 你的elif和else從未持有,因爲他們是內如果。 – dmitryro

+0

@dmitryro如果是這樣的話,他會得到一個'SyntaxError'。如果沒有'if',你不能有'elif'。可能只是一個複製和粘貼錯誤。 – Bakuriu

+1

[Python條件字符串格式化]的可能重複(http://stackoverflow.com/questions/9244909/python-conditional-string-formatting) –

回答

2

這裏是一個狡猾的一個班輪我做:

"[*] {} account{} with administrative privileges found.\n".format("No" if num_administrators == 0 else str(num_administrators), "s" if num_administrators != 1 else "") 

附:至於可讀性,我不知道......我可能是錯的,但我覺得我的眼睛都在流血

+1

請不要這樣做;-) – IanAuld

+0

它當然不符合PEP 8:線太長(175> 79個字符),但我喜歡這個單線:) – Fabio

0

你可以做這樣的事情

if num_administrators > 1: 
     print "The total number of administrators is %d"%(num_administrators) 

,或者,如果你希望它是一個字符串:

if num_administrators > 1: 
     print "The total number of administrators is %s"%(str(num_administrators)) 

因此,這裏最簡單的方法是使用拉姆達:

l = lambda x:'No' if x == 0 else x 
print("[*] {} accounts with adminstrative priveleges".format(l(num_admin))) 
+0

你是對的,這是一種避免問題的方法全部一起。我仍然有興趣看到一種更加優雅的方式來實現我所問的問題。 – Fabio

+1

可能是lambda返回你否或數字是最簡單的方法來做到這一點。 – dmitryro

+0

我喜歡用lambda表達您的解決方案,因爲它簡潔且仍然可讀。還有另一種類似的方式,我發現使用條件語句。我想也考慮到這種情況num_admin == 1 – Fabio

1

如果你想要去的一個在線解決方案,即」已經在這裏回答了。不過,我建議你使用if/else語句,因爲這樣一來,該解決方案更可讀:

output = "[*] " 

if num_administrators > 1: 
    output += "{} accounts ".format(num_administrators) 
elif num_administrators == 1: 
    output += "1 account " 
else: 
    output += "No accounts " 

output += "with administrative privileges found:\n" 
+1

個人而言,我會先做if/else,然後通過格式進行格式化。 '「[*] {}找到管理權限:\ n」.format(account_string)'。這樣可以更容易地擴展消息。 – syntonym

0

我看了看dmitryro的解決方案,我想顯示使用拉姆達的根據條件不同的字符串。我也想考慮num_admin == 1的情況。我編輯的代碼,我得到這個:

l = lambda x:"No accounts" if x == 0 else ("accounts" if x > 1 else "account") 

然後我編輯了一下也print語句:

print("[*] {} {} with administrative privileges found".format(num_admin, l(num_admin))) 

我不得不增加一個佔位符{}顯示的號碼,我增加了一個參數num_adminformat()函數中。

現在,這幾乎是完美的,但還是有一個問題:

例如:

num_admin = 1我得到:[*] 1 account with administrative privileges found

num_admin == 2我得到:[*] 2 accounts with administrative privileges found

num_admin == 0我得到:[*] 0 No accounts with administrative privileges found

我想避免在句子前面顯示數字0,無論如何,我認爲我使我的生活變得複雜,並且仍然可以接受。除此之外,我認爲可讀性是一個重要方面。


我看了看一個星期五的回答再次,它實際上解決了這個問題:

我覺得其實

print("[*] {} account{} with administrative privileges found.\n".format("No" if num_administrators == 0 else str(num_administrators), "s" if num_administrators != 1 else ""))

似乎是一個完美的單班輪,雖然我同意可讀性可能是一個問題。這當然不符合PEP 8:line too long (175 > 79 characters).

我也是這樣的解決方案,因爲它避免了使用lambda和使用條件表達式,我認爲這是簡單的。

在這裏看到一個參考:

- Conditional expressions

- Is there an equivalent of C’s 」?:」 ternary operator?