Shorter, more pythonic way of writing an if statement
我有这个
1 2 3 4 5 6
| bc = 'off'
if c.page == 'blog':
bc = 'on'
print bc |
有没有用Python写这篇文章的方法更像Python(和/或更短)?
- 你必须用"开"和"关"吗?这个信息可以用一个布尔值来表示吗,我的意思是bc=(c.page=‘blog’)更好。
最短的应该是:
1
| bc = 'on' if c.page=='blog' else 'off' |
一般来说,这可能看起来有点令人困惑,所以您应该只在清楚它的含义时使用它。不要将它用于大型布尔子句,因为它开始看起来很难看。
- 对于使用python 2.5及更高版本的软件来说,这是可以的。
- <2.5未提及兼容性问题;)
- 还值得一提。
- 我将不得不争论"最短"的要求(请看我的回答以获得较短的要求)。
- 最短可读时间:)
- 这是最短的,不一定更多的Python,几个月前我问过类似的问题:stackoverflow.com/questions/331767/python-style
- 更短的?也许吧。更多的Python?也许吧。更好?不。
- 最短的是:bc=c.page='blog'和'on'或'off',请参阅stackoverflow.com/questions/11880430/python inline if statem&zwnj;&8203;ent/&hellip中的示例;
- 实际上,bc=['off', 'on'][c.page=='blog']较短。
- 如果你有一个大的布尔子句,你应该把它保存到一个可读的变量名中,比如is-metric,并在内联条件中使用它,至少这对我来说是有效的。
- 虽然更短,但这是实现if-else语句的更有效的方法吗?
这是:
绝对更短
有争议的pythonic(在python 2.5之前,引入了有争议的X if Z else Y语法)
可读性有问题。考虑到这些警告,这里是:
1
| bc = ("off","on")[c.page=="blog"] |
。
编辑:根据请求,通用表单为:
1
| result = (on_false, on_true)[condition] |
。
说明:condition可以是任何计算为布尔值的值。然后将它作为一个整数处理,因为它用于索引元组:False == 0、True == 1,然后从元组中选择正确的项。
- 迷人的。和上面的另一个例子一样,你能再概括一下并解释一下吗?(如…你不是在开玩笑。
- ("off","on")是一个元组,c.page=="blog"计算所访问元素的索引。
- 我想投反对票,因为它真的很难看,然后我记得是我自己用的。
- 这是我在2.5不可用时使用的;我发现"和……或"不可接受,因为它读起来很奇怪,如果"和"值是不真实的,则失败。"(a,b)[cond]"的缺点是对a和b都进行了评估,因此不能依赖于快捷方式,这意味着如果item不是其他item.name,则无法转换类似"nothing"的构造。
- 我觉得这个很难读。我认为如果不是这样的话,条件表达式就更可读了。
- 我喜欢它,但与X if Z else Y相比,if Z是假的,我们只评估y而不是x,所以如果键不在字典中,它就失败了:adict[ k ] if adict.__contains( k ) else k。
- @斯特凡布的观察在这个特定的案例中并不重要,但在一般的案例中却是一个重要的点。
好吧,作为一个没有Python的人,请用大量的盐来处理这个问题,但是在多年来编写(并且,更困难的是,阅读)了很多聪明的代码之后,我发现自己现在对可读代码有着强烈的偏好。我知道了你最初的代码在做什么,即使我是一个无名小卒。当然,你可以把它藏起来,也许能给一个或两个Python怪留下深刻印象,但为什么呢?
- 我完全同意。为可读性而写!
- C人们使用I++。pythonic if可以用作明显条件的简写,如i++或i+=可以用作明显操作的简写。
- @弗雷克塞内特:我认为更好的比较是使用?:其他语言中用于短、简单--inline--conditionals的语句。而且,有争议的是,这些代码可以使代码更具可读性,而不是用不添加任何功能的额外行将代码弄乱。
- 仅供参考,"Python"是一个促进可读性而不是简洁的术语。
- 但是,一般来说,代码越短,可读性就越高。您可以做得太多,但如果其他条件相同,我希望代码中的令牌更少。特别是,如果说身体有副作用的话是很难理解的,因为这很难被忽略:如果不阅读整件事,你就不知道他们在触摸什么。C的三元或内联iffreiksenet提到没有这些问题:需要一些适应,但它是一种比原始分支更易于维护的样式。
- 我认为新的条件表达式是可读的。但是,我完全同意必须为可读性而写。
- 我倾向于使用较短的代码,因为只要不滥用构造,维护起来就容易。我今天刚用过这个:我用的不是if verbose: for value in list: process(value)",而是for value in list if verbose else []: process(value)。如果您不熟悉inline if else,则需要花费一秒钟的时间来解析它,但之后,它会变短并使用更少的缩进。
- 是的,为了可读性!
或者可以使用内联if语句:
1 2 3 4 5 6 7 8
| >>> cpage = 'blog'
>>> bc = 'on' if cpage == 'blog' else 'off'
>>> bc
'on'
>>> cpage = 'asdf'
>>> bc = 'on' if cpage == 'blog' else 'off'
>>> bc
'off' |
号
在这个博客上有一些关于这个功能的报道,相关的政治公众人物是政治公众人物308。在Python2.5中引入了内联if语句。
这个可能会少一点,但你可以用和/或这种方式:
1 2 3 4 5 6 7 8
| >>> cpage = 'asdf'
>>> bc = (cpage == 'blog') and 'on' or 'off'
>>> bc
'off'
>>> cpage = 'blog'
>>> bc = (cpage == 'blog') and 'on' or 'off'
>>> bc
'on' |
这个函数在lambda语句中比单独在一行中使用得更频繁,但是
。
类似于
1 2 3 4
| if A:
return B
else:
return C |
我本来打算写更长一点的解释,但他们在潜入Python时更详细地解释了这一点。他们还注意到了一些你可能需要知道的注意事项。
- 第二个看起来很困惑。你能把答案展开解释一下为什么它是这样工作的吗?
- 谢谢你的解释。它对我来说仍然是不可读的。我认为第一个选择更好。
- 第二个选项是人们在得到第一个选项之前使用的选项,在那些情况下,在一行中填充内容比可读性更重要。
- 第二个肯定在可读性方面得分很低。不是Python。
- 和/或方法曾经是在lambda中进行条件化处理的一种方法,直到pep308。参见PEP的前两段:python.org/dev/peps/pep-0308
- +1因为链接到PEP308,我试图找到它
另一种可能是使用dict,如果您可以计算访问它们的函数之外的值(即,这些值是静态的,也可以在scrible的答案注释中解决评估问题)。
1 2 3
| want_bc = {True:"on", False:"off"}
# ...
bc = want_bc[c.page =="blog"] |
我更喜欢这个和/或在"优先计算而不是测试"的一般准则下的元组索引解决方案。
你可以使用,
但是如果您使用的是2.5之前的Python版本,
1
| bc = c.page =="blog" and"on" or"off" |
。
也能做到这一点。