我想重构为一条线。像下面这样:
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子句似乎是多余的。有没有更好的方法来完成这个任务?
我想重构为一条线。像下面这样:
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子句似乎是多余的。有没有更好的方法来完成这个任务?
老校友的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)
:
你的两行版本很容易清晰。坚持下去。
>>> 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
这里发生了什么?如果你的经理写了它,你想找一个新的经理。如果你这样做了,也许你的经理会寻找一名新员工,因为这个程序在你度假时崩溃了。
我想这里发生的事情仍然会发生在两行版本中。 – kojiro 2015-03-03 03:57:46
这取决于哪一行会导致错误。 – 2015-03-03 04:24:12
你可能是对的。但你确定吗?这就是我想说的。错误在哪里? a,b,board,chr(),current_char? – 2015-03-03 04:30:28
做这类事情的更“Python化”的方法是:
board[a][b] = board[a][b] or chr(current_char)
+1这是正确的,但我不同意它是Pythonic。显然是Pythonic-ness的重要组成部分。平均维护程序员真的很明显当'或'操作符的操作数不是布尔值时应该这样操作吗? – kojiro 2015-03-03 03:55:43
如上所述,绝对不是“Pythonic”。看看我的例子。在两行版本中出现问题会更清楚。这个例子更像C,尽管我怀疑C程序员是否会提出这个建议。 – 2015-03-03 04:33:22
我们可以同意不同意,但很多被认为是“Pythonic”的东西是利用该语言的特征来获取常用模式的简洁表达。例如,Python的“真实性”经常被利用(包括我的解决方案)来减少额外的“噪音”(例如,如果len(some_list)!= 0 ... vs vs如果some_list ...)。在输入变量时显式使用变量更多的是C语言。利用“鸭子打字”的模式,你会在“Pythonic”程序中定期看到。从维护的角度来看哪一个更好是另一个争论。 – Balthamos 2015-03-04 00:41:46
可以在的Python做到这一点。
为什么你需要这样做?你的计算机在换行符上运行很慢吗? – Barmar 2015-03-03 02:41:37
@Barmar好一个大声笑。你曾经去过阿灵顿的Comellas吗? – Apollo 2015-03-03 02:42:21
是的,没有留下深刻的印象。看起来更适合那些可以利用他们的晚餐“喧闹”的家庭,我是单身。 – Barmar 2015-03-03 02:43:25