Javascript的生成器函数要多加一个星号，Python却不需要额外标识，为什么这样设计？
一个Javascript的生成器函数是这样的：
```
function *gen(n) {
  for (let i = 0; i < n; i++) {
    yield i;
  }
}
[...gen(10)]
// <- (10) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
```
Javascript在声明的时候要多加一个星号。如果不加星号，会报`SyntaxError`。
一个python的生成器函数是这样的：
```
def gen(n):
  for i in range(n):
    yield i

>>> list(gen(10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
```
python在声明的时候不需要额外标识。直接用`yield`就行了。
两个语言都用了`yield`关键词，工作原理也几乎相同，甚至可以说Javascript就是抄的python。那为什么Javascript反而要多加一个星号呢？这个星号有什么意义？为什么要这样设计？是Javascipt太特殊，还是python太特殊？
我相信这应该是有原因的，毕竟ES2015的制定过程相当和谐（字面意义上的）
ES 一直以来在坚持的一个原则便是完全避免 breaking changes，毕竟用户的浏览器版本不是编程人员所能干涉的。如果用户的升级导致某些网站的旧代码失效了，组委会肯定会被喷死。这点和其他语言很不一样。因此 Compatibility 是首要原因，新版 ES 必须完全兼容旧版 ES。
Readability 和 Generality 其实都是产生的附加效果。Generality 其实是个伪需求，空 Generator 都可以被有 0 条或 1 条 yield 语句的 Generator 替代，而且后者可读性比前者更好。Readability 这点 ES 的确实比 Python 的要优秀，至少只阅读函数头我便可以知道这是个 Generator 还是 Normal Function，但优势只有在读长代码时才明显。仅凭这些不足以 diss Python 的设计。
而至于 Python 当年为什么沿用了 `def`，其实没有过多什么“意义”，仅仅是出于 Guido 的直觉而已:-)。