2015-03-03 994 views
1

单行if语句 - Python的

我想重构为一条线。像下面这样:

board[a][b] = chr(current_char) if board[a][b] == 0 

看来,我可以来此最接近的是

board[a][b] = chr(current_char) if board[a][b] == 0 else board[a][b] 

但else子句似乎是多余的。有没有更好的方法来完成这个任务?

+4

为什么你需要这样做?你的计算机在换行符上运行很慢吗? – Barmar 2015-03-03 02:41:37

+0

@Barmar好一个大声笑。你曾经去过阿灵顿的Comellas吗? – Apollo 2015-03-03 02:42:21

+1

是的,没有留下深刻的印象。看起来更适合那些可以利用他们的晚餐“喧闹”的家庭,我是单身。 – Barmar 2015-03-03 02:43:25

回答

6

老校友的Python有一个窍门做三元的Python有一个三元运算符之前。实际上,这个技巧可以在许多编程语言中使用。我只会告诉你,如果你答应不使用它。

Promise?

[val_if_false, val_if_true][bool(condition)]

OK,现在Python有三元,它看起来像

val_if_true if condition else val_if_false 

但即使这样,是有点儿马虎。如果你真的想要一个班轮,做一个功能。

def val(): 
    if condition: 
     return val_if_true 
    else: 
     return val_if_false 

具体情况下是一个小更专业,因为你想要的else是原始值。你可以做

box[a][b] = box[a][b] or chr(current_char) 

但是,if语句再一次对于意图更具可读性和清晰性。如果你打算是把这个一行

if board[a][b] == 0: board[a][b] = chr(current_char) 

-1

你的两行版本很容易清晰。坚持下去。

>>> board[a][b] = board[a][b] or chr(current_char) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: an integer is required 

这里发生了什么?如果你的经理写了它,你想找一个新的经理。如果你这样做了,也许你的经理会寻找一名新员工,因为这个程序在你度假时崩溃了。

+0

我想这里发生的事情仍然会发生在两行版本中。 – kojiro 2015-03-03 03:57:46

+0

这取决于哪一行会导致错误。 – 2015-03-03 04:24:12

+0

你可能是对的。但你确定吗?这就是我想说的。错误在哪里? a,b,board,chr(),current_char? – 2015-03-03 04:30:28

2

做这类事情的更“Python化”的方法是:

board[a][b] = board[a][b] or chr(current_char) 
+1

+1这是正确的,但我不同意它是Pythonic。显然是Pythonic-ness的重要组成部分。平均维护程序员真的很明显当'或'操作符的操作数不是布尔值时应该这样操作吗? – kojiro 2015-03-03 03:55:43

+0

如上所述,绝对不是“Pythonic”。看看我的例子。在两行版本中出现问题会更清楚。这个例子更像C,尽管我怀疑C程序员是否会提出这个建议。 – 2015-03-03 04:33:22

+0

我们可以同意不同意,但很多被认为是“Pythonic”的东西是利用该语言的特征来获取常用模式的简洁表达。例如,Python的“真实性”经常被利用(包括我的解决方案)来减少额外的“噪音”(例如,如果len(some_list)!= 0 ... vs vs如果some_list ...)。在输入变量时显式使用变量更多的是C语言。利用“鸭子打字”的模式,你会在“Pythonic”程序中定期看到。从维护的角度来看哪一个更好是另一个争论。 – Balthamos 2015-03-04 00:41:46

2

可以在的Python做到这一点。