2016-07-10 207 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?