就拿大量使用 List Comprehension 的 Python 做比较,
这些特性 Python 需要分为多个 List Comprehension 且外层嵌套逻辑来实现,比如产生这样的一个 List:
( Dart 的实现)
void main() {
print([
if (2 > 1) 222 else 333,
if (2 > 3) 444,
for (int i in Iterable.generate(10)) if (i % 3 == 1) i,
for (int i in Iterable.generate(10, (x) => x + 100)) if (i % 2 == 0) i
]);
}
output: [222, 1, 4, 7, 100, 102, 104, 106, 108]
https://dartpad.dev/540d15e9a25afb2159ee1b380e98d906
( Python 的实现)
print(
[if (2 > 1) 222 else 333] +
([444] if (2 > 3) else []) +
[i for i in range(10) if i % 3 == 1] +
[i + 100 for i in range(10) if (i + 100) % 2 == 0]
)
1
widewing 2020-03-09 03:42:34 +08:00 via Android
说真的,你真的觉得上面的比下面的舒服吗?
|
2
clockwise9 2020-03-09 07:06:01 +08:00 via Android
不懂 dart 但是懂一点 python,如果生产环境也这么用的话,会不会难 debug:咦这个函数已经调用过了为啥什么输出都没有?
|
3
noqwerty 2020-03-09 07:26:40 +08:00 via Android
没写过 Dart,但是从你这个例子里看不出来比 Python 优雅的地方
|
4
murmur 2020-03-09 07:45:58 +08:00 2
我认为生产环境写这两种代码都是要被打的
|
5
20015jjw 2020-03-09 07:47:52 +08:00 via Android
prod 你写个嵌套 list comp 不给你打断
|
6
kilasuelika 2020-03-09 07:52:26 +08:00 via Android
真要写起来舒服的话,Mathematica 比这两个得好得多。
但调试和查错的时候…………boom |
7
yech1990 OP |
8
Vegetable 2020-03-09 10:29:01 +08:00
你这个 python 他能跑吗?
[if (2 > 1) 222 else 333]不应该是[222 if 2>1 else 333]吗 |
9
widewing 2020-03-09 10:34:23 +08:00 via Android 1
@yech1990 你这说法让我想起 Perl.. TMTOWTDI ( There's more than one way to do it )
|
10
yech1990 OP @clockwise9
@noqwerty @murmur 可能是我没写明白,似乎大家都先入为主地讨论起语言的优雅性的问题,这个 dart 确实口碑不好。 我说的稳健性是指语法在应对用户各色各样的需求的时候,都提前考虑到了,不会触发奇怪的 bug。 再例如 string replacement, dart 里面 'test'.replaceAll 可以支持正则表达式,而 Python 就行,需要另外 import 包来实现。另外 Python 例如 "".replace("", s, n) 这种特例,结果这么多年一直是错的啊,知道最新的 alpha 版才得到修复。。。 |