【问题标题】:conditional display of string in PythonPython中字符串的条件显示
【发布时间】:2016-07-10 20:29:28
【问题描述】:

我有一个程序用于枚举在 Windows 上具有管理权限的用户。我还想显示存储在名为num_administrator 的变量中找到的帐户数量。 我有以下代码:

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 个或多个 admins 显示的消息几乎相同,唯一的区别是 accountaccounts 根据数量显示。这只是一封信(s)的问题。 我可以仅通过使用独特的语句或以更简单的方式来实现条件打印吗? 是否可以打印类似的内容:

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

不要介意我上面的代码,我不知道我在做什么是否有意义的语法,这只是为了让你了解我在想什么,你可以告诉我它是否可行.

除了我调用函数show_admins() 3 次(用于打印管理员帐户),但实际上我猜我最后只能调用一次。

【问题讨论】:

  • 只需将缩进向后移动 4 个空格 - 你的 elif 和 else 永远不会保持在 if 内。
  • @dmitryro 如果是这样,他会收到SyntaxError。没有if,你就不能拥有elif。可能只是复制和粘贴错误。
  • ngettext 正是为此目的而设计的。
  • 你说得对,代码在 Stack Overflow 上的缩进效果不好,但在我的电脑上还可以。我编辑了这个问题。你能再看看这个问题,看看我在问什么吗? @dmitryro

标签: python string python-3.x if-statement printing


【解决方案1】:

这是我制作的一个巧妙的单线:

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

附:至于可读性,我不知道......我可能错了,但我觉得我的眼睛在流血

【讨论】:

  • 请永远不要这样做;-)
  • 它当然不符合 PEP 8:行太长(175 > 79 个字符)但我喜欢这种单行:)
【解决方案2】:

如果您想使用单线解决方案,这里已经回答了。但是,我建议使用 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"

【讨论】:

  • 就我个人而言,我会先执行 if/else,然后通过格式进行格式化,例如"[*] {} with administrative privileges found:\n".format(account_string)。这样更容易扩展消息。
【解决方案3】:

你可以这样做

 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))

所以这里最简单的方法是使用 lambda:

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

【讨论】:

  • 你是对的,这是一种避免问题的方法。我仍然有兴趣看到一种更优雅的方式来实现我所要求的。
  • 可能 lambda 会返回 No 或数字是最简单的方法。
  • 我喜欢你的 lambda 解决方案,因为它简洁且可读性强。我还发现了另一种类似的使用条件语句的方法。我还想考虑 num_admin == 1 的情况
【解决方案4】:

我查看了 dmitryro 的解决方案,我喜欢使用 lambda 根据条件显示不同的字符串。不过,我也想考虑num_admin == 1 的情况。我编辑了代码,我得到了这个:

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

然后我还编辑了一些打印语句:

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

我必须添加另一个占位符 {} 来显示数字,并且我在 format() 函数中添加了另一个参数 num_admin

现在差不多完美了,但还是有问题:

示例:

对于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,无论如何我认为我的生活复杂化了,它仍然可以接受。此外,我应该将可读性视为一个重要方面。


我又看了一下On a Friday的回答,它实际上解决了这个问题:

其实我觉得

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?

【讨论】:

    猜你喜欢
    • 2016-08-08
    • 2015-02-02
    • 2021-09-12
    • 1970-01-01
    • 2015-06-29
    • 1970-01-01
    • 1970-01-01
    • 2012-07-27
    • 1970-01-01
    相关资源
    最近更新 更多