【问题标题】:better way than using if-else statement in python [duplicate]比在 python 中使用 if-else 语句更好的方法 [重复]
【发布时间】:2012-07-14 13:42:02
【问题描述】:

可能重复:
Putting a simple if-then statement on one line

我正在研究一个 python 表达式,我希望该表达式被压缩而不是使用 if else 语句。

s = [1, 2, 3, 4]
if len(s)>5:
    print s.index(5)
else:
    print 'cant print'

有没有比使用 as if else 语句更好的方法?

【问题讨论】:

  • 似乎普遍认为 if/else 语句最好的写法。
  • 我只是在这里猜测,但似乎 OP 的意图是避免 if/elif/case/switch 丑陋。最终解决方案将是基于类的解决方案,其中案例选择是通过多态性完成的。这可以带来更简洁的代码。
  • 在最新的编辑之后,似乎 OP 只想进行范围检查...?
  • 是的,如果该索引存在,那么我只想找到该索引的那个元素
  • @don: 对不起,我试着用更简单的方式问。

标签: python if-statement


【解决方案1】:

在这种情况下,您可以使用 try/except 块:

try:
    print s.index(5)
except ValueError:
    print "5 not in list"

【讨论】:

  • 请问为什么?那就是使用它的“pythonic”! “不求许可,只求原谅!” - 你的 if 子句请求许可,然后按照它的要求去做。 try 语句就是这样做的,如果它失败了,它会处理宽恕部分。
  • 根据 OP 对问题本身的评论,他似乎实际上是指 s[5](这将使其成为 IndexError)。但我同意,这显然是 Pythonic 的拼写范围检查方式。
【解决方案2】:

另一种变化:

print len(s)>5 and 'y' or 'n'

只是为了完整性而添加的。不要在家里尝试这个! ;-)

【讨论】:

  • 我会给你考古价值的分数,但否则这种可怕性就是我们在语言中加入 if 表达式的原因。
  • @thebjorn 等等,有没有没有 if 表达式的 python 版本?
  • @Marcin if 表达式是在 2.5 中引入的,在此之前我们只有 if 语句 :-)
【解决方案3】:

简短,但非常模糊(不要这样做):

print 'ny'[len(s) > 5]

[edit] 你永远不应该这样做的原因是因为它使用了大多数人鲜为人知的语言属性,即 bool 是 int 的子类。在大多数情况下,您发现自己在编写像 OP 这样的代码,通常最好创建一个标志变量

s_is_long = len(s) > 5

然后您可以使用任何更合适的方式来编写打印,例如:

print 'y' if s_is_long else 'n'

print {True: 'y', False: 'n'}[s_is_long]

或者是最易读的……

if s_is_long:
    print 'y'
else:
    print 'n'

【讨论】:

  • 它是如何工作的? Python 是否在索引时将布尔值转换为整数?
  • 虽然在技术上是正确的,但这是一个糟糕的答案 IMO。对于许多人来说,乍一看很难理解。考虑到这个问题的答案最常被语言新手和/或一般编程新手阅读,我认为建议这样的结构不是一个好主意。
  • Python bool 是 int(在 isinstance 意义上——bool 是 int 的子类)。
  • @Bryan 请注意,我明确表示“不要这样做”,所以我不会称之为建议。
  • @thebjorn:虽然“(不要这样做)”总比没有好,但如果您花更多的精力解释为什么有人不应该这样做,您的答案会更好。请记住:观众大多是可能不知道为什么这是一个坏主意的人。这是你教育他们的机会。
【解决方案4】:

简洁明了:

s = [1, 2, 3, 4]
output = {True: 'y',False: 'n'}
print output[len(s) > 5]

【讨论】:

  • 没有反对您的解决方案,但我认为 OP 的原始代码在考虑到可读性时是“简短而清晰”的。
  • 你是对的,但我决定将其发布为避免 if-else 的“正确方法”,而不是指望一些可能会随着时间而改变的无证隐式转换。
  • zenopy 的解决方案简短、清晰且不失优雅 ;-)
  • @zenpoy 这是一个很好的理由(而且它肯定比公认的聪明和酷,但取决于 True/False 值的混淆代码更清晰)
  • @zenpoy 虽然bool 是一个int 的事实可能并不明显,但它既不是隐式转换(它是一个子类型)也不是无证的(参见 PEP 285 中的基本原理:python.org/dev/peps/pep-0285 )。但是,是的,它绝对是晦涩的 :-)
【解决方案5】:

你可以这样做:

s = [1, 2, 3, 4]
print 'y' if len(s) > 5 else 'n'

但是我认为这不会使代码更具可读性(一目了然)。还要注意ifelse 不会创建循环,它们只是控制流的语句。循环是使用forwhile 编写的。

【讨论】:

  • 同意,这符合 OP 的要求,但不会产生更可读的代码。 +1(不情愿因为混淆)
猜你喜欢
  • 1970-01-01
  • 2016-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多